ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

STM32+ESP8266+DHT11温湿度采集与OneNET云平台上报实战

STM32+ESP8266+DHT11温湿度采集与OneNET云平台上报实战 简介针对STM32F103ZET6与ESP8266接入OneNET云平台的温湿度上传项目这套资料包完整覆盖从硬件接线、固件烧录到云端配置与实物演示的全流程适合物联网入门开发者或参加智能物联类实验的学生快速复现。包内包含器件选型说明、ESP8266与DHT11的具体引脚连接RX接PA2、TX接PA3PB12接DHT11数据线、OneNET产品设备添加方法及常见问题汇总并附有基于B站教程的固件烧录参考路径。资源共289个文件压缩包58.82MB以C/H源码、Keil工程文件uvprojx/uvoptx、bin/hex固件、PDF说明和BMP接线图为主也包含编译中间文件与辅助配置便于直接编译下载或按需查阅。已有497人学习/浏览适合对照工程文件边看边练快速掌握单片机与云平台联调方法。1. 用小资源打穿OneNETESP8266到STM32ZET6的温湿度链路STM32F103ZET6跑RT-Thread或裸机点DHT11只是基本功但把数据上报到OneNET很多人卡在ESP8266的固件版本和AT指令握手时序上。这个项目从一颗ESP8266-01S、一块ZET6最小系统板加一个DHT11出发用固件文件和串口程序把温湿度数据稳定推到OneNET硬件成本不到50元适合还在校或刚切入智能物联的开发者。我拆过几个类似方案最值得借鉴的其实是固件选型和AT指令串口状态机的设计ESP8266只是透传管道STM32既要从DHT11读时序又要在HTTP POST和云平台APIKey之间做正确拼接任何一处超时都会导致数据点丢失。下文按器件选型、接线、烧录、代码和云端排错顺序展开所有操作都可在现有工程文件基础上复现。2. 选型与接线ESP8266-01S、ZET6串口资源与DHT11的电气匹配2.1 为什么是ESP8266-01S而不是NodeMCU或ESP32最小板STM32F103ZET6有丰富的串口、定时器和GPIO但本身没有Wi-FiESP8266在这里只承担透传角色。选ESP8266-01S而不是NodeMCU是因为它带板载PCB天线DTR/RST引脚便于用STM32的GPIO控制硬复位而且AT固件生态最成熟。NodeMCU虽然USB转串口方便但它的板载串口与LED占用了部分引脚用在ZET6方案里反而多一层不需要的硬件。ESP32也常被用来代替这套组合但如果你手里已经有ZET6学习板直接加一颗ESP8266-01S能把串口资源利用起来也更容易控制上报时序。2.2 六线接线与电平转换的关键点本项目接线是ESP8266-01S的VCC接3.3VGND接GNDRX接STM32F103ZET6的PA2USART2_TXTX接PA3USART2_RXRST接PA4。DHT11的VCC接5VGND接GNDOUT接PB12。注意ESP8266的GPIO0在运行时必须保持高电平或悬空所以图中GPIO0不接任何线。还要注意ESP8266-01S板载稳压芯片AMS1117-3.3.3实际可从5V供电但这个项目用户选择3.3V所以必须确认ZET6板卡的3.3V输出能力足够。ESP8266在Wi-Fi发射瞬间电流可达300mA如果ZET6的LDO较弱建议在3.3V处并联100uF电解电容。模块引脚连接目标说明ESP8266-01SVCCSTM32 3.3V注意峰值电流ESP8266-01SGNDSTM32 GND共地必须可靠ESP8266-01SRXPA2 (USART2_TX)交叉连接ESP8266-01STXPA3 (USART2_RX)交叉连接ESP8266-01SRSTPA4低电平复位DHT11VCC5V电源范围3.3-5.5VDHT11GNDGND共地DHT11OUTPB12单总线数据2.3 电平匹配与DHT11上拉电阻STM32F103ZET6的IO是3.3V TTL电平ESP8266-01S也是3.3V供电因此串口直连不需要分压。DHT11数据线建议接一个4.7kΩ到5V上拉虽然多数DHT11模块板载了上拉电阻但裸DHT11或某些兼容模块在长线下会波形畸变导致STM32读取时序失败。PB12设置为开漏输出或复用开漏再外加上拉是最稳妥的。我在实际调试中遇到低湿度读数异常就是DHT11数据线没接上拉电阻且PB12误配成了推挽输出。初始化时GPIO_Mode_Out_OD这样单总线协议在主机拉低和释放时电平依靠外部上拉恢复才能准确读取40bit数据。3. 烧录OneNET可用AT固件版本选择与验证3.1 区分DOUT 32Mbit和8Mbit先查Flash型号项目包里提供了Ai-Thinker_ESP8266_DOUT_32Mbit_v1.5.4.1-a_20171130.bin和Ai-Thinker_ESP8266_DOUT_8Mbit_v1.5.4.1-a_20171130.bin两套固件区别在于Flash容量。DOUT表示双IO输出模式这是ESP8266-01S最常见的flash模式。烧录前必须用安信可的flash_download_tool读取模块信息或者用AT指令ATRST后看boot信息判断容量。如果Flash是8Mbit(1MB)就烧8Mbit固件如果是32Mbit(4MB)就烧32Mbit固件。烧错固件会导致串口乱码或无法进入AT模式。固件版本1.5.4.1是官方比较稳定的AT版本对TCP透传的支持已经很成熟OneNET场景完全够用。3.2 烧录步骤地址映射与user2.bin使用ESPFlashDownloadTool硬件上把ESP8266-01S的GPIO0拉低RST触发一次上电复位进入UART下载模式。对应项目里的demo_cn.bin/demo_en.bin是原厂演示固件user2.bin是应用固件我们在量产时只需要烧写user2.bin部分。常见的烧录布局是对于32Mbit Flash地址0x00000烧写boot.bin地址0x01000烧写user2.bin地址0x3FC000烧写esp_init_data_default.bin对于8Mbit Flash把user2.bin烧到0x01000初始化数据放在0xFC000。但项目包里没有boot文件实际做法是直接烧Ai-Thinker_ESP8266_DOUT_...bin这个bin是完整AT固件配置为从0x00000开始烧写同时勾选SPI AUTO模式。烧录完成后断开GPIO0重新上电GPIO2应输出一个短暂低电平脉冲。提示如果模块一直无响应先检查串口是否是独立USB-TTL且TXD/RXD交叉连接很多烧录失败是模块与USB-TTL共地不良造成的。3.3 AT指令验证固件可用性烧录后用串口工具以115200-8-N-1连接发送AT回车收到OK即固件正常。然后依次执行ATCWMODE1 ATCWJAP你的SSID,你的密码 ATCIPMUX1 ATCIPSTART4,TCP,183.230.40.42,80逻辑说明ATCWMODE1设置Station模式让ESP8266连接外部Wi-FiATCIPMUX1开启多连接允许STM32建立多个TCP连接便于同时调试OneNET和本地日志ATCIPSTART4,...建立第4路TCP连接到OneNET的接入服务器执行成功后串口会返回CONNECT OK表示网络链路已通。参数说明OneNET旧平台HTTP接入地址是183.230.40.42端口80。如果是新版中移物联网OneNET则常用183.230.40.33或使用MQTT接入地址但AT固件场景下走HTTP最省事。注意这个IP不是固定不变的建议在云端控制台查看产品对应的接入地址避免因IP漂移导致连不上。4. STM32F103ZET6端代码DHT11采集与AT指令递推上报4.1 工程文件结构与关键模块项目工程文件工程文件.uvguix.Administrator是Keil5的工程你可以直接用STM32F103ZET6打开。代码里包含dht11.c、usart2.c、esp8266.c、onenet.c和main.c。在main.c中先把PB12初始化为开漏输出然后调用DHT11_Init()再配置USART2中断接收。为了不让ESP8266返回的无意义数据干扰主逻辑我一般会在USART2中断里做一个环形缓冲区只有当收到CLOSED或ERROR时才置位状态标志。4.2 DHT11读取时序与校验DHT11是单总线器件一次通信约4ms。STM32主机先拉低PB12约18ms然后释放并延时20us读取从机响应。响应信号是80us的低电平和80us的高电平之后连续40bit数据高位在前。代码实现时最忌讳用delay_us不精确的裸循环最好挂一个SysTick微秒延时或者用定时器输入捕获。这里给出核心读取代码uint8_t DHT11_ReadByte(void) { uint8_t value 0; for (uint8_t i 0; i 8; i) { value 1; // 主机释放总线等待低电平之后的第一个高电平 while (DHT11_PIN 0); delay_us(40); if (DHT11_PIN 1) { value | 1; } while (DHT11_PIN 1); } return value; }逻辑说明第一个while跳过50us低电平脉冲delay_us(40)是在高电平开始后延时40us再采样DHT11的0信号持续26-28us1信号持续70us所以延时40us再读电平均能正确区分0和1最后while (DHT11_PIN 1)等待该bit结束避免串位。参数说明这段代码假设PB12是开漏输入模式外部已接上拉。如果读到的湿度字节和温度字节的校验和不对通常是延时精度不够建议用定时器us延时替代粗糙的delay_us。4.3 ESP8266 AT命令状态机与OneNET HTTP上报在ZET6上我用一个简单的状态机管理ESP8266空闲态、连接Wi-Fi态、建立TCP态、发送数据HTTP态、等待响应态。上报一次温湿度数据需要拼接HTTP POST请求格式如下char buf[256]; sprintf(buf, POST /devices/%d/datapoints HTTP/1.1\r\n Host: api.heclouds.com\r\n api-key: %s\r\n Content-Length: %d\r\n \r\n {\datastreams\:[{\id\:\temp\,\datapoints\:[{\value\:%d}]}, {\id\:\humi\,\datapoints\:[{\value\:%d}]}]}, device_id, api_key, content_length, temp, humi);逻辑说明device_id是OneNET云端设备ID通常是一串数字api-key是用户创建的APIKey在OneNET控制台设备列表中生成Content-Length必须与实际POST body的ASCII字符数完全一致多一个空格都会导致云端响应400 Bad Request将temp和humi以整型写入JSON中OneNET接受整数数据。参数说明上面的Host写的是api.heclouds.com这是OneNET旧版接入域名。如果使用新版OneNET物联网开放平台建议用HTTPS或MQTT方式接入HTTP方式仍然可用但兼容性要自己验证。在AT指令下需要先把整个POST字符串拼好ATCIPSEND4,230 POST /devices/123456/datapoints HTTP/1.1...这里230是POST报文总长度必须和前面Content-Length保持一致否则ESP8266会等待输入直到超时。STM32发送完后OneNET会返回HTTP响应头一般看到Content-Length: 0或errno:0,error:succ即代表上报成功。4.4 AT指令超时与缓冲区设计ESP8266在Wi-Fi信号弱时ATCIPSTART可能几十秒都没有响应所以STM32端不能阻塞等待ACK。常见的坑是在HAL_UART_Transmit之后直接HAL_UART_Receive这会把主循环卡住导致DHT11下一次读取失败。我会在状态机里给AT指令加5秒超时超时则发送ATCIPCLOSE并且把Wi-Fi重连计数加一。此外OneNET的HTTP响应可能超过128字节如果串口接收缓冲区只有64字节会出现响应被截断后STM32误判失败。建议把接收缓冲区设为256字节并只在收到\r\n\r\n后开始解析。5. OneNET云端全流程与实战排错技巧5.1 注册产品、添加设备、生成APIKey在OneNET控制台选择多协议接入创建产品时选择HTTP协议系统会分配一个设备ID和APIKey。APIKey是一串十六进制字符串相当于设备的访问令牌。在设备详情页可以添加数据流比如temp和humi。创建设备时注意记录设备ID代码里sprintf中的%d要用这个ID。如果后面用MQTT方式则需要生成访问token但HTTP方式只需APIKey。每一步完成后都可以用控制台的在线调试模拟数据提前验证APIKey没有写错。5.2 上传数据后如何在云端查看设备上传数据后控制台的数据流页面会显示最新数据点。打开数据流列表选择temp和humi点击查看折线图就能看到温湿度曲线。如果发现数据点间隔不均匀说明网络抖动导致了丢包可以适当延长上报周期。OneNET免费版对数据点频率有一定限制过于频繁的上报会导致部分数据被丢弃。工业生产场景建议把DHT11采集周期设为10秒上传周期设为30秒既能反映变化又不会触发限流。5.3 用MQTTX反向验证OneNET数据点格式再上板这是一个提升联调效率的技巧在STM32写上报代码之前先用MQTTX设备测试工具连接OneNET的MQTT接入地址把要上报的JSON逐个字段发一遍端到端确认云端能解析数据流。OneNET MQTT接入地址通常是183.230.40.96端口1883client_id填设备ID用户名填设备ID密码填apikey。订阅$sys/{pid}/{device_id}/dp/post/json/ack主题再发布{datastreams:[{id:temp,datapoints:[{value:25}]},{id:humi,datapoints:[{value:60}]}]}如果发布后收到ack主题的消息说明JSON格式和权限均无误。这种做法的价值在于把云端问题与STM32串口问题彻底分离如果MQTTX发布成功但板子发数据失败问题一定出在AT指令或缓冲区如果MQTTX也收到错误码就先改云端配置。等MQTTX验证通过再把这个JSON原样嵌入sprintf板子一次上电就能通。5.4 现场问题汇总与快速定位在串口调试助手中如果发完HTTP POST后没有收到任何数据先检查ATCIPMUX1是否生效以及ATCIPSEND中连接号是否是建立TCP时使用的连接号。若收到CLOSED通常是OneNET服务器主动断开检查APIKey是否带有不可见字符。还有一种情况是ESP8266的RST引脚由PA4控制初始化时把PA4拉低超过100ms会触发硬复位如果代码在每秒循环里误触发RSTWi-Fi模块就会反复重启导致连接失败。把RST拉高后延时500ms再执行AT测试即可稳定。本文还有配套的精品资源点击获取
返回列表