STM32F103C8T6接DHT11传感器,数据怎么用ZigBee和ESP8266传上云?一份保姆级配置流程

📅 2026/7/7 9:21:38 👁️ 阅读次数 📝 编程学习
STM32F103C8T6接DHT11传感器,数据怎么用ZigBee和ESP8266传上云?一份保姆级配置流程

STM32F103C8T6+DHT11+ZigBee+ESP8266物联网数据上云全链路实战

在智能农业大棚里,温湿度数据正经历一场奇妙的数字旅行:从DHT11传感器的引脚出发,穿越ZigBee无线网络,搭乘STM32的串口巴士,通过ESP8266的Wi-Fi高速公路,最终抵达云端服务器。这场跨越物理与数字世界的旅程,需要解决五个关键路标:

1. 硬件选型与电路设计

核心器件选型逻辑

  • STM32F103C8T6:性价比极高的Cortex-M3内核MCU,72MHz主频完全满足数据处理需求
  • DHT11:单总线数字输出温湿度传感器,±2℃精度适合大多数民用场景
  • CC2530 ZigBee模块:支持Z-Stack协议栈,传输距离可达100米(视环境)
  • ESP8266-01S:内置TCP/IP协议栈的Wi-Fi模块,支持Station模式连接路由器

电路连接要点(实测稳定配置):

连接节点引脚对应关系电压匹配方案
DHT11→CC2530DATA→P0_13.3V直连
CC2530→STM32TX→PA10(RX)3.3V电平兼容
STM32→ESP8266PA2(TX)→RX需电平转换至3.3V
ESP8266供电CH_PD接3.3V独立500mA LDO供电

关键提示:ESP8266启动瞬间电流可达300mA,务必单独供电避免STM32复位

2. ZigBee组网与数据透传

CC2530双模块配置采用Z-Stack的GenericApp示例工程修改:

// 终端设备(连接DHT11)关键代码 void GenericApp_HandleDHT11Data(void) { uint8_t temp = DHT11_ReadTemperature(); uint8_t humi = DHT11_ReadHumidity(); afAddrType_t dstAddr = {AddrBroadcast, PAN_ID_BROADCAST}; uint8_t payload[3] = {0xAA, temp, humi}; // 自定义协议头 AF_DataRequest(&dstAddr, &GenericApp_epDesc, GENERICAPP_CLUSTERID, 3, payload, 0, 0); }

协调器端需在串口初始化后添加:

void GenericApp_ProcessMSGCmd(uint8_t *msg) { if(msg[0] == 0xAA) { HalUARTWrite(0, msg, 3); // 通过UART0转发给STM32 } }

常见故障排查表

现象可能原因解决方案
协调器收不到数据PAN ID不一致检查zglobals.c中的PAN_ID设置
数据包丢失未启用ACK修改AF_DataRequest的options参数
串口乱码波特率不匹配统一设置为115200bps

3. STM32数据桥接处理

使用CubeMX配置USART1(PA9/PA10)和USART2(PA2/PA3):

// 在main.c中添加接收中断回调 void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if(huart->Instance == USART1) { // 来自ZigBee协调器 static uint8_t zbBuffer[32], zbIndex = 0; zbBuffer[zbIndex++] = rxByte; if(rxByte == '\n' || zbIndex >=32) { ProcessZigBeeData(zbBuffer); zbIndex = 0; } } } void ProcessZigBeeData(uint8_t* data) { if(data[0] == 0xAA) { char mqttMsg[64]; sprintf(mqttMsg, "{\"temp\":%d,\"humi\":%d}", data[1], data[2]); ESP8266_SendMQTT(mqttMsg); } }

USART配置关键参数

  • 波特率:115200
  • 字长:8bits
  • 停止位:1
  • 流控:None
  • 接收模式:中断模式

4. ESP8266 MQTT上云实战

以阿里云IoT平台为例的AT指令流程:

# 基础配置 AT+CWMODE=1 AT+CWJAP="your_ssid","your_password" AT+MQTTUSERCFG=0,1,"NULL","your_deviceName","your_deviceSecret" AT+MQTTCONN=0,"your_productKey.iot-as-mqtt.cn-shanghai.aliyuncs.com",1883,1 # 发布消息 AT+MQTTPUB=0,"/sys/your_productKey/your_deviceName/thing/event/property/post", "{\"params\":{\"Temperature\":25,\"Humidity\":50}}",1,0

稳定性优化技巧

  1. 添加看门狗定时器:每30秒发送AT指令维持连接
  2. 实现断线重连机制:
void ESP8266_CheckConnection(void) { if(HAL_GetTick() - lastHeartbeat > 30000) { if(AT_SendCommand("AT+PING=\"www.aliyun.com\"", "OK", 2000) != AT_OK) { ESP8266_Reconnect(); } lastHeartbeat = HAL_GetTick(); } }

5. 云端配置与Linux订阅

阿里云IoT平台创建产品的关键步骤:

  1. 产品功能定义中添加温湿度float类型属性
  2. 设备管理中创建设备并获取三元组
  3. 规则引擎配置数据流转到Topic

Linux端使用mosquitto_sub的实战命令:

mosquitto_sub -h your_productKey.iot-as-mqtt.cn-shanghai.aliyuncs.com \ -p 1883 -i your_clientId \ -u your_deviceName\&your_productKey \ -P your_deviceSecret \ -t "/sys/your_productKey/your_deviceName/thing/event/property/post" \ -v

数据解析脚本示例(Python版):

import paho.mqtt.client as mqtt import json def on_message(client, userdata, msg): payload = json.loads(msg.payload.decode()) print(f"当前温度: {payload['params']['Temperature']}℃") print(f"当前湿度: {payload['params']['Humidity']}%") client = mqtt.Client() client.username_pw_set("your_deviceName&your_productKey", "your_deviceSecret") client.connect("your_productKey.iot-as-mqtt.cn-shanghai.aliyuncs.com", 1883) client.subscribe("/sys/your_productKey/your_deviceName/thing/event/property/post") client.on_message = on_message client.loop_forever()

在完成所有环节部署后,建议先用逻辑分析仪抓取各接口信号波形,确认数据在各个环节的格式一致性。实际项目中,我在ESP8266的JSON数据封装处遇到过内存溢出问题,最终通过改用静态缓冲区+长度校验的方式解决。