做一个“有思想的插排”--APP控制设备

本文详细介绍了如何通过APP控制设备,包括SoC程序的深入解析,演示了如何在nodemcu上获取设备log,添加继电器控制函数,以及整个编译和烧录过程。通过实际操作,实现了设备开关的远程控制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

APP控制设备

SoC程序详解

对程序不是很了解的,可以去看一下机智云官方文档中心的 GoKit-SoC程序详解

获取设备log

在这里插入图片描述
官方SoC固件中,使用TXD1打印输出Log日志。
我是用的是nodemcu,所以按照引脚图,使用usb转串口工具,打印Log如下:
在这里插入图片描述

打开APP,连接上设备,按下switch开关,打开开关,可以看到下图:

注意红框中显示当前时间的为一个开关状态,状态值为1,即打开开关状态。

在这里插入图片描述

根据官方教程,可以找到事件执行函数,在此处可以看到打印语句。
接下来添加继电器控制函数

/app/driver/下创建hal_switch.c文件,添加以下代码。

#include "driver/hal_switch.h"


void ICACHE_FLASH_ATTR switchInit(void)
{
	PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U,FUNC_GPIO12);
	PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTCK_U,FUNC_GPIO13);

	gpio_output_set(0,0,GPIO_ID_PIN(Relay1)|GPIO_ID_PIN(Relay2),0);
	os_printf("switchGpioInit \r\n");
}

/app/Gizwits/gizwits)product.c中,添加以下代码:

#include "driver/hal_switch.h"

在这里插入图片描述

上图中,是响应APP的switch按钮的事件,控制继电器的开断。

/app/include/中添加hal_switch.h,文件中填写如下内容:

#ifndef __HAL_SWITCH_H__
#define __HAL_SWITCH_H__

#include <stdio.h>
#include <c_types.h>
#include <gpio.h>
#include "os_type.h"
#include "osapi.h"

#define Relay1                              12
#define Relay2                              13

#define Relay1_ON()                 		GPIO_OUTPUT_SET(GPIO_ID_PIN(Relay1),1)
#define Relay1_OFF()                		GPIO_OUTPUT_SET(GPIO_ID_PIN(Relay1),0)
#define Relay2_ON()                        	GPIO_OUTPUT_SET(GPIO_ID_PIN(Relay2),1)
#define Relay2_OFF()                		GPIO_OUTPUT_SET(GPIO_ID_PIN(Relay2),0)

void ICACHE_FLASH_ATTR switchInit(void);

#endif

所有文件保存之后,打开编译环境,准备编译。

在这里插入图片描述
进入app路径,执行./gen_misc.sh,等待编译完成。
在这里插入图片描述
编译完成,准备烧录,观察现象

烧录程序

在共享目录中,将生成的程序烧录到ESP8266中,按照之前的烧录方法就可以。
在这里插入图片描述

烧录完成之后,使用APP连接设备。设备端注意要连接继电器观察现象,我使用的是PGIO12,,即D5引脚。
点击switch打开和关闭,继电器有动作。

设备端源码

源码里有可使用的.bin文件,可以直接下载使用。app使用机智云官方app就可以。

基本上一个插排就完成了

第一次写一个完整的东西,描述不清之处,请大家给我留言,一起探讨。

我选用的是普通的触点继电器,用来控制AC220V电压,貌似不同,后来换成固态继电器,就可以使用了

