智能家居监控——基于STM32与ESP8266-01S的温湿度数据及设备状态实时上传至阿里云物联网平台

张开发
2026/4/5 21:52:06 15 分钟阅读

分享文章

智能家居监控——基于STM32与ESP8266-01S的温湿度数据及设备状态实时上传至阿里云物联网平台
1. 项目背景与核心组件智能家居监控系统正逐渐成为现代家庭的标配而温湿度监测作为最基础的环境感知功能其实现成本和技术门槛已经大幅降低。这次我们要搭建的系统核心是利用STM32单片机作为主控配合ESP8266-01S WiFi模块将DHT11传感器采集的数据实时上传到阿里云物联网平台。这个方案最大的优势在于硬件成本不到50元却能实现商业级的数据监控效果。STM32F103C8T6是我最推荐入门的型号价格在10元左右72MHz主频完全够用。ESP8266-01S模块现在淘宝单价不到8元比一杯奶茶还便宜。DHT11温湿度传感器更是白菜价5块钱就能买到。这三个硬件组合起来就是典型的低成本高回报方案。我去年给父母家装的温室监控系统用的就是这个组合连续运行一年都没出过问题。2. 硬件连接与配置2.1 硬件接线详解先说说硬件连接这里有个坑我踩过两次。ESP8266-01S的供电一定要稳定最好单独用AMS1117-3.3稳压模块供电。我第一次直接用STM32的3.3V输出结果WiFi经常断连后来用万用表测量才发现负载大了电压会跌到2.9V。具体接线方案如下电源部分AMS1117-3.3的Vin接5V电源Vout接ESP8266的VCC和EN引脚GND共地连接所有模块信号线部分ESP8266的TX接STM32的PA3(RX)ESP8266的RX接STM32的PA2(TX)DHT11的DATA接STM32的PB5LED正极接STM32的PC13负极接220Ω电阻到GND这里特别注意ESP8266-01S的IO0引脚在正常运行时必须悬空或接高电平。我有次不小心把它接地了结果模块一直进入烧录模式排查了半天才发现问题。2.2 固件烧录实战ESP8266要连接阿里云必须烧录支持MQTT协议的AT固件。推荐使用安信可官方提供的v1.7.1版本这个版本我在多个项目中使用过稳定性最好。烧录步骤准备USB转TTL工具建议用CH340G芯片的便宜又好用按这个方式接线ESP8266的IO0接GND进入烧录模式VCC接3.3V注意电压要足TX/RX交叉连接USB转TTL下载安信可的烧录工具ESP_DOWNLOAD_TOOL配置烧录参数CrystalFreq: 26MSPI SPEED: 40MHzSPI MODE: DIOFLASH SIZE: 8Mbit选择固件文件地址填0x00000点击START开始烧录进度条走完就成功了烧录完成后记得把IO0从GND断开否则模块会一直处于烧录模式无法正常工作。可以用串口助手发送AT指令测试收到OK回应说明固件工作正常。3. 阿里云物联网平台配置3.1 产品与设备创建登录阿里云物联网平台在公共实例中创建新产品。关键配置项节点类型直连设备联网方式WiFi数据格式Alink JSON创建设备时会生成三元组信息ProductKey、DeviceName、DeviceSecret这三个参数要妥善保存后续代码中会用到。我建议新建一个文本文档专门存放这些敏感信息。3.2 物模型定义在功能定义标签页下添加两个属性温度属性标识符temperature数据类型float取值范围-20~60单位℃湿度属性标识符humidity数据类型float取值范围0~100单位%LED状态属性标识符led_status数据类型bool0表示关1表示开定义完成后点击发布上线这个步骤很多新手会忘记导致后续设备无法正常通信。4. STM32程序设计4.1 开发环境搭建使用Keil MDK进行开发需要安装STM32F1的Device Family Pack。工程配置要点定义全局宏USE_STDPERIPH_DRIVER设置优化等级为-O1勾选Use MicroLIB以减小代码体积硬件驱动层需要三个关键组件DHT11的驱动ESP8266的AT指令解析阿里云MQTT协议封装4.2 主程序逻辑主程序采用状态机设计核心逻辑如下while(1) { switch(current_state) { case INIT_STATE: // 初始化硬件和外设 init_hardware(); current_state WIFI_CONNECT_STATE; break; case WIFI_CONNECT_STATE: // 连接WiFi if(wifi_connect(你的WiFi名, 密码)) { current_state MQTT_CONNECT_STATE; } break; case MQTT_CONNECT_STATE: // 连接阿里云 if(mqtt_connect()) { current_state SENSOR_READ_STATE; } break; case SENSOR_READ_STATE: // 读取传感器数据 DHT11_ReadData(temperature, humidity); current_state DATA_UPLOAD_STATE; break; case DATA_UPLOAD_STATE: // 上传数据到阿里云 upload_to_aliyun(temperature, humidity, led_status); current_state COMMAND_CHECK_STATE; break; case COMMAND_CHECK_STATE: // 检查云端下发的控制命令 check_mqtt_message(); current_state SENSOR_READ_STATE; HAL_Delay(5000); // 5秒循环一次 break; } }4.3 关键函数实现WiFi连接函数bool wifi_connect(const char* ssid, const char* pwd) { send_at_command(ATCWMODE1); // 设置为STA模式 HAL_Delay(200); char cmd[128]; sprintf(cmd, ATCWJAP\%s\,\%s\, ssid, pwd); if(send_at_command_check(cmd, OK, 10000)) { return true; } return false; }MQTT连接函数bool mqtt_connect() { char cmd[256]; sprintf(cmd, ATMQTTUSERCFG0,1,\NULL\,\%s%s\,\%s\,0,0,\\, PRODUCT_KEY, DEVICE_NAME, DEVICE_SECRET); send_at_command(cmd); sprintf(cmd, ATMQTTCONN0,\%s.iot-as-mqtt.cn-shanghai.aliyuncs.com\,1883,1, PRODUCT_KEY); return send_at_command_check(cmd, OK, 5000); }数据上传函数void upload_to_aliyun(float temp, float humi, uint8_t led) { char payload[256]; sprintf(payload, {\params\:{\temperature\:%.1f,\humidity\:%.1f,\led_status\:%d}}, temp, humi, led); char topic[128]; sprintf(topic, /sys/%s/%s/thing/event/property/post, PRODUCT_KEY, DEVICE_NAME); char cmd[512]; sprintf(cmd, ATMQTTPUB0,\%s\,\%s\,1,0, topic, payload); send_at_command(cmd); }5. 系统调试与优化5.1 常见问题排查WiFi连接不稳定检查供电电压是否稳定尝试更换WiFi信道避开拥挤的2.4G频段在ATCWJAP命令后增加重试机制MQTT连接失败确认三元组信息是否正确检查设备时间是否同步阿里云需要正确的时间戳尝试在MQTT连接前先PING一下服务器地址数据上传失败检查物模型标识符是否匹配确认JSON格式是否正确特别是引号和逗号在阿里云控制台查看设备日志5.2 性能优化建议降低采样频率家庭环境温湿度变化较慢可以设置为30秒上传一次启用睡眠模式ESP8266在不传输数据时进入睡眠状态数据本地缓存网络异常时先存储数据恢复后批量上传采用二进制协议如果数据量大可以改用TLV格式替代JSON6. 功能扩展思路基础功能实现后可以考虑以下扩展方向多传感器融合增加光照传感器添加空气质量检测集成人体红外感应本地联动控制温湿度超过阈值自动开启空调检测到有人移动自动开灯与智能插座联动控制电器数据分析与可视化使用阿里云DataV制作仪表盘设置异常报警规则生成历史数据趋势图移动端应用开发微信小程序控制界面实现iOS/Android通知推送支持语音控制集成这个项目最让我满意的是它的可扩展性。去年我只做了温湿度监测后来逐步增加了光照感应、窗帘控制等功能全部基于同一套硬件平台。STM32的资源利用率还不到50%完全有能力承载更多智能家居功能。

更多文章