一、为什么需要温湿度传感器
温度与湿度是环境中最重要的两个基础参数,直接关系到设备寿命、产品质量与人体舒适度:
- 农业与种植:大棚、育苗、菌菇房需要精准控温控湿;
- 机房与设备间:服务器运行环境温湿度异常会加速硬件老化甚至宕机;
- 智能家居:联动空调、加湿器、除湿机,实现自动调节;
- 仓储与实验室:药品、食品、电子元件的储存对温湿度有明确要求。
学会用单片机读取温湿度,是物联网(IoT)入门最经典也最实用的项目之一。
二、工作原理:温度和湿度是怎么测出来的
1. 温度测量
- 热敏电阻(NTC):阻值随温度变化,通过分压电路测电压换算温度,成本低但线性差;
- 数字温度芯片:如 DS18B20,内部完成模数转换,单总线输出数字量;
- 集成传感器:如 SHT30、BME280 内部自带校准与补偿,直接输出数字信号。
2. 湿度测量
绝大多数温湿度传感器采用电容式湿敏元件:高分子感湿薄膜吸附水分子后,介电常数发生变化,导致电容值变化,再经内部电路转换为电压或数字信号输出。这类元件响应快、精度高、寿命长,是当前主流方案。
3. 通信接口分类
| 接口 | 典型型号 | 特点 |
|---|---|---|
| 单总线(OneWire) | DHT11、DHT22 | 仅需一根数据线,时序敏感,软件实现简单 |
| I2C | SHT30、BME280 | 两线制,可多设备挂载,读取稳定 |
| SPI | BME280 等 | 高速,接线略多 |
三、常见型号对比(选型必看)
| 型号 | 温度精度 | 湿度精度 | 温度量程 | 湿度量程 | 接口 | 参考价格 | 适用场景 |
|---|---|---|---|---|---|---|---|
| DHT11 | ±2℃ | ±5%RH | 0~50℃ | 20~90%RH | 单总线 | 约 3~8 元 | 入门学习、精度要求不高的场合 |
| DHT22(AM2302) | ±0.5℃ | ±2%RH | -40~80℃ | 0~100%RH | 单总线 | 约 10~20 元 | 家用环境监测、室外场合 |
| SHT30 | ±0.3℃ | ±2%RH | -40~125℃ | 0~100%RH | I2C | 约 15~30 元 | 精度要求高的项目、产品级 |
| BME280 | ±1℃ | ±3%RH | -40~85℃ | 0~100%RH | I2C/SPI | 约 15~40 元 | 需要同时测气压的场景 |
说明:以上参数为各型号公开规格的典型值,具体以对应厂商官方数据手册为准。
选型建议:学习入门选 DHT11;预算充足且要求稳定选 DHT22;做产品级或高精度项目选 SHT30;需要气压数据(如海拔、气象站)选 BME280。
四、硬件准备与接线(以 DHT11 为例)
物料清单
- 开发板:Arduino UNO 或 ESP32 均可;
- 传感器:DHT11 模块(3 脚版)或裸芯片 + 4.7kΩ~10kΩ 上拉电阻;
- 杜邦线若干、面包板(可选)。
接线表
| DHT11 引脚 | 连接目标 |
|---|---|
| VCC | 3.3V 或 5V |
| DATA | 任意 GPIO(示例用 GPIO4),需外接 4.7kΩ~10kΩ 上拉电阻到 VCC |
| GND | GND |
提示:市面上常见的 DHT11 模块板载上拉电阻,直接接 VCC / GND / DATA 三根线即可;裸芯片则必须加上拉电阻,否则会读取失败或数据错误。
五、代码实现
1. 安装依赖库
在 Arduino IDE 的「库管理器」中搜索安装:
- DHT sensor library(by Adafruit)
- Adafruit Unified Sensor(自动依赖,一并安装)
2. 基础代码:串口输出温湿度
#include <DHT.h> #define DHTPIN 4 // 数据引脚接 GPIO4 #define DHTTYPE DHT11 // 传感器型号,如用 DHT22 则改为 DHT22 DHT dht(DHTPIN, DHTTYPE); void setup() { Serial.begin(9600); Serial.println(F("DHT 温湿度传感器测试开始")); dht.begin(); } void loop() { delay(2000); // DHT11 两次读取间隔至少 1~2 秒 float h = dht.readHumidity(); float t = dht.readTemperature(); // 读取失败时返回 NaN if (isnan(h) || isnan(t)) { Serial.println(F("读取失败!请检查接线、上拉电阻和供电")); return; } Serial.print(F("湿度: ")); Serial.print(h); Serial.println(F(" %RH")); Serial.print(F("温度: ")); Serial.print(t); Serial.println(F(" ℃")); }3. 代码要点
DHTTYPE宏按实际传感器修改,DHT22 就改成DHT22;delay(2000)必须保留:DHT11 采样频率上限约 1Hz,过快读取会持续失败;isnan()判断用于排除读取失败的无效数据。
4. 扩展玩法
- 接一块 0.96 寸 OLED(SSD1306),把温湿度显示到屏幕上;
- ESP32 版可直接把数据通过 WiFi 上报到 MQTT/EMQX,实现远程监控;
- 多个传感器接不同 GPIO,可做多点温湿度采集。
六、运行结果示例
编译上传后,打开串口监视器(波特率 9600),输出格式如下:
DHT 温湿度传感器测试开始 湿度: 56.00 %RH 温度: 25.40 ℃ 湿度: 56.20 %RH 温度: 25.50 ℃以上为示例输出,仅用于演示串口格式,并非真实测量数据;实际数值以你设备所在环境的真实测量为准。
七、常见问题与避坑指南
- 一直返回 NaN / 读取失败检查顺序:接线是否松动 → DATA 脚上拉电阻是否缺失(模块版可忽略)→ 供电是否稳定 → 采样间隔是否小于 2 秒。
- 读数明显偏高传感器靠近发热元件(开发板稳压芯片、电阻)或阳光直射,读数会失真,应把传感器远离热源。
- 湿度读数长期漂移电容式湿敏元件长期暴露在高湿、油烟环境会老化,可用标准温湿度计比对,必要时校准或更换。
- 数据线过长DHT11 单总线对时序敏感,引线建议不超过 20 米(普通环境 5 米内最稳),过长需换 DHT22 或 I2C 传感器。
- 精度不等于分辨率DHT11 输出的小数位只是分辨率,实际精度是 ±2℃/±5%RH,展示和对比数据时注意区分。
八、总结
- 选型按精度 + 接口 + 价格三个维度权衡:入门 DHT11、进阶 DHT22、产品级 SHT30、要气压选 BME280;
- 接线记住 VCC / GND / DATA,裸芯片务必加上拉电阻;
- 代码三步:装库 →
dht.begin()→readTemperature()/readHumidity(); - 遇到失败先查接线和采样间隔,这两项占了 90% 的问题。
把温湿度读出来只是第一步,下一步可以接入 OLED、WiFi 上报或联动控制,欢迎在评论区交流你的项目,也欢迎点赞收藏,后续更新 ESP32 远程监控实战。