news 2026/5/5 8:12:25

用STM32F103C8T6+DHT11+ESP8266做个温湿度监测器,再也不用担心家里太潮了(附ZigBee组网避坑指南)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
用STM32F103C8T6+DHT11+ESP8266做个温湿度监测器,再也不用担心家里太潮了(附ZigBee组网避坑指南)

基于STM32与ESP8266的智能温湿度监测系统实战指南

家里总有些角落潮湿得让人担心?梅雨季节墙面发霉、衣物受潮的问题困扰着许多家庭。今天我们将用不到200元的成本,打造一个可以远程查看温湿度数据的监测系统。这个方案特别适合对智能家居感兴趣的电子爱好者,或是单纯想解决实际问题的实用派。

1. 硬件选型与核心组件解析

1.1 主控芯片STM32F103C8T6的优势

这款被戏称为"蓝色药丸"的开发板,以其极高的性价比在创客圈广受欢迎。相比Arduino,STM32F103C8T6拥有更强大的性能:

  • 72MHz Cortex-M3内核:处理传感器数据游刃有余
  • 64KB Flash + 20KB RAM:足够存储复杂逻辑程序
  • 丰富的外设接口:3个USART、2个SPI、2个I2C
  • 低至2.0V的工作电压:适合电池供电场景

实际选购时要注意区分正版(ST原厂)和国产兼容版,后者价格通常只有前者的1/3,但稳定性稍逊。对于这个项目,国产版完全够用。

1.2 DHT11温湿度传感器的特性

虽然DHT22精度更高,但DHT11的性价比在家庭环境中更具优势:

参数DHT11DHT22
温度范围0-50℃-40-80℃
温度精度±2℃±0.5℃
湿度范围20-90%RH0-100%RH
湿度精度±5%RH±2%RH
响应时间1-2秒2秒
价格约5元约25元

提示:DHT11的塑料外壳版本比金属网版本更耐用,建议选择前者。

1.3 ESP8266的联网方案选择

ESP-01S是最经济的型号,但引脚较少。如果后续需要扩展功能,建议选择NodeMCU开发板:

// ESP8266 AT指令示例 AT+CWMODE=1 // 设置为Station模式 AT+CWJAP="SSID","password" // 连接WiFi AT+CIPSTART="TCP","api.thingspeak.com",80 // 建立TCP连接

2. 硬件连接与供电设计

2.1 核心电路连接指南

正确的接线是项目成功的第一步,以下是关键连接点:

  1. DHT11与STM32连接

    • VCC → 3.3V
    • GND → GND
    • DATA → PA0 (需接4.7K上拉电阻)
  2. ESP8266与STM32连接

    • RX → PA2 (USART2_TX)
    • TX → PA3 (USART2_RX)
    • CH_PD → 3.3V
    • VCC → 3.3V (需确保电源足够)
  3. 电源方案选择

    • USB供电:最简单但移动性差
    • 18650电池:需配TP4056充电模块
    • 5V电源适配器:最稳定可靠

2.2 常见接线错误排查

遇到过这些问题吗?你可能不是第一个:

  • ESP8266无法连接WiFi:检查电源是否达到300mA峰值需求
  • DHT11读数异常:DATA线长度不宜超过20cm
  • STM32无法烧录程序:检查BOOT0/BOOT1引脚状态
  • 串口通信失败:确认TX/RX没有接反

3. 固件开发与环境搭建

3.1 开发环境配置

推荐使用PlatformIO + VSCode的组合,比Keil更现代:

# 安装PlatformIO核心 pip install platformio # 创建STM32项目 pio project init --board bluepill_f103c8

需要的库文件:

  • DHTlib:用于DHT11传感器
  • PubSubClient:MQTT通信
  • ArduinoJson:数据解析

3.2 核心代码解析

数据采集部分代码示例:

#include <DHT.h> #define DHTPIN PA0 #define DHTTYPE DHT11 DHT dht(DHTPIN, DHTTYPE); void setup() { Serial.begin(115200); dht.begin(); } void loop() { float h = dht.readHumidity(); float t = dht.readTemperature(); if (isnan(h) || isnan(t)) { Serial.println("读取DHT11失败!"); return; } Serial.print("湿度: "); Serial.print(h); Serial.print("% 温度: "); Serial.print(t); Serial.println("℃"); delay(2000); }

3.3 WiFi配置与MQTT通信

ESP8266通常有两种编程方式:

  1. AT指令模式(STM32作为主机)
  2. 原生固件模式(直接编程ESP8266)

推荐使用第二种方式,代码更简洁:

#include <ESP8266WiFi.h> #include <PubSubClient.h> const char* ssid = "your_SSID"; const char* password = "your_PASSWORD"; const char* mqtt_server = "broker.hivemq.com"; WiFiClient espClient; PubSubClient client(espClient); void setup_wifi() { delay(10); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); } } void reconnect() { while (!client.connected()) { if (client.connect("ESP8266Client")) { client.publish("home/sensor/temperature", "23.5"); } else { delay(5000); } } } void loop() { if (!client.connected()) { reconnect(); } client.loop(); }

4. 数据可视化方案

4.1 免费物联网平台对比

平台免费额度数据保留可视化上手难度
ThingSpeak3百万消息/年无限制基础图表★★☆☆☆
Blynk1000能量点30天丰富控件★★★☆☆
Ubidots3个设备30天专业级★★★★☆
MQTT.fx完全免费本地需配置★★★★★

