DHT11与DHT22温湿度传感器怎么选怎么接

2026-11-13 20:18:31 33阅读

想给温室、孵化箱或者窗台上的小气象站加一路温湿度监测,DHT11 和 DHT22 大概率是你最先碰到的两颗传感器。出厂就校准好,VCC、DATA、GND 三根线接上,装个库就能读数,几乎不需要任何外围元件。

先把结论放在最前面:这两颗传感器引脚定义完全相同、接线一模一样,代码也只差一个函数名,差异全在量程和精度上。所以选型看你的使用环境,接线照着下文抄就行。这篇把参数、内部结构、接线、库和两段完整代码一次讲全。

DHT11与DHT22温湿度传感器实拍

两代参数差在哪,一张表说清

DHT22 的官方型号是 AM2302,出自广州奥松电子(ASAIR);DHT11 也是奥松的产品线。两颗的参数我都按奥松官网现行的产品手册逐项核过,先看汇总:

项目DHT11DHT22(AM2302)
供电电压3.3~5.5V3.3~5.5V
电流量程待机 0.06mA / 测量 1mA睡眠 2μA / 测量 1.2mA
湿度量程与精度5~95%RH,±5%RH(25℃)0~100%RH,典型 ±2%RH
温度量程与精度-20~60℃,±2℃(25℃)-40~80℃,典型 ±0.5℃
采样周期大于 2 秒一次2 秒一次
尺寸15.5×12×5.5mm15.1×25×7.7mm
定位极低成本更高精度与更宽量程

这里要替新手排一个雷:网上大量教程把 DHT11 写成"湿度 20~80%、温度 0~50℃、1Hz 采样",把 DHT22 写成"温度到 125℃"。前者是老版手册的口径,奥松现行的 DHT11 产品手册已经放宽到 5~95%RH、-20~60℃,采样周期标的是大于 2 秒一次;后者与官方 AM2302 技术手册不符,手册标定的量程就是 -40~80℃,125℃ 这个数不要采信。规格值以数据手册为准,这是买器件前该养成的习惯。

价格方面,奥松官网没有公布零售价(截至2026年11月13日官方未公布),渠道价随封装和批次浮动很大。行情级的判断是可靠的:DHT11 明显更便宜,DHT22 要贵一截,差价换来的就是量程和精度。怎么选一句话:室内常温监测、批量布置、预算紧,用 DHT11;冷库、温室大棚、户外,或者要做温控闭环(比如孵化箱)这种对精度敏感的场景,直接上 DHT22。

拆开看:电容感湿件、NTC 热敏电阻,外加一颗 ASIC

把蓝色(DHT11)或白色(DHT22)的塑料外壳拆掉,里面是两组敏感元件加一颗处理芯片:

DHT11与DHT22传感器内部结构实拍

感湿部分是电容式方案:两片金属电极中间夹一层吸湿材料(通常是盐类或导电聚合物)。空气里的水汽被材料吸附后会释放离子,改变材料的介电常数,两极间的电容随之变化——湿度越高电容变化越大,测出这个变化就得到了相对湿度。

测温部分是一只 NTC 热敏电阻。NTC 指负温度系数:温度升高,阻值下降。它跟普通电阻的区别在于变化幅度被刻意做大,温度每变 1℃,阻值可以变化 100Ω 这个量级,普通电阻那种微小漂移根本没法用。

第三样东西是一颗 ASIC 芯片,负责把两路模拟信号按出厂校准值换算、做模数转换,最后通过单总线输出数字量。这也是 DHT 系列对新手最友好的地方:你拿到的直接是校准过的数字读数,不需要自己搭放大电路、也不需要二次标定。

引脚与接线:四个脚,一个 10kΩ 上拉

两颗传感器都是四脚封装,脚距 0.1 英寸,可以直接插进面包板。引脚顺序看下图:

DHT11与DHT22引脚定义图

  • VCC:供电。3.3~5.5V 都能工作,但建议用 5V——官方教程口径是 5V 供电时传感器可以拉到离主控 20 米远,3.3V 供电建议控制在 1 米以内,线一长压降会把读数带偏。
  • DATA:单总线数据脚。裸传感器要在 DATA 和 VCC 之间加一只 10kΩ 上拉电阻,保证信号电平干净;如果买的是三脚模块版,上拉已经焊在板上,可以省掉。
  • NC:空脚,悬空不管。
  • GND:接地。

接到 Arduino UNO 就是三根线加一只电阻:

DHTxx 引脚Arduino UNO备注
VCC5V—
GNDGND—
DATA数字脚 D8与 5V 之间接 10kΩ 上拉

DHT11 的接线如图:

DHT11接Arduino UNO接线图

DHT22 的接法完全相同:

DHT22接Arduino UNO接线图

这就是前面说"换传感器不用动线"的原因:两颗引脚排列一致,换上去只需要改一行代码。

装上 DHTlib,串口先把数读出来

DHT 系列用的是自家单总线协议:不是标准协议,思路类似 Dallas 1-Wire,靠非常精确的时序传递数据。不用去啃时序细节,装 Rob Tillaart 维护的 DHTlib 就够了。安装路径:Arduino IDE 左侧打开库管理器,搜索 dhtlib,认准作者 Rob Tillaart,点 Install。

第一段例程把温湿度打到串口监视器,波特率 9600:

#include "dht.h"
#define dataPin 8  // Defines pin number to which the sensor is connected
dht DHT;           // Creates a DHT object

