从零打造智能温湿度监测系统STM32F103与微信小程序的深度整合在智能家居和物联网技术蓬勃发展的今天温湿度监测已成为许多场景的基础需求。无论是家庭环境监控、农业大棚管理还是工业设备维护实时获取环境数据都至关重要。本文将带领读者从硬件选型到软件实现完整构建一个基于STM32F103微控制器、DHT11传感器和ESP8266无线模块的智能监测系统并通过MQTT协议将数据推送至微信小程序实现远程可视化监控。1. 项目整体架构设计智能温湿度监测系统的核心在于数据的采集、传输和展示三个环节。我们采用模块化设计思路将系统划分为以下三个层次感知层STM32F103作为主控芯片负责采集DHT11传感器的温湿度数据传输层ESP8266 WiFi模块建立网络连接通过MQTT协议将数据上传至云端应用层微信小程序作为用户界面实时显示并分析环境数据这种分层架构不仅清晰明了也便于后期功能扩展。例如未来可以轻松添加更多传感器类型或更换不同的显示终端。提示MQTT协议因其轻量级和低功耗特性特别适合物联网设备使用。它采用发布/订阅模式能有效降低网络带宽消耗和设备资源占用。2. 硬件准备与电路连接2.1 核心元件选型指南选择适合的硬件组件是项目成功的第一步。以下是经过实际验证的元件组合组件名称型号规格主要功能参考价格主控芯片STM32F103C8T6系统控制与数据处理15-20温湿度传感器DHT11环境数据采集5-8无线模块ESP8266-01WiFi连接与数据传输12-15电源模块AMS1117-3.3V提供稳定3.3V电压2-3调试工具USB-TTL转换器程序烧录与调试8-10DHT11是一款经典的温湿度复合传感器虽然精度相对一般温度±2℃湿度±5%RH但其简单易用、价格低廉的特点使其成为入门项目的理想选择。对于需要更高精度的应用场景可以考虑升级为DHT22或SHT30等传感器。2.2 电路连接详解正确的硬件连接是系统稳定运行的基础。以下是关键连接方式STM32与DHT11连接VCC → 3.3VDATA → PA1 (可配置为任意GPIO)GND → GNDSTM32与ESP8266连接ESP8266的TX → STM32的PA3 (USART2_RX)ESP8266的RX → STM32的PA2 (USART2_TX)CH_PD → 3.3VVCC → 3.3VGND → GND电源部分建议使用外部5V电源适配器供电AMS1117将5V降压至3.3V为各模块供电// 示例DHT11数据引脚定义 #define DHT11_GPIO_PORT GPIOA #define DHT11_GPIO_PIN GPIO_PIN_1注意ESP8266模块对电源质量较为敏感建议在VCC与GND之间并联100μF电解电容和0.1μF陶瓷电容以消除电源噪声。3. 嵌入式系统软件开发3.1 开发环境搭建我们使用Keil MDK作为主要开发工具配合STM32标准外设库进行开发。以下是环境配置的关键步骤安装Keil MDK-ARM开发环境建议版本5.25以上下载并导入STM32F10x标准外设库配置项目选项设置正确的芯片型号STM32F103C8T6设置调试工具为ST-Link或USB-TTL配合串口下载# 示例使用STM32CubeMX生成基础工程 $ stm32cubecli --chip STM32F103C8 --uart 2 --gpio PA1 --project temp_humidity3.2 DHT11传感器驱动开发DHT11采用单总线通信协议需要精确的时序控制。以下是数据采集的核心代码逻辑void DHT11_Start(void) { GPIO_InitTypeDef GPIO_InitStruct {0}; // 配置引脚为输出模式 GPIO_InitStruct.Pin DHT11_GPIO_PIN; GPIO_InitStruct.Mode GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Speed GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(DHT11_GPIO_PORT, GPIO_InitStruct); // 发送开始信号 HAL_GPIO_WritePin(DHT11_GPIO_PORT, DHT11_GPIO_PIN, GPIO_PIN_RESET); delay_ms(18); HAL_GPIO_WritePin(DHT11_GPIO_PORT, DHT11_GPIO_PIN, GPIO_PIN_SET); delay_us(30); // 切换为输入模式等待响应 GPIO_InitStruct.Mode GPIO_MODE_INPUT; HAL_GPIO_Init(DHT11_GPIO_PORT, GPIO_InitStruct); } uint8_t DHT11_ReadByte(void) { uint8_t data 0; for(int i0; i8; i) { while(!HAL_GPIO_ReadPin(DHT11_GPIO_PORT, DHT11_GPIO_PIN)); // 等待低电平结束 delay_us(40); if(HAL_GPIO_ReadPin(DHT11_GPIO_PORT, DHT11_GPIO_PIN)) { data | (1 (7-i)); while(HAL_GPIO_ReadPin(DHT11_GPIO_PORT, DHT11_GPIO_PIN)); // 等待高电平结束 } } return data; }3.3 ESP8266 WiFi模块配置ESP8266需要通过AT指令进行配置建立与路由器的连接并设置MQTT客户端初始化串口通信波特率115200发送AT指令测试模块响应配置WiFi连接模式STA模式连接指定路由器配置MQTT用户参数并连接服务器void ESP8266_SendCommand(const char* cmd) { HAL_UART_Transmit(huart2, (uint8_t*)cmd, strlen(cmd), HAL_MAX_DELAY); HAL_UART_Transmit(huart2, (uint8_t*)\r\n, 2, HAL_MAX_DELAY); HAL_Delay(1000); // 等待模块响应 } void ESP8266_Init(void) { // 重置模块 ESP8266_SendCommand(ATRST); // 设置WiFi模式为STA ESP8266_SendCommand(ATCWMODE1); // 连接路由器 char wifi_cmd[64]; sprintf(wifi_cmd, ATCWJAP\%s\,\%s\, WIFI_SSID, WIFI_PASSWORD); ESP8266_SendCommand(wifi_cmd); // 配置MQTT参数 ESP8266_SendCommand(ATMQTTUSERCFG0,1,\client_id\,\username\,\password\,0,0,\\); ESP8266_SendCommand(ATMQTTCONN0,\mqtt.server.com\,1883,1)); }4. 云端服务与微信小程序开发4.1 MQTT服务器配置我们选择EMQX作为MQTT代理服务器其开源版本完全能满足本项目需求。关键配置步骤如下在云服务器如阿里云ECS部署EMQX配置监听端口默认1883设置访问控制规则创建主题如device/sensor/data# 在Linux服务器上安装EMQX $ wget https://www.emqx.com/en/downloads/broker/5.0.20/emqx-5.0.20-ubuntu20.04-amd64.deb $ sudo apt install ./emqx-5.0.20-ubuntu20.04-amd64.deb $ sudo systemctl start emqx4.2 微信小程序开发要点微信小程序作为数据展示终端需要实现以下核心功能MQTT客户端连接实时数据图表展示历史数据查询异常报警通知以下是关键代码片段// 连接MQTT服务器 function connectMQTT() { const client mqtt.connect(wxs://mqtt.server.com/mqtt, { clientId: mini_program_ Math.random().toString(16).substr(2, 8), username: username, password: password }) client.on(connect, () { console.log(Connected to MQTT broker) client.subscribe(device/sensor/data, (err) { if (!err) { console.log(Subscribed to topic) } }) }) client.on(message, (topic, message) { const data JSON.parse(message.toString()) this.setData({ temperature: data.temp, humidity: data.hum, updatedAt: new Date().toLocaleString() }) }) }4.3 数据可视化实现良好的数据可视化能极大提升用户体验。我们使用ECharts for WeChat实现动态图表// 初始化图表 function initChart() { const ec wx.createCanvasContext(sensor-chart) const option { title: { text: 温湿度变化趋势 }, tooltip: {}, legend: { data: [温度(℃), 湿度(%RH)] }, xAxis: { type: category, data: [] }, yAxis: [{ type: value, name: 温度(℃) }, { type: value, name: 湿度(%RH) }], series: [ { name: 温度(℃), type: line, data: [] }, { name: 湿度(%RH), type: line, yAxisIndex: 1, data: [] } ] } ec.setOption(option) ec.draw() }5. 系统优化与调试技巧5.1 低功耗设计策略对于电池供电的应用场景功耗优化至关重要调整STM32工作模式使用睡眠模式优化数据上报频率非必要不更新关闭未使用的外设时钟选择低功耗版本的ESP8266如ESP-12Fvoid Enter_LowPowerMode(void) { // 配置唤醒源如RTC或外部中断 HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1); // 进入停止模式 HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI); // 唤醒后重新初始化系统时钟 SystemClock_Config(); }5.2 常见问题排查指南在实际部署中可能会遇到以下典型问题ESP8266连接不稳定检查电源质量纹波是否过大确保WiFi信号强度足够RSSI -70dBm调整AT指令超时时间DHT11数据异常验证时序是否符合规格书要求检查连接线长度建议20cm添加上拉电阻4.7kΩMQTT消息丢失实现QoS1或QoS2质量等级添加消息重传机制监控网络连接状态提示使用逻辑分析仪抓取单总线信号是调试DHT11通信问题的有效手段可以直观检查时序是否符合规范。6. 项目扩展与进阶方向基础功能实现后可以考虑以下扩展方向提升系统价值多节点组网部署多个监测点构建分布式监测网络边缘计算在STM32端实现简单数据分析如移动平均滤波报警功能超过阈值触发微信通知能源管理太阳能供电锂电池管理本地存储添加SPI Flash记录历史数据// 示例简单的移动平均滤波实现 #define FILTER_WINDOW_SIZE 5 float MovingAverage_Filter(float newValue) { static float buffer[FILTER_WINDOW_SIZE] {0}; static uint8_t index 0; static float sum 0; sum - buffer[index]; buffer[index] newValue; sum buffer[index]; index (index 1) % FILTER_WINDOW_SIZE; return sum / FILTER_WINDOW_SIZE; }在实际部署中发现为ESP8266添加重连逻辑能显著提升系统稳定性。当网络异常时自动尝试重新连接而非等待用户干预这对无人值守的应用场景尤为重要。
用STM32F103+DHT11+ESP8266做个智能温湿度计,数据还能推送到微信小程序(附完整源码)
发布时间:2026/6/14 7:01:04
从零打造智能温湿度监测系统STM32F103与微信小程序的深度整合在智能家居和物联网技术蓬勃发展的今天温湿度监测已成为许多场景的基础需求。无论是家庭环境监控、农业大棚管理还是工业设备维护实时获取环境数据都至关重要。本文将带领读者从硬件选型到软件实现完整构建一个基于STM32F103微控制器、DHT11传感器和ESP8266无线模块的智能监测系统并通过MQTT协议将数据推送至微信小程序实现远程可视化监控。1. 项目整体架构设计智能温湿度监测系统的核心在于数据的采集、传输和展示三个环节。我们采用模块化设计思路将系统划分为以下三个层次感知层STM32F103作为主控芯片负责采集DHT11传感器的温湿度数据传输层ESP8266 WiFi模块建立网络连接通过MQTT协议将数据上传至云端应用层微信小程序作为用户界面实时显示并分析环境数据这种分层架构不仅清晰明了也便于后期功能扩展。例如未来可以轻松添加更多传感器类型或更换不同的显示终端。提示MQTT协议因其轻量级和低功耗特性特别适合物联网设备使用。它采用发布/订阅模式能有效降低网络带宽消耗和设备资源占用。2. 硬件准备与电路连接2.1 核心元件选型指南选择适合的硬件组件是项目成功的第一步。以下是经过实际验证的元件组合组件名称型号规格主要功能参考价格主控芯片STM32F103C8T6系统控制与数据处理15-20温湿度传感器DHT11环境数据采集5-8无线模块ESP8266-01WiFi连接与数据传输12-15电源模块AMS1117-3.3V提供稳定3.3V电压2-3调试工具USB-TTL转换器程序烧录与调试8-10DHT11是一款经典的温湿度复合传感器虽然精度相对一般温度±2℃湿度±5%RH但其简单易用、价格低廉的特点使其成为入门项目的理想选择。对于需要更高精度的应用场景可以考虑升级为DHT22或SHT30等传感器。2.2 电路连接详解正确的硬件连接是系统稳定运行的基础。以下是关键连接方式STM32与DHT11连接VCC → 3.3VDATA → PA1 (可配置为任意GPIO)GND → GNDSTM32与ESP8266连接ESP8266的TX → STM32的PA3 (USART2_RX)ESP8266的RX → STM32的PA2 (USART2_TX)CH_PD → 3.3VVCC → 3.3VGND → GND电源部分建议使用外部5V电源适配器供电AMS1117将5V降压至3.3V为各模块供电// 示例DHT11数据引脚定义 #define DHT11_GPIO_PORT GPIOA #define DHT11_GPIO_PIN GPIO_PIN_1注意ESP8266模块对电源质量较为敏感建议在VCC与GND之间并联100μF电解电容和0.1μF陶瓷电容以消除电源噪声。3. 嵌入式系统软件开发3.1 开发环境搭建我们使用Keil MDK作为主要开发工具配合STM32标准外设库进行开发。以下是环境配置的关键步骤安装Keil MDK-ARM开发环境建议版本5.25以上下载并导入STM32F10x标准外设库配置项目选项设置正确的芯片型号STM32F103C8T6设置调试工具为ST-Link或USB-TTL配合串口下载# 示例使用STM32CubeMX生成基础工程 $ stm32cubecli --chip STM32F103C8 --uart 2 --gpio PA1 --project temp_humidity3.2 DHT11传感器驱动开发DHT11采用单总线通信协议需要精确的时序控制。以下是数据采集的核心代码逻辑void DHT11_Start(void) { GPIO_InitTypeDef GPIO_InitStruct {0}; // 配置引脚为输出模式 GPIO_InitStruct.Pin DHT11_GPIO_PIN; GPIO_InitStruct.Mode GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Speed GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(DHT11_GPIO_PORT, GPIO_InitStruct); // 发送开始信号 HAL_GPIO_WritePin(DHT11_GPIO_PORT, DHT11_GPIO_PIN, GPIO_PIN_RESET); delay_ms(18); HAL_GPIO_WritePin(DHT11_GPIO_PORT, DHT11_GPIO_PIN, GPIO_PIN_SET); delay_us(30); // 切换为输入模式等待响应 GPIO_InitStruct.Mode GPIO_MODE_INPUT; HAL_GPIO_Init(DHT11_GPIO_PORT, GPIO_InitStruct); } uint8_t DHT11_ReadByte(void) { uint8_t data 0; for(int i0; i8; i) { while(!HAL_GPIO_ReadPin(DHT11_GPIO_PORT, DHT11_GPIO_PIN)); // 等待低电平结束 delay_us(40); if(HAL_GPIO_ReadPin(DHT11_GPIO_PORT, DHT11_GPIO_PIN)) { data | (1 (7-i)); while(HAL_GPIO_ReadPin(DHT11_GPIO_PORT, DHT11_GPIO_PIN)); // 等待高电平结束 } } return data; }3.3 ESP8266 WiFi模块配置ESP8266需要通过AT指令进行配置建立与路由器的连接并设置MQTT客户端初始化串口通信波特率115200发送AT指令测试模块响应配置WiFi连接模式STA模式连接指定路由器配置MQTT用户参数并连接服务器void ESP8266_SendCommand(const char* cmd) { HAL_UART_Transmit(huart2, (uint8_t*)cmd, strlen(cmd), HAL_MAX_DELAY); HAL_UART_Transmit(huart2, (uint8_t*)\r\n, 2, HAL_MAX_DELAY); HAL_Delay(1000); // 等待模块响应 } void ESP8266_Init(void) { // 重置模块 ESP8266_SendCommand(ATRST); // 设置WiFi模式为STA ESP8266_SendCommand(ATCWMODE1); // 连接路由器 char wifi_cmd[64]; sprintf(wifi_cmd, ATCWJAP\%s\,\%s\, WIFI_SSID, WIFI_PASSWORD); ESP8266_SendCommand(wifi_cmd); // 配置MQTT参数 ESP8266_SendCommand(ATMQTTUSERCFG0,1,\client_id\,\username\,\password\,0,0,\\); ESP8266_SendCommand(ATMQTTCONN0,\mqtt.server.com\,1883,1)); }4. 云端服务与微信小程序开发4.1 MQTT服务器配置我们选择EMQX作为MQTT代理服务器其开源版本完全能满足本项目需求。关键配置步骤如下在云服务器如阿里云ECS部署EMQX配置监听端口默认1883设置访问控制规则创建主题如device/sensor/data# 在Linux服务器上安装EMQX $ wget https://www.emqx.com/en/downloads/broker/5.0.20/emqx-5.0.20-ubuntu20.04-amd64.deb $ sudo apt install ./emqx-5.0.20-ubuntu20.04-amd64.deb $ sudo systemctl start emqx4.2 微信小程序开发要点微信小程序作为数据展示终端需要实现以下核心功能MQTT客户端连接实时数据图表展示历史数据查询异常报警通知以下是关键代码片段// 连接MQTT服务器 function connectMQTT() { const client mqtt.connect(wxs://mqtt.server.com/mqtt, { clientId: mini_program_ Math.random().toString(16).substr(2, 8), username: username, password: password }) client.on(connect, () { console.log(Connected to MQTT broker) client.subscribe(device/sensor/data, (err) { if (!err) { console.log(Subscribed to topic) } }) }) client.on(message, (topic, message) { const data JSON.parse(message.toString()) this.setData({ temperature: data.temp, humidity: data.hum, updatedAt: new Date().toLocaleString() }) }) }4.3 数据可视化实现良好的数据可视化能极大提升用户体验。我们使用ECharts for WeChat实现动态图表// 初始化图表 function initChart() { const ec wx.createCanvasContext(sensor-chart) const option { title: { text: 温湿度变化趋势 }, tooltip: {}, legend: { data: [温度(℃), 湿度(%RH)] }, xAxis: { type: category, data: [] }, yAxis: [{ type: value, name: 温度(℃) }, { type: value, name: 湿度(%RH) }], series: [ { name: 温度(℃), type: line, data: [] }, { name: 湿度(%RH), type: line, yAxisIndex: 1, data: [] } ] } ec.setOption(option) ec.draw() }5. 系统优化与调试技巧5.1 低功耗设计策略对于电池供电的应用场景功耗优化至关重要调整STM32工作模式使用睡眠模式优化数据上报频率非必要不更新关闭未使用的外设时钟选择低功耗版本的ESP8266如ESP-12Fvoid Enter_LowPowerMode(void) { // 配置唤醒源如RTC或外部中断 HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1); // 进入停止模式 HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI); // 唤醒后重新初始化系统时钟 SystemClock_Config(); }5.2 常见问题排查指南在实际部署中可能会遇到以下典型问题ESP8266连接不稳定检查电源质量纹波是否过大确保WiFi信号强度足够RSSI -70dBm调整AT指令超时时间DHT11数据异常验证时序是否符合规格书要求检查连接线长度建议20cm添加上拉电阻4.7kΩMQTT消息丢失实现QoS1或QoS2质量等级添加消息重传机制监控网络连接状态提示使用逻辑分析仪抓取单总线信号是调试DHT11通信问题的有效手段可以直观检查时序是否符合规范。6. 项目扩展与进阶方向基础功能实现后可以考虑以下扩展方向提升系统价值多节点组网部署多个监测点构建分布式监测网络边缘计算在STM32端实现简单数据分析如移动平均滤波报警功能超过阈值触发微信通知能源管理太阳能供电锂电池管理本地存储添加SPI Flash记录历史数据// 示例简单的移动平均滤波实现 #define FILTER_WINDOW_SIZE 5 float MovingAverage_Filter(float newValue) { static float buffer[FILTER_WINDOW_SIZE] {0}; static uint8_t index 0; static float sum 0; sum - buffer[index]; buffer[index] newValue; sum buffer[index]; index (index 1) % FILTER_WINDOW_SIZE; return sum / FILTER_WINDOW_SIZE; }在实际部署中发现为ESP8266添加重连逻辑能显著提升系统稳定性。当网络异常时自动尝试重新连接而非等待用户干预这对无人值守的应用场景尤为重要。