不用ZigBee,用ESP8266+51单片机+DHT11打造低成本物联网温湿度监测站(附完整代码)

发布时间:2026/6/4 5:32:02

不用ZigBee,用ESP8266+51单片机+DHT11打造低成本物联网温湿度监测站(附完整代码) ESP826651单片机DHT11构建低成本物联网温湿度监测系统在智能家居和工业监控领域温湿度监测一直是基础而重要的需求。传统方案常采用ZigBee等专用无线协议但随着WiFi模块成本下降和物联网平台普及基于ESP8266的解决方案正成为更优选择。本文将详细介绍如何用51单片机搭配DHT11传感器通过ESP8266模块实现数据上云打造一个成本不足50元的远程监测系统。1. 硬件选型与连接方案1.1 核心组件介绍DHT11温湿度传感器作为系统感知层核心虽然精度(±2℃, ±5%RH)不及高端型号但其单总线协议和3.3V-5V宽电压支持使其成为入门级项目的理想选择。与DHT12相比DHT11无需考虑I2C协议兼容问题接线更加简单。STC89C52单片机作为主控制器通过P3.6引脚与DHT11连接。其内置UART接口可直接与ESP-01S模块通信无需额外电平转换芯片。实测表明在12MHz晶振下该单片机能够稳定处理传感器数据并控制无线模块。ESP-01S WiFi模块是系统的网络接入点支持802.11 b/g/n协议内置TCP/IP协议栈。与ZigBee方案相比它直接连接路由器省去了协调器设备整体成本降低约60%。1.2 硬件连接细节完整接线方案如下表示设备引脚连接目标备注DHT11 DATA单片机P3.6需接4.7K上拉电阻DHT11 VCC5V电源DHT11 GND共地ESP8266 TX单片机P3.0(RXD)需电平转换至3.3VESP8266 RX单片机P3.1(TXD)需电平转换至3.3VESP8266 CH_PD3.3V使能引脚ESP8266 VCC3.3V稳压输出需确保电流≥300mA注意ESP8266模块必须使用独立3.3V稳压供电直接使用单片机IO口的3.3V输出会导致工作不稳定。2. 固件开发与AT指令控制2.1 单片机端数据采集DHT11的数据采集遵循严格的时序协议。以下是优化后的采集代码片段void DHT11_Start() { DATA 1; delay_us(2); DATA 0; delay_ms(20); // 保持低电平18ms以上 DATA 1; delay_us(30); while(!DATA); // 等待传感器响应 while(DATA); // 等待低电平开始信号 } uchar DHT11_ReadByte() { uchar dat 0; for(int i0; i8; i) { while(!DATA); // 等待50us低电平结束 delay_us(40); dat 1; if(DATA) dat | 1; // 高电平持续时间决定数据位 while(DATA); // 等待位周期结束 } return dat; }2.2 ESP8266通信协议设计通过串口发送AT指令配置ESP8266时需要特别注意响应超时处理。建议采用分层状态机设计初始化阶段ATCWMODE1设置STA模式ATCWJAPSSID,PASSWORD连接WiFiATCIPSTARTTCP,thingsboard.io,1883建立TCP连接数据传输阶段ATCIPSEND长度发送数据长度等待提示符后发送实际数据检查SEND OK响应void ESP_SendCmd(const char* cmd, const char* expect, uint16_t timeout) { UART_SendString(cmd); uint32_t start SysTick; while((SysTick - start) timeout) { if(UART_ReceiveString(buffer)) { if(strstr(buffer, expect)) return SUCCESS; if(strstr(buffer, ERROR)) return FAILURE; } } return TIMEOUT; }3. 物联网平台接入方案3.1 ThingsBoard平台配置ThingsBoard提供免费社区版支持MQTT和HTTP协议接入。设备接入流程如下在租户设备页面创建设备记录ACCESS_TOKEN使用MQTT协议发布JSON格式数据{temperature:25.5, humidity:60}配置仪表盘展示温湿度曲线和报警阈值3.2 本地Web服务器方案对于需要内网部署的场景可基于Python搭建简易接收服务from flask import Flask, request app Flask(__name__) app.route(/sensor, methods[POST]) def sensor_data(): temp request.form.get(temp) humid request.form.get(humid) # 存入数据库或转发 return OK if __name__ __main__: app.run(host0.0.0.0, port8080)对应的单片机端HTTP请求构造char http_request[128]; sprintf(http_request, POST /sensor HTTP/1.1\r\n Host: 192.168.1.100:8080\r\n Content-Type: application/x-www-form-urlencoded\r\n Content-Length: %d\r\n\r\n temp%.1fhumid%.1f, strlen(data), temperature, humidity);4. 系统优化与扩展功能4.1 低功耗设计技巧使用ATGSLP3000让ESP8266进入深度睡眠单片机掉电模式配合外部中断唤醒优化DHT11采样间隔建议≥2秒电源管理电路设计[5V输入] - [AMS1117-3.3] - [ESP8266] - [HT7333] - [单片机DHT11]4.2 报警功能实现在物联网平台配置报警规则外本地也可实现基础报警void CheckAlarm(float temp, float humid) { if(temp 30.0 || humid 80.0) { P1 | 0x01; // 触发报警输出 SendATCommand(ATCMGS\13800138000\, , 1000); UART_SendString(高温高湿警报); UART_SendByte(0x1A); // CTRLZ发送 } }4.3 多传感器组网方案通过修改采集点ID实现多节点识别#define NODE_ID 1 // 不同节点设置不同ID void SendData() { char packet[32]; sprintf(packet, ID%dT%.1fH%.1f, NODE_ID, temperature, humidity); ESP_SendTCP(packet); }实际部署时建议采用模块化供电设计每个监测节点包含主控板单片机ESP8266传感器模块18650锂电池TP4056充电电路防水外壳IP65等级这种组合在室内环境下可连续工作3-6个月特别适合农业大棚、仓库等场景的分布式监测需求。

相关新闻