从零打造智能温湿度计:基于STM32+ESP8266+OneNet的完整物联网项目实战(附源码)

张开发
2026/4/14 9:25:45 15 分钟阅读

分享文章

从零打造智能温湿度计:基于STM32+ESP8266+OneNet的完整物联网项目实战(附源码)
从零打造智能温湿度计基于STM32ESP8266OneNet的完整物联网项目实战最近在工作室调试设备时发现传统温湿度记录仪存在数据无法远程查看、历史记录缺失等问题。这让我萌生了动手做一个低成本智能监测设备的想法。经过两周的摸索终于完成了一套基于STM32和ESP8266的物联网温湿度监测系统数据可实时上传至OneNet平台并通过微信小程序随时查看。整套方案硬件成本不到百元却实现了商业级监测设备的核心功能。这个项目特别适合想要学习完整物联网开发流程的创客朋友。不同于单纯的技术demo我们将从传感器选型、硬件连接、固件开发到云平台对接完整走通产品开发全流程。最终不仅能获得可实际使用的智能硬件更能掌握物联网项目开发的通用方法论。1. 硬件选型与电路设计1.1 核心器件选型指南选择硬件时需要考虑精度、功耗、成本三个关键因素。经过对比测试我最终确定了以下配置方案主控芯片STM32F103C8T6性价比最高的Cortex-M3内核MCU温湿度传感器DHT11±2℃精度±5%RH精度完全满足日常监测需求无线模块ESP-01S内置TCP/IP协议栈支持AT指令控制电源模块AMS1117-3.3V稳压芯片18650锂电池可连续工作72小时提示DHT11虽然精度一般但响应速度快1Hz采样率、价格低廉约5元非常适合入门项目。若需要更高精度可选用SHT30±0.2℃精度或BME280集成气压检测。1.2 电路连接详解整个系统的电路连接可分为三个部分传感器接口电路// DHT11连接示意图 VCC ---- 3.3V DATA --- PA1 (需接4.7K上拉电阻) GND ---- GNDESP8266通信电路// ESP-01S与STM32连接 ESP_TX -- PA10 (USART1_RX) ESP_RX -- PA9 (USART1_TX) CH_PD -- 3.3V VCC ---- 3.3V GND ---- GND电源管理电路18650电池通过TP4056充电模块供电AMS1117将电压稳定在3.3V添加100μF电容滤除电压波动2. 嵌入式固件开发2.1 传感器数据采集DHT11采用单总线协议时序控制是关键。下面给出经过验证的驱动代码#define DHT11_PIN GPIO_Pin_1 #define DHT11_PORT GPIOA void DHT11_Start(void) { GPIO_InitTypeDef gpio; gpio.GPIO_Pin DHT11_PIN; gpio.GPIO_Mode GPIO_Mode_Out_PP; gpio.GPIO_Speed GPIO_Speed_50MHz; GPIO_Init(DHT11_PORT, gpio); GPIO_ResetBits(DHT11_PORT, DHT11_PIN); Delay_ms(18); GPIO_SetBits(DHT11_PORT, DHT11_PIN); Delay_us(30); gpio.GPIO_Mode GPIO_Mode_IPU; GPIO_Init(DHT11_PORT, gpio); } uint8_t DHT11_ReadByte(void) { uint8_t data 0; for(int i0; i8; i) { while(!GPIO_ReadInputDataBit(DHT11_PORT, DHT11_PIN)); Delay_us(40); if(GPIO_ReadInputDataBit(DHT11_PORT, DHT11_PIN)) { data | (1(7-i)); while(GPIO_ReadInputDataBit(DHT11_PORT, DHT11_PIN)); } } return data; }2.2 ESP8266通信实现通过AT指令控制ESP8266需要特别注意以下几点每条AT指令后需添加\r\n作为结束符指令响应超时建议设置为2秒启用硬件流控可提高通信稳定性void ESP8266_SendCmd(char* cmd, char* ack) { USART_SendString(USART1, (uint8_t*)cmd, strlen(cmd)); USART_SendString(USART1, (uint8_t*)\r\n, 2); uint32_t timeout 2000; // 2秒超时 while(timeout--) { if(USART_GetFlagStatus(USART1, USART_FLAG_RXNE)) { char ch USART_ReceiveData(USART1); if(strstr(recv_buf, ack)) { return SUCCESS; } } Delay_ms(1); } return TIMEOUT; }3. OneNet平台配置3.1 设备接入配置在OneNet平台创建产品时这些参数需要特别注意参数项推荐值说明接入协议MQTT物联网最常用协议数据格式JSON可读性好扩展性强认证方式设备密钥比产品密钥更安全QoS等级1确保消息至少送达一次3.2 数据流与触发器设置创建温湿度数据流时建议采用以下JSON格式{ temp: 26.5, humi: 65.2, voltage: 3.78 }注意OneNet的MQTT主题格式为$sys/{PID}/{DEVNAME}/dp/post/json其中PID为产品IDDEVNAME为设备名称。4. 微信小程序开发4.1 数据接口调用通过OneNet提供的HTTP API获取设备数据wx.request({ url: https://api.heclouds.com/devices/your_device_id/datapoints, header: { api-key: your_api_key }, success(res) { console.log(res.data.data) } })4.2 实时数据展示使用ECharts实现动态曲线展示function initChart() { const option { tooltip: { trigger: axis }, legend: { data: [温度, 湿度] }, xAxis: { type: category, data: [00:00, 02:00, 04:00, 06:00, 08:00, 10:00] }, yAxis: { type: value, axisLabel: { formatter: {value} } }, series: [ { name: 温度, type: line, data: [26, 25, 24, 25, 26, 27], smooth: true }, { name: 湿度, type: line, data: [65, 66, 67, 68, 65, 64], smooth: true } ] }; myChart.setOption(option); }实际部署时发现ESP8266在长时间运行后容易出现断连问题。通过增加心跳包机制每5分钟发送PING请求和自动重连功能稳定性得到显著提升。完整项目代码已托管在Github包含STM32工程文件、小程序源码和3D打印外壳模型。

更多文章