void setup() {
  Serial.begin(9600);
}
void loop() {
  //Uncomment whatever type you're using!
  int readData = DHT.read22(dataPin); // DHT22/AM2302
  //int readData = DHT.read11(dataPin);  // DHT11

  float t = DHT.temperature;  // Gets the values of the temperature
  float h = DHT.humidity;     // Gets the values of the humidity

  // Printing the results on the serial monitor
  Serial.print("Temperature = ");
  Serial.print(t);
  Serial.print(" °C | ");
  Serial.print((t * 9.0) / 5.0 + 32.0);  //print the temperature in Fahrenheit
  Serial.println(" °F ");
  Serial.print("Humidity = ");
  Serial.print(h);
  Serial.println(" % ");
  Serial.println("");

  delay(2000);  // Delays 2 secods
}

按站内代码块的显示习惯,头文件写成 #include "dht.h",与 #include 在 Arduino 工具链下是编译等价的写法,其余代码未做任何改动。逐段拆一下:

开头的 #include "dht.h" 引入库,define dataPin 8 声明传感器数据脚接在 D8,dht DHT 实例化一个传感器对象。setup() 里 Serial.begin(9600) 打开串口,方便电脑上看读数。

loop() 里最关键的一行是 readData:用 DHT22 就调 DHT.read22(dataPin),用 DHT11 就注释掉这行、放开 DHT.read11(dataPin) 那行——换传感器就是改这一处。读出来的值通过 DHT.temperature 和 DHT.humidity 两个成员取走。

打印部分把摄氏温度顺手换算成华氏,公式是 T(°F) = T(°C) × 9/5 + 32。最后 delay(2000) 很重要:传感器两次读数之间需要恢复时间,读得太勤拿到的不是新数据,两秒一次是手册口径的采样周期。

烧录后打开串口监视器,应该能看到这样的输出:

串口监视器温湿度读数输出

进阶一步:把读数打上 16x2 液晶

做孵化箱这类独立小设备时,总拖着电脑看串口不现实。加一块 16x2 字符液晶,脱离电脑也能随时读数。液晶按标准四线接法挂在 D12、D11、D5、D4、D3、D2,DHT 那三根线原样不动:

16x2液晶显示温湿度读数实拍

完整例程如下:

#include "LiquidCrystal.h"  // includes the LiquidCrystal Library
#include "dht.h"

#define dataPin 8
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);  // Creates an LCD object. Parameters: (rs, enable, d4, d5, d6, d7)
dht DHT;
bool showcelciusorfarenheit = false;

void setup() {
  lcd.begin(16, 2);  // Initializes the interface to the LCD screen, and specifies the dimensions (width and height) of the display
}

void loop() {
  int readData = DHT.read22(dataPin);
  float t = DHT.temperature;
  float h = DHT.humidity;
  lcd.setCursor(0, 0);   // Sets the location at which subsequent text written to the LCD will be displayed
  lcd.print("Temp.: ");  // Prints string "Temp." on the LCD

  //Print temperature value in Celcius and Fahrenheit every alternate cycle
  if (showcelciusorfarenheit) {
    lcd.print(t);  // Prints the temperature value from the sensor
    lcd.print(" ");
    lcd.print((char)223);  //shows degrees character
    lcd.print("C");
    showcelciusorfarenheit = false;
  } else {
    lcd.print((t * 9.0) / 5.0 + 32.0);  // print the temperature in Fahrenheit
    lcd.print(" ");
    lcd.print((char)223);  //shows degrees character
    lcd.print("F");
    showcelciusorfarenheit = true;
  }

  lcd.setCursor(0, 1);
  lcd.print("Humi.: ");
  lcd.print(h);
  lcd.print(" %");
  delay(5000);
}

这段的逻辑和串口版一致,只是输出目标换成 lcd 对象。有个小设计值得留意:showcelciusorfarenheit 这个布尔量让第一行在摄氏和华氏之间每个循环交替显示,第一行不会出现小数点后溢出截断的问题;第二行固定显示湿度百分比。周期拉长到 5 秒一次,液晶读起来更从容。

整套东西的成本就是一块主控加一颗传感器加一块 1602,一下午能搭完。往后想升级,BME280 这类 I2C 传感器在精度和响应速度上都是明确的下一步,但作为环境监测的第一课,DHT 这对兄弟依然是性价比最顺的起点。


作者:电机传感器师
链接:https://www.aiddithome.com/p/58b57f0b5759b.html
本作版权归作者所有,未经允许请勿转载。若存在违规行为,您可以点击 “举报”。


登录 后发表评论
5条评论
拆开看看再说
1楼 · 11小时前

手册那部分说得挺到位。DHT11 的 20-80%、0-50℃ 确实是老手册口径,现行的 V1.3 已经放宽到 5-95%RH、-20~60℃,采样周期也标的是大于 2 秒一次。之前照老教程 delay(1000) 读 DHT11,偶尔会读到上一次的旧值,老老实实 delay(2000) 才稳。规格值跟着数据手册走,这个习惯值得养成。

触底反弹的Tony
2楼 · 11小时前

10k 上拉这个坑踩过,裸传感器不接上拉读出来全是乱码,接上立马正常,模块版确实省心。

好说好说
3楼 · 11小时前

被 125℃ 那个数坑过的举手,手册明明写的就是 -40 到 80。

参数党小马
4楼 · 11小时前

刚用 DHT22 做完孵化箱温控,±0.5℃ 够用,记得两秒才出一个新读数就行。

线比代码多
5楼 · 11小时前

DHT11 便宜,学生党烧了坏了都不心疼,入门就从它开始。