当前位置: 首页 > news >正文

用STM32F103+DHT11+ESP8266做个智能温湿度计,数据还能推送到微信小程序(附完整源码)

从零打造智能温湿度监测系统: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-10

DHT11是一款经典的温湿度复合传感器,虽然精度相对一般(温度±2℃,湿度±5%RH),但其简单易用、价格低廉的特点使其成为入门项目的理想选择。对于需要更高精度的应用场景,可以考虑升级为DHT22或SHT30等传感器。

2.2 电路连接详解

正确的硬件连接是系统稳定运行的基础。以下是关键连接方式:

  1. STM32与DHT11连接

    • VCC → 3.3V
    • DATA → PA1 (可配置为任意GPIO)
    • GND → GND
  2. STM32与ESP8266连接

    • ESP8266的TX → STM32的PA3 (USART2_RX)
    • ESP8266的RX → STM32的PA2 (USART2_TX)
    • CH_PD → 3.3V
    • VCC → 3.3V
    • GND → GND
  3. 电源部分

    • 建议使用外部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标准外设库进行开发。以下是环境配置的关键步骤:

  1. 安装Keil MDK-ARM开发环境(建议版本5.25以上)
  2. 下载并导入STM32F10x标准外设库
  3. 配置项目选项,设置正确的芯片型号(STM32F103C8T6)
  4. 设置调试工具为ST-Link(或USB-TTL配合串口下载)
# 示例:使用STM32CubeMX生成基础工程 $ stm32cubecli --chip STM32F103C8 --uart 2 --gpio PA1 --project temp_humidity

3.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 i=0; i<8; 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客户端:

  1. 初始化串口通信(波特率115200)
  2. 发送AT指令测试模块响应
  3. 配置WiFi连接模式(STA模式)
  4. 连接指定路由器
  5. 配置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("AT+RST"); // 设置WiFi模式为STA ESP8266_SendCommand("AT+CWMODE=1"); // 连接路由器 char wifi_cmd[64]; sprintf(wifi_cmd, "AT+CWJAP=\"%s\",\"%s\"", WIFI_SSID, WIFI_PASSWORD); ESP8266_SendCommand(wifi_cmd); // 配置MQTT参数 ESP8266_SendCommand("AT+MQTTUSERCFG=0,1,\"client_id\",\"username\",\"password\",0,0,\"\""); ESP8266_SendCommand("AT+MQTTCONN=0,\"mqtt.server.com\",1883,1)"); }

4. 云端服务与微信小程序开发

4.1 MQTT服务器配置

我们选择EMQX作为MQTT代理服务器,其开源版本完全能满足本项目需求。关键配置步骤如下:

  1. 在云服务器(如阿里云ECS)部署EMQX
  2. 配置监听端口(默认1883)
  3. 设置访问控制规则
  4. 创建主题(如"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 emqx

4.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-12F)
void Enter_LowPowerMode(void) { // 配置唤醒源(如RTC或外部中断) HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1); // 进入停止模式 HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI); // 唤醒后重新初始化系统时钟 SystemClock_Config(); }

5.2 常见问题排查指南

在实际部署中可能会遇到以下典型问题:

  1. ESP8266连接不稳定

    • 检查电源质量(纹波是否过大)
    • 确保WiFi信号强度足够(RSSI > -70dBm)
    • 调整AT指令超时时间
  2. DHT11数据异常

    • 验证时序是否符合规格书要求
    • 检查连接线长度(建议<20cm)
    • 添加上拉电阻(4.7kΩ)
  3. 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添加重连逻辑能显著提升系统稳定性。当网络异常时,自动尝试重新连接而非等待用户干预,这对无人值守的应用场景尤为重要。

http://www.jsqmd.com/news/1010280/

相关文章:

  • TransFuzz:基于大语言模型的深度学习框架静默Bug检测
  • 2026年银川生肖茅台酒回收与名酒流通市场专业分析报告 - 优质品牌商家
  • AI辅助发现Zcash隐私池漏洞 38%价格下跌凸显风险
  • 第3章:rebase 噩梦——改写历史后怎么救
  • SAP物料主数据批量修改,除了MM17你还可以试试LSMW和BDC
  • 别再死记硬背了!用PyTorch实战代码,5分钟搞懂SGD、Adam、AdamW优化器的核心区别
  • CP、Tucker、BTD分解怎么选?一张图帮你搞定张量分解算法选型
  • 从零打造跨平台播放器:基于ijkplayer与FFmpeg的iOS/Android实战改造指南
  • 别再只用ClickHouse了!实测StarRocks 3.x的向量化引擎,在广告主高并发查询场景下的表现
  • 2026年彩箱印刷厂行业观察:区域优势与定制能力的多维分析 - 优质品牌商家
  • Claude 4.0语义校验环归零:能力密度跃迁与推理架构降维
  • 缝纫机厂分布在哪里?全国主要产区盘点
  • ESP32-S3串口接收避坑指南:如何用事件队列稳定处理大量数据与错误(UART1实战)
  • 别再手动算坐标了!用VisionMaster的N点标定,5分钟搞定相机与机械臂的‘对话’
  • 手把手教你给创维E900V22C/D盒子刷机:免拆卡刷+线刷双教程,附ROOT固件下载
  • 1Panel vs 宝塔面板:深度对比实测,2024年新手该选哪个管理Linux?
  • 24GB显存跑7B大模型实操指南:量化部署与内存优化
  • 从WordPress到数据分析:聊聊MySQL和PostgreSQL那些‘不为人知’的隐藏技能
  • 生产级机器学习系统:从模型训练到银行级稳定部署
  • 成都奔驰商务车销售公司选择指南:服务能力与渠道分析 - 优质品牌商家
  • 真不想吹Claude Fable了,奈何实力不允许!
  • FastBee开源版 vs 商业版深度对比:2万块到底买到了哪些物联网核心功能?
  • 考前自测!【中药学】极速提分自测卷(卷号:06121219_05)
  • 别再纠结了!嵌入式设备做语音通话,SpeexDSP和WebRTC 3A到底怎么选?一个实战案例告诉你
  • 成都弱电布线服务市场现状与主体推荐:从布线到监控的全面选择指南 - 优质品牌商家
  • 信息论三支柱:熵、交叉熵与KL散度的工程直觉
  • Windows 11 上 Rust 开发环境二选一:MSVC 还是 MinGW?我踩坑后建议你无脑选这个
  • 告别网页测速!在Windows命令行用Speedtest CLI精准测试你的网络带宽(附详细参数解读)
  • 计算机Java毕设实战-基于 SpringBoot 的个人闲置资源流转交易系统研究 面向校园用户的二手闲置物品交易平台设计【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 从TLC到QLC,你的下一块大容量SSD该怎么选?深入聊聊NAND闪存类型对寿命和性能的真实影响