4.2 自建服务器方案

对技术爱好者,Raspberry Pi + Node-RED是灵活的选择:

# 在树莓派上安装Node-RED sudo apt-get install nodered sudo systemctl enable nodered sudo systemctl start nodered

Node-RED流配置要点:

  1. 添加MQTT输入节点(订阅主题)
  2. 添加Dashboard图表节点
  3. 配置UI界面布局

4.3 异常报警实现

当湿度超过设定阈值时发送邮件报警:

// Node-RED函数节点示例 if (msg.payload.humidity > 70) { msg.topic = "高湿度警告"; msg.payload = "当前湿度"+msg.payload.humidity+"%,可能引发霉变"; return msg; } else { return null; }

5. 进阶优化与扩展思路

5.1 低功耗设计技巧

想让设备电池供电运行数月?试试这些方法:

  • 将STM32设置为STOP模式(仅消耗μA级电流)
  • 间隔唤醒(如每10分钟测量一次)
  • 关闭ESP8266的LED指示灯
  • 选用低压差稳压器(如HT7333)

实测数据:

  • 持续工作模式:约120mA
  • 深度睡眠模式:约0.5mA
  • 理论18650续航:从数月到数天不等

5.2 多节点组网方案

需要监测多个房间?考虑这些通信方式:

  1. ZigBee组网

    • 优点:低功耗、自组网
    • 缺点:配置复杂、穿透力一般
  2. LoRa远距离传输

    • 优点:超远距离(可达数公里)
    • 缺点:低速、需网关
  3. 蓝牙Mesh

    • 优点:手机直连
    • 缺点:距离有限

5.3 外壳设计与安装建议

好的外壳能让项目更专业:

  • 3D打印方案:Thingiverse上有现成模型
  • 防水处理:用热熔胶密封接口处
  • 安装位置
    • 离地1.5米高度
    • 远离空调出风口
    • 避免阳光直射

6. 常见问题解决方案

6.1 数据跳变问题

遇到读数不稳定?尝试这些方法:

  1. 电源滤波

    • 增加100μF电解电容
    • 并联0.1μF陶瓷电容
  2. 软件滤波算法

    • 移动平均滤波
    • 中值滤波
    • 卡尔曼滤波
// 移动平均滤波示例 #define FILTER_LEN 5 float filterBuf[FILTER_LEN]; float movingAverage(float newVal) { static byte index = 0; filterBuf[index] = newVal; index = (index + 1) % FILTER_LEN; float sum = 0; for (byte i=0; i<FILTER_LEN; i++) { sum += filterBuf[i]; } return sum / FILTER_LEN; }

6.2 WiFi连接不稳定

ESP8266的WiFi连接问题很常见,解决方法包括:

  1. 调整天线位置:避免金属屏蔽
  2. 修改WiFi信道:用手机APP检测拥堵信道
  3. 降低发射功率:AT指令调整RF功率
  4. 添加重连机制:代码中实现自动重连

6.3 传感器寿命延长

想让DHT11用得更久?注意:

  • 避免结露环境(相对湿度>90%)
  • 不要用手直接触摸感应元件
  • 定期清洁防尘(间隔6个月)
  • 工作电压严格控制在3.3V-5V

7. 项目扩展与创意应用

基础功能跑通后,可以尝试这些有趣的方向:

  1. 历史数据分析

    • 使用InfluxDB存储时间序列数据
    • Grafana制作专业看板
  2. 智能联动

    • 湿度超标自动开启除湿机
    • 温度过高触发空调降温
  3. 多传感器融合

    • 增加CO2传感器监测空气质量
    • 添加光照传感器判断房间使用状态
  4. 语音播报功能

    • 通过百度语音合成API
    • 外接小喇叭播报实时数据
# 简单的数据分析示例(Python) import pandas as pd import matplotlib.pyplot as plt data = pd.read_csv('sensor_data.csv') data['time'] = pd.to_datetime(data['time']) plt.figure(figsize=(12,6)) plt.plot(data['time'], data['humidity'], label='湿度(%)') plt.plot(data['time'], data['temperature'], label='温度(℃)') plt.legend() plt.show()

实际部署时发现,将设备放在衣柜内部监测衣物湿度特别实用,当检测到连续3天湿度高于65%时,手机APP会推送提醒建议除湿。另一个巧妙的用法是放在花盆附近,根据土壤湿度变化规律来优化浇水频率。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/5 8:08:25

Hey数据迁移与备份终极指南:保护你的去中心化社交数据

Hey数据迁移与备份终极指南&#xff1a;保护你的去中心化社交数据 【免费下载链接】hey Hey is a decentralized and permissionless social media app built with Lens Protocol &#x1f33f; 项目地址: https://gitcode.com/gh_mirrors/hey/hey Hey作为基于Lens Prot…

作者头像 李华
网站建设 2026/5/5 8:05:36

SAM 3分割技术:概念提示驱动的视觉分割革新

1. 项目概述&#xff1a;SAM 3带来的分割技术革新计算机视觉领域最近迎来了一位重量级选手——SAM 3&#xff08;Segment Anything Model 3&#xff09;。作为Meta AI实验室的最新研究成果&#xff0c;这个基于概念提示的通用分割模型正在重新定义图像与视频分割的技术边界。我…

作者头像 李华