DHT22 温湿度传感器是一款多功能且经济高效的传感器,用于测量环境温度和湿度,应用范围广泛。它基于数字信号输出,可以提供高精度测量,温度分辨率为 0.1 摄氏度,湿度分辨率为 0.1%。该传感器采用电容式湿度传感元件和热敏电阻分别测量湿度和温度。DHT22 传感器的功耗也相对较低,可在 3.3V 至 5V 的电压范围内工作,使其适用于电池供电项目。
此外,该传感器具有长期稳定性和高可靠性,这使其成为暖通空调等各种应用的完美选择,气象站和室内空气质量监测系统。因此,在本教程中,IC先生网www.mrchip.cn决定将DHT22 与 Arduino UNO 连接起来,在此过程中,我们将让您了解所有细节,所以不用多说,让我们开始吧。
DHT22温湿度传感器模块
DHT22模块共有3个引脚。而DHT22 裸骨传感器有 4 个引脚。如果我们考虑三个引脚中的模块,其中两个是电源引脚,一个是数据引脚。如果我们查看 4 针传感器,则额外的针是 NC 针,它没有任何功能。模块和传感器的引脚图如下所示。
DHT22 模块引出线
下图显示了 DHT22 模块的引脚排列。
DATA用于 1-Wire 通信的数据引脚
GND模块的接地引脚,连接到 Arduino 的接地引脚。
VCC模块的电源引脚。
Not Used在此传感器中,未使用此引脚。
DHT22 传感器模块的零件标记
除传感器外,DHT22 模块在 PCB 上仅包含两个组件。一个上拉电阻和一个去耦电容,DHT22模块的零件标记如下所示。
DHT22模块电路图
DHT22温湿度传感器模块完整原理图如下图:
DHT22模块的原理图如上所示。如前所述,董事会只有几名成员。VCC 和 GND 引脚直接连接到 DHT22,上拉电阻连接到 DATA 引脚。钽电容和多层电容提供足够的滤波。作为电源指示,在某些 PCB 中,您可以找到 LED 指示灯,但对于大多数电路板来说,LED 是不存在的。
DHT22传感器模块常见问题
问:简而言之,DHT22 是什么?
DHT22 是 DHT11 传感器的更昂贵版本,显然具有更好的规格。其温度测量范围为 -40 至 +125 摄氏度,精度为 +-0.5 度,而 DHT11 温度范围为 0 至 50 摄氏度,精度为 +-2 度。
问:DHT22 是模拟的还是数字的?
DHT-22(也称为 AM2302)是一种数字输出相对湿度和温度传感器。
问:DHT22 防水吗?
不,它不防水。
问:DHT11 传感器的采样率是多少?
DHT22 的采样率为 1Hz。
问:DHT22 使用什么协议?
DHT22 传感器使用专有的单总线通信协议,可以通过计算的定时脉冲发送和接收数据。
DHT22 是如何工作的?
如果您使用的是原装 DHT22 传感器,那么它里面会有一个NTC热敏电阻和传感器模块,但是您在市场上可以找到的大多数传感器大多是非原装零件,并且在里面您会发现一个小传感器,您可以可以在下图中看到。
湿度传感元件由夹在两个电极之间的保湿基板组成。当基材吸收水分时,两个电极之间的电阻会降低。两个电极之间的电阻变化与相对湿度成正比。较高的相对湿度会降低电极之间的电阻,而较低的相对湿度会增加电极之间的电阻。这种电阻变化是通过板载 MCU 的 ADC 测量的,并计算出相对湿度。
每个DHT22元件都经过实验室严格校准,湿度校准极其准确。校准系数作为程序存储在 OTP 存储器中,供传感器内部信号检测过程使用。
DHT22单总线通信协议
单总线通信协议用于与 DHT22 和微控制器通信。样本数据大约需要 4 毫秒才能运行完毕。此数据由小数部分和整数部分组成。总数据为 40 位长,为 MSB 格式。数据格式如下:8bit 整数RH 数据+8bit 十进制RH 数据+8bit 整数T 数据+8bit 十进制T 数据+8bit 校验和。如果数据传输正确,则校验和应为“8bit整数RH数据+8bit十进制RH数据+8bit整数T数据+8bit十进制T数据”的最后8bit。
当MCU发送启动信号DHT从低功耗模式变为运行模式,并将所有40位数据转储给微控制器,微控制器读取数据并根据二进制数据计算温度和湿度。
上图显示了数据通信如何与微控制器和 DHT22 一起工作。
将 DHT22 传感器与 Arduino 连接的电路图
现在我们已经完全了解 DHT22 传感器的工作原理,我们可以将所有必需的电线连接到 Arduino 并编写代码以从传感器中获取所有数据。下图显示了 DHT22 传感器模块与 Arduino 接口的电路图。
连接很简单,只需要三根电线。将模块的 VCC 和 GND 连接到 Arduino 的 5V 和 GND 引脚。然后将DATA引脚连接到Arduino的数字引脚2。我们通过这个引脚与DHT22进行通信。
用于连接传感器模块的 Arduino DHT22 代码
现在让我们看看连接 DHT22 传感器的代码。首先通过库管理器安装 Adafruit 的DHT 传感器库和Adafruit 统一传感器驱动程序。然后创建一个空白草图并将本文末尾的代码粘贴到其中。
#include <Wire.h>
#include "DHT.h"
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
一开始,我们包含了所有必要的库,并将传感器类型定义为 DHT22,将传感器引脚定义为数字引脚 2。然后为 DHT 库创建了一个实例。
#define DHTTYPE DHT22
Adafruit_SSD1306 display = Adafruit_SSD1306(128, 64, &Wire, -1);
unsigned long delayTime;
uint8_t DHTPin = 2;
DHT dht(DHTPin, DHTTYPE);
float Temperature;
float Humidity;
float Temp_Fahrenheit;
接下来,我们有 setup() 函数,在 setup 函数中我们初始化串口用于调试,我们初始化 DHT,我们还初始化显示。我们还设置了文本大小并使显示颜色为白色。
void setup() {
Serial.begin(115200);
pinMode(DHTPin, INPUT);
dht.begin();
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.display();
delay(100);
display.clearDisplay();
display.display();
display.setTextSize(1.75);
display.setTextColor(WHITE);
}
接下来,我们有循环函数,在循环函数中我们获取湿度、温度以及以摄氏度和华氏度为单位的温度。
void loop(){
Humidity = dht.readHumidity();
// Read temperature as Celsius (the default)
Temperature = dht.readTemperature();
// Read temperature as Fahrenheit (isFahrenheit = true)
Temp_Fahrenheit = dht.readTemperature(true);
// Check if any reads failed and exit early (to try again).
if (isnan(Humidity) || isnan(Temperature) || isnan(Temp_Fahrenheit)) {
Serial.println(F("Failed to read from DHT sensor!"));
return;
}
}
接下来,我们在串行监视器和 OLED 上打印数据
Serial.print(F("Humidity: "));
Serial.print(Humidity);
Serial.print(F("% Temperature: "));
Serial.print(Temperature);
Serial.print(F("°C "));
Serial.print(Temp_Fahrenheit);
Serial.println(F("°F "));
display.setCursor(0, 0);
display.clearDisplay();
display.setTextSize(1);
display.setCursor(0, 0);
display.print("Temperature: ");
display.setTextSize(2);
display.setCursor(0, 10);
display.print(Temperature);
display.print(" ");
display.setTextSize(1);
display.cp437(true);
display.write(167);
display.setTextSize(2);
display.print("C");
display.setTextSize(1);
display.setCursor(0, 35);
display.print("Humidity: ");
display.setTextSize(2);
display.setCursor(0, 45);
display.print(Humidity);
display.print(" %");
display.display();
delay(1000);
}
代码
#include <Wire.h>
#include "DHT.h"
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
void setup() {
Serial.begin(115200);
pinMode(DHTPin, INPUT);
dht.begin();
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.display();
delay(100);
display.clearDisplay();
display.display();
display.setTextSize(1.75);
display.setTextColor(WHITE);
}
void loop(){
Humidity = dht.readHumidity();
// Read temperature as Celsius (the default)
Temperature = dht.readTemperature();
// Read temperature as Fahrenheit (isFahrenheit = true)
Temp_Fahrenheit = dht.readTemperature(true);
// Check if any reads failed and exit early (to try again).
if (isnan(Humidity) || isnan(Temperature) || isnan(Temp_Fahrenheit)) {
Serial.println(F("Failed to read from DHT sensor!"));
return;
}
Serial.print(F("Humidity: "));
Serial.print(Humidity);
Serial.print(F("% Temperature: "));
Serial.print(Temperature);
Serial.print(F("°C "));
Serial.print(Temp_Fahrenheit);
Serial.println(F("°F "));
display.setCursor(0, 0);
display.clearDisplay();
display.setTextSize(1);
display.setCursor(0, 0);
display.print("Temperature: ");
display.setTextSize(2);
display.setCursor(0, 10);
display.print(Temperature);
display.print(" ");
display.setTextSize(1);
display.cp437(true);
display.write(167);
display.setTextSize(2);
display.print("C");
display.setTextSize(1);
display.setCursor(0, 35);
display.print("Humidity: ");
display.setTextSize(2);
display.setCursor(0, 45);
display.print(Humidity);
display.print(" %");
display.display();
delay(1000);
}