<think>我们使用STM32WLECBU6芯片设计一个智能物联网,重点在于电流检测和状态监控,并通过LoRa无线传输数据。 主要功能: 1. 实时检测各孔的电流(使用电流互感器) 2. 设备状态监控(如开关状态、功率、电能等) 3. 通过LoRa将数据上传至服务器 4. 支持远程控制(通过服务器下发指令控制开关) 硬件设计要点: - 电流检测:使用电流互感器(如TA12-100)将大电流转换为小电流,再通过取样电阻转换为电压,由ADC采集。 - 电压检测:通过电阻分压网络,由ADC采集。 - 开关控制:使用继电器控制孔的通断。 - 主控:STM32WLECBU6,负责采集、计算、控制和通信。 软件设计要点: 1. ADC采集电流和电压,计算功率、电能等。 2. 定时采集和状态检测,同时支持事件触发(如过流保护)。 3. LoRa通信,采用LoRaWAN协议或自定义协议上传数据。 4. 接收远程指令,控制继电器。 以下是一个简化的代码框架(基于STM32 HAL库): ```c #include "stm32wlxx_hal.h" // 定义ADC通道 #define ADC_CHANNEL_CURRENT ADC_CHANNEL_1 // 电流检测ADC通道 #define ADC_CHANNEL_VOLTAGE ADC_CHANNEL_2 // 电压检测ADC通道 // 定义继电器控制引脚 #define RELAY1_GPIO_Port GPIOA #define RELAY1_Pin GPIO_PIN_0 // 电流互感器参数 #define CT_RATIO 1000.0 // 互感器变比(例如1000:1) #define BURDEN_RESISTOR 10.0 // 取样电阻(欧姆) #define ADC_REF_VOLTAGE 3.3 // ADC参考电压 #define ADC_RESOLUTION 4096.0 // 12位ADC // 全局变量 ADC_HandleTypeDef hadc; UART_HandleTypeDef huart1; SUBGHZ_HandleTypeDef hsubghz; // 函数声明 void SystemClock_Config(void); void ADC_Init(void); void SUBGHZ_Init(void); float Read_Current(void); float Read_Voltage(void); void Control_Relay(uint8_t relay_num, uint8_t state); int main(void) { HAL_Init(); SystemClock_Config(); ADC_Init(); SUBGHZ_Init(); float current, voltage, power; uint8_t relay_state = 0; while (1) { // 1. 读取电流和电压 current = Read_Current(); voltage = Read_Voltage(); power = current * voltage; // 2. 状态检测(例如过流保护) if (current > 10.0) { // 假设10A为过流阈值 Control_Relay(1, 0); // 关闭继电器1 relay_state = 0; } // 3. 构造LoRa数据包并发送(简化示例) char buffer[50]; snprintf(buffer, sizeof(buffer), "%.2fA,%.2fV,%.2fW", current, voltage, power); HAL_SUBGHZ_Send(&hsubghz, (uint8_t *)buffer, strlen(buffer), 1000); // 4. 检查是否收到控制指令(简化示例) uint8_t rx_buffer[10]; if (HAL_SUBGHZ_Receive(&hsubghz, rx_buffer, sizeof(rx_buffer), 100) == HAL_OK) { if (rx_buffer[0] == '1') { Control_Relay(1, 1); // 开启继电器1 relay_state = 1; } else if (rx_buffer[0] == '0') { Control_Relay(1, 0); // 关闭继电器1 relay_state = 0; } } HAL_Delay(5000); // 每5秒采集并发送一次 } } // 读取电流值(单位:安培) float Read_Current(void) { HAL_ADC_Start(&hadc); HAL_ADC_PollForConversion(&hadc, 10); uint32_t adc_value = HAL_ADC_GetValue(&hadc); float voltage_adc = (adc_value / ADC_RESOLUTION) * ADC_REF_VOLTAGE; // 计算电流:根据互感器变比和取样电阻,电流=电压_adc / (取样电阻) * 变比 // 注意:实际电路可能需要校准系数 return (voltage_adc / BURDEN_RESISTOR) * CT_RATIO; } // 控制继电器 void Control_Relay(uint8_t relay_num, uint8_t state) { if (relay_num == 1) { HAL_GPIO_WritePin(RELAY1_GPIO_Port, RELAY1_Pin, state ? GPIO_PIN_SET : GPIO_PIN_RESET); } // 其他继电器... } // ADC初始化 void ADC_Init(void) { ADC_ChannelConfTypeDef sConfig = {0}; hadc.Instance = ADC1; hadc.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1; hadc.Init.Resolution = ADC_RESOLUTION_12B; hadc.Init.ScanConvMode = ADC_SCAN_DISABLE; hadc.Init.ContinuousConvMode = DISABLE; hadc.Init.DiscontinuousConvMode = DISABLE; hadc.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; hadc.Init.ExternalTrigConv = ADC_SOFTWARE_START; hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT; hadc.Init.NbrOfConversion = 1; hadc.Init.DMAContinuousRequests = DISABLE; hadc.Init.EOCSelection = ADC_EOC_SINGLE_CONV; HAL_ADC_Init(&hadc); // 配置电流检测通道 sConfig.Channel = ADC_CHANNEL_CURRENT; sConfig.Rank = ADC_REGULAR_RANK_1; sConfig.SamplingTime = ADC_SAMPLETIME_247CYCLES_5; HAL_ADC_ConfigChannel(&hadc, &sConfig); } // LoRa初始化(简化) void SUBGHZ_Init(void) { hsubghz.Instance = SUBGHZ; hsubghz.Init.BaudratePrescaler = SUBGHZSPI_BAUDRATEPRESCALER_4; if (HAL_SUBGHZ_Init(&hsubghz) != HAL_OK) { Error_Handler(); } // 配置LoRa参数(频段、扩频因子、带宽等) SUBGHZ_RadioSetLoRaSymbNumTimeout(&hsubghz, 0); // 更多配置... } ``` ### 设计注意事项: 1. **电流检测精度**: - 使用高精度取样电阻(如0.1%精度) - ADC采集前加入运算放大器放大信号 - 软件校准(零点校准、增益校准) 2. **电气安全**: - 电流互感器必须隔离高压 - 继电器选型要符合负载要求(如10A/250VAC) - 加入保险丝和过压保护电路 3. **低功耗优化**: - 利用STM32WLECBU6的低功耗模式,在空闲时进入Stop2模式 - 使用定时器唤醒采集数据,采集后立即进入低功耗 4. **通信协议**: - 采用LoRaWAN协议接入公共网络(如TTN) - 或使用私有LoRa协议直接与网关通信 5. **固件安全**: - 启用STM32WLECBU6的安全启动(Secure Boot)和加密存储 - 对远程控制指令进行签名验证 §§相关问题§§ 1. 如何校准电流互感器以提高测量精度? 2. 在LoRa通信中,如何平衡数据传输速率和功耗? 3. STM32WLECBU6如何实现多路继电器控制与状态检测? 4. 智能的过流保护机制如何设计才能确保安全? 5. 如何利用STM32WLECBU6的双核架构优化智能性能?</think>### 基于STM32WLECBU6的智能物联网设计方案 #### 核心功能架构 ```c // 系统主框架 (基于STM32CubeWL) #include "stm32wlxx_hal.h" #include "subghz.h" // 硬件配置 #define CT_PIN GPIO_PIN_0 // 电流互感器ADC输入引脚 #define RELAY_PIN GPIO_PIN_1 // 继电器控制引脚 #define LED_PIN GPIO_PIN_2 // 状态指示灯 // 全局变量 ADC_HandleTypeDef hadc; SUBGHZ_HandleTypeDef hsubghz; int main(void) { HAL_Init(); SystemClock_Config(); MX_ADC_Init(); MX_SUBGHZ_Init(); while (1) { // 1. 电流实时检测 float current = Read_Current(); // 获取电流值 // 2. 设备状态分析 DeviceState state = Analyze_Device_Status(current); // 3. LoRa数据传输 Send_LoRa_Data(current, state); // 4. 过载保护控制 if(state == OVERLOAD) { HAL_GPIO_WritePin(GPIOA, RELAY_PIN, GPIO_PIN_RESET); // 切断电源 } HAL_Delay(1000); // 1秒采样周期 } } ``` #### 关键硬件设计 | **模块** | **选型建议** | **接口方式** | |----------------|----------------------------|----------------------| | 电流检测 | SCT-013-000互感器 | ADC采样 (0-3.3V) | | 电压检测 | 电阻分压网络 (100kΩ:10kΩ) | ADC采样 | | 继电器控制 | HF46F/5VDC 10A继电器 | GPIO控制 | | 通信模块 | 板载SUB-GHz射频前端 | SPI接口 | | 电能计量 | HLW8032电能计量芯片 | UART通信 | #### 软件实现要点 1. **电流检测算法** ```c float Read_Current(void) { HAL_ADC_Start(&hadc); HAL_ADC_PollForConversion(&hadc, 10); uint32_t adc_val = HAL_ADC_GetValue(&hadc); // 电流计算: I = (ADC值 * 3.3 / 4096 - 1.65) / 0.066 // SCT013-000(100A)输出66mV/A,经运放放大到0-3.3V return ((adc_val * 0.000805) - 1.65) / 0.066; } ``` 2. **设备状态机** ```c typedef enum { POWER_OFF, // 设备断电 STANDBY, // 待机状态(<0.1A) NORMAL_OPER, // 正常工作(0.1-5A) OVERLOAD, // 过载状态(>5A) FAULT // 故障状态 } DeviceState; DeviceState Analyze_Device_Status(float current) { static uint8_t overload_count = 0; if(current < 0.1) return POWER_OFF; if(current > 5.0) { if(++overload_count > 3) return OVERLOAD; // 连续3次过载触发保护 } else { overload_count = 0; } return (current > 0.5) ? NORMAL_OPER : STANDBY; } ``` 3. **LoRa数据传输** ```c void Send_LoRa_Data(float current, DeviceState state) { uint8_t tx_buffer[12]; // 数据包结构: [电流x4][状态x1][校验x1] memcpy(tx_buffer, &current, 4); tx_buffer[4] = (uint8_t)state; tx_buffer[5] = Calculate_CRC(tx_buffer, 5); HAL_SUBGHZ_Transmit(&hsubghz, tx_buffer, 6, 1000); } ``` #### 低功耗优化策略 1. **电源管理** ```c void Enter_Low_Power_Mode(void) { if(Get_Device_State() == STANDBY) { // 切换至Stop2模式 (仅保留SRAM) HAL_PWR_EnterSTOP2Mode(PWR_STOPENTRY_WFI); // 唤醒后自动恢复 SystemClock_Config(); } } ``` 2. **动态采样频率** - 待机状态:60秒采样一次 - 正常状态:1秒采样一次 - 过载状态:100ms高速采样 #### 安全保护机制 1. **三级过载保护** - 一级:>5A持续10秒 → 状态警告 - 二级:>8A持续3秒 → 本地断电 - 三级:>15A → 立即熔断保护 2. **固件安全** - 启用STM32WLECBU6的硬件加密引擎(AES-256) - 实现安全启动(Secure Boot)和远程OTA签名验证 #### 典型应用场景 ```mermaid graph LR A[智能] -->|实时电流检测| B(STM32WLECBU6) B --> C{状态分析} C -->|正常| D[LoRa上传云平台] C -->|过载| E[本地继电器切断] C -->|故障| F[LED报警+云端通知] D --> G[手机APP/云平台] G --> H[远程控制通断] ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值