DHT22 温湿度传感器
| 器材 | 数量 | 参考 |
|---|---|---|
| DHT22 模块 | 1 | — |
价格随渠道波动,以购买页实时为准。
你照着教程接了一颗 DHT11,做了个室内温湿度记录,结果回看曲线发现湿度只在整数上跳——38%、39%、40%,中间那些小数全没了;温度也总差那么一两度,跟手边的温度计对不上。问题不在你的代码,是 DHT11 这颗元件本身就只到这个分辨率。想把读数做准、做细,又不想换接线、不想重学协议,DHT22(也叫 AM2302)就是为这一步准备的——三根线照旧、库照旧,只是元件换成了更好的那一档。
工作原理
DHT22 和 DHT11 是同一套思路,区别只在内部元件的等级。
测湿用的是电容式湿度元件:两片电极中间夹一层吸湿介质,空气里的水汽多了,介质介电常数变化,电容随之变化,芯片把这个电容值换算成相对湿度。DHT22 的这层介质和标定都比 DHT11 讲究,所以它能给到 0.1% 的分辨率、±2% 的精度,而不是 DHT11 那种只能报整数、误差动辄 ±5% 的水平。
测温用的是热敏电阻(NTC):温度越高电阻越小,芯片测电阻反推温度。DHT22 的热敏元件经过更细的标定,量程拉到了 -40 ~ 80°C,负温也能测——这一点 DHT11 做不到(它下限只到 0°C)。
两个元件的模拟信号都先进到 DHT22 内部那颗芯片里,做完 A/D 转换和标定,再用单总线协议把一串数字脉冲从 DATA 脚发出来。所谓单总线,就是用一根线既发命令又收数据,靠脉冲的长短来区分 0 和 1。这套数字输出的好处是:传到主控的是算好的数,不受导线长度、电压波动影响,不像纯模拟传感器那样要你自己接 ADC、自己滤噪。模拟和数字的差别,这一节讲得更细。
一句话:DHT22 = DHT11 的协议 + 更好的元件 + 更准的标定。
接线
和 DHT11 一模一样,三根线:
| DHT22 | ESP32 | 说明 |
|---|---|---|
| VCC (+) | 3.3V 或 5V | 3.3V/5V 都行,跟主控电平一致即可 |
| DATA (out) | GPIO4(任意 GPIO) | 数据线,需上拉 |
| GND (-) | GND | 共地 |
如果你买的是模块版(带小电路板那种),板上通常已经焊好上拉电阻,三根线直接插上就能用。如果是裸传感器(四脚那种,AM2302 常见),要在 DATA 和 VCC 之间手动加一颗 10kΩ 上拉电阻,否则总线浮空、读数全是 nan。上拉为什么必须,这一节有解释。
裸件的第 3 脚一般悬空不接,第 4 脚是 GND,买的时候看清丝印。
完整代码
用 Adafruit 的 DHT 库,和 DHT11 共用同一个库,唯一要改的就是 DHTTYPE——把 DHT11 换成 DHT22:
#include "DHT.h"
#define DHTPIN 4 // DATA 接 GPIO4
#define DHTTYPE DHT22 // 关键:这里写 DHT22,不是 DHT11
DHT dht(DHTPIN, DHTTYPE);
void setup() {
Serial.begin(115200);
dht.begin();
Serial.println("DHT22 启动,等待读数...");
}
void loop() {
delay(2000); // DHT22 采样间隔 ≥ 2 秒,比 DHT11 还慢一点
float h = dht.readHumidity(); // 湿度 %
float t = dht.readTemperature(); // 温度 °C
if (isnan(h) || isnan(t)) {
Serial.println("读取失败(nan):检查上拉和接线");
return;
}
Serial.print("温度: ");
Serial.print(t, 1); // 保留 1 位小数,DHT22 给得出来
Serial.print(" °C 湿度: ");
Serial.print(h, 1);
Serial.println(" %");
}
库的安装、DHT.h 找不到等常见问题,DHT11 那节写得更全,这里不重复。t, 1 那个 1 是打印保留一位小数——DHT22 的分辨率撑得起小数位,DHT11 写小数也只是后面跟个 0,没意义。
让 AI 帮你改代码时,把需求说清楚就行:「ESP32 + DHT22 接 GPIO4,每 2 秒读一次温湿度,串口打印保留一位小数,读到 nan 时提示」,它能直接给你这段。
你应该看到什么
打开串口监视器(波特率 115200),上电两三秒后开始刷:
DHT22 启动,等待读数...
温度: 23.4 °C 湿度: 56.8 %
温度: 23.4 °C 湿度: 56.9 %
温度: 23.5 °C 湿度: 57.1 %
注意看小数位——温度跳到 23.4、23.5,湿度有 56.8、56.9、57.1 这种细变化。这就是 DHT22 比 DHT11 直观的地方:同一个房间,DHT11 可能从头到尾只报「23°C 57%」三个数字纹丝不动,DHT22 能让你看出空气在缓慢变化。
对着嘴呵一口气,或者用手捂住传感器,湿度数字几秒内往上窜十几个点,松手后慢慢回落——这是验证它工作正常最快的办法。
读数解读
- 温度:范围 -40 ~ 80°C,精度约 ±0.5°C,分辨率 0.1°C。负温能正常读,零下环境(如冰箱、冬天户外)显示负数是对的,不是出错。
- 湿度:范围 0 ~ 100%RH,精度约 ±2%,分辨率 0.1%。极端干燥或饱和时边缘精度会差一些,中段最准。
- 稳定时间:刚上电第一两次读数可能偏,等几秒稳定了再信。
- nan:表示这一次没读到有效数据,几乎都是采样太频繁或接触/上拉问题,下一节排查。
把 DHT11 和 DHT22 的指标摆一起看,差距很直观:
| 指标 | DHT11 | DHT22 |
|---|---|---|
| 温度量程 | 0 ~ 50°C | -40 ~ 80°C |
| 温度精度 | ±2°C | ±0.5°C |
| 湿度精度 | ±5% | ±2% |
| 分辨率 | 整数 | 0.1 |
| 采样间隔 | ≥ 1 秒 | ≥ 2 秒 |
选型 / 避坑
DHT22 的采样间隔必须 ≥ 2 秒,比 DHT11(≥1 秒)还慢。loop 里 delay(2000) 不能再短,否则读数会持续返回 nan。这是元件特性,不是 bug,急不来。
挑哪一颗,看你的项目要什么:
- 预算紧、只要室内大概数(提醒一下太干了、记个趋势):DHT11 够用,更便宜。
- 要更准、要测负温、户外或冰箱场景:DHT22,就是本页这颗。
- 要 I2C 接口、体积更小、走标准总线:看 SHT30,三线变两线(SDA/SCL),不占用单总线那套时序,多设备挂总线更省心。
- 要工业级精度、做认真的计量:看 SHT35,精度还能再上一档,价格也对应上去。
简单记:DHT22 是「业余玩家的甜点档」——比 DHT11 准得多,又比 SHT 系列便宜、接线还简单。绝大多数学习项目和家用监测,它都够。
故障排查
| 现象 | 可能原因 | 怎么办 |
|---|---|---|
| 读数全是 nan | 采样间隔 < 2 秒 | delay 至少 2000ms |
| 读数全是 nan | 裸件没加上拉 | DATA-VCC 间加 10kΩ |
| 读数全是 nan | 接触不良 / 杜邦线松 | 重插,焊死,或换线 |
| 第一次读就是 nan | 刚上电没稳定 | 跳过头一两次读数再用 |
| 数字纹丝不动 | DHTTYPE 还是 DHT11 |
改成 DHT22 重新烧录 |
| 温湿度都偏离很多 | 接错脚 / 电压不对 | 核对 VCC、DATA、GND 顺序 |
排查口诀和 DHT11 通用:先看采样间隔,再看上拉,最后看接触。九成 nan 都死在前两条。
进阶 / 变体
把这颗读数玩出花,常见三个方向:
- 接屏幕实时显示:温湿度直接刷到 OLED 或 LCD 上,做个桌面小温湿计,不用一直盯串口。怎么驱动屏幕见 显示屏小项目。
- 数据上云:每隔几分钟把读数传到云平台或自建数据库,画成长期曲线,看一天/一周的温湿度走势——这正是 DHT22 比 DHT11 值得的地方,分辨率高,曲线才平滑好看。
- 接 AI 做判断:读数喂给模型,让它结合时间、历史趋势给提醒(「湿度连续 3 天偏低,该开加湿器了」),而不只是显示一个数。传感器接 AI 的思路见 这一节。
典型应用
- 家庭气象站:客厅/卧室/阳台各放一颗,对比室内外,DHT22 的小数分辨率让曲线有看头。
- 大棚 / 种植监测:温湿度是作物的命门,±2% 的湿度精度够用来判断要不要通风、加湿。
- 冰箱 / 冷链记录:负温量程派上用场,普通 DHT11 在这里直接歇菜。
- 需要稍高精度的长期记录:比 DHT11 准,比工业传感器便宜,做毕设、做家用数据采集刚刚好。
小结
DHT22 是 DHT11 的「无痛升级」——接线一样、库一样、代码只改一行 DHTTYPE,换来的是 ±0.5°C / ±2% 的精度、-40~80°C 的量程和 0.1 的分辨率。代价是采样要慢到 2 秒一次,以及略高的价钱。室内随便看看用 DHT11 就行;想认真记录、想测负温、想要平滑的曲线,DHT22 是性价比最高的那一步。
相关阅读:DHT11(更便宜的入门款) · DS18B20(只测温、可入水) · DHT11 上手教程 · 传感器接 AI · 回传感器总览 · 原理速查
参数以上方 datasheet 为准;本页为公开资料整理,接线与代码请结合实物验证。