在之前的文章中,我们向您介绍了DHT11,这是另一款可供选择的温湿度传感器。而在这篇文章中,我们将为您详细介绍DHT22。乍一看,DHT11和DHT22的唯一区别在于前者采用蓝色外壳,后者采用白色外壳。实际上,它们都属于同一系列的传感器。
DHT11是 DHT22 的“小兄弟”,这意味着它的功能和性能相比 DHT22 有所限制,因此价格更高。DHT11 适用于对测量精度要求不高的项目,而如果您需要更精确的测量,则应选择 DHT22。DHT22 的精度也并非极高,但对于大多数 DIY 项目来说,它的性能已经足够满足需求。
什么是DHT22?

DHT22是一款温湿度传感器,其性能可媲美高精度型号。它在专卖店或大型零售商处均有销售。这使得您可以将所有功能集成到单个设备中,无需再使用单独的温湿度传感器。
你可以单独购买DHT22,也可以购买专为Arduino设计的模块;也就是说,DHT22已经安装在PCB板上,可以直接使用,无需添加上拉电阻等元件。到目前为止,它与DHT11非常相似。而且,由于它使用经过校准的数字信号,因此测量结果也具有很高的可靠性和稳定性。
引脚排列,功能和数据表

上图展示了DHT22和DHT11的引脚图对比,可以看出它们的引脚完全相同。因此,它们的组装方式也完全一样。最棒的是,在项目中,您可以随时将DHT11替换为DHT22,反之亦然,而无需进行太多更改。
请记住,您必须使用 3 个引脚:GND、Vcc 和 Data。引脚 3 未使用,模块上已禁用,这意味着您只会看到三个引脚。如果您想了解所购产品的更多详细信息,可以查阅特定型号和制造商的数据手册以获取所有信息。虽然大多数数值看起来可能相同,但可能存在一些细微差别。其最重要的技术特性如下:
- 3,3v至6v电源
- 2,5mA电流消耗
- 数字量输出信号
- 温度范围为-40ºC至125ºC
- 25ºC温度变化0.5ºC时的测量精度
- 测量温度的分辨率为8位,0,1ºC
- 湿度可从0%RH到100%RH
- 温度在2-5ºC之间时,相对湿度精确度为0%-50%RH
- 分辨率为RH的0,1%,无法拾取低于该值的变化
- 每秒2个样本的采样率:2Hz
- Sparkfun数据表
如果您阅读过我们关于 DHT11 的用户手册,就会知道它通过数据引脚进行数字传输,这是这类传感器的另一大优势。您无需在 Arduino IDE 中编写代码将模拟信号转换为人类可读的值;可以直接处理数字信号,将其转换为温度或相对湿度百分比。
这在一定程度上解释了它为何如此精确,因为它传输的40位帧允许更高的精度。它甚至包含奇偶校验位来检测信号错误。模拟信号不具备这种特性,而且模拟信号对电压变化非常敏感……
与Arduino集成

与 DHT11 类似,使用 Arduino 安装 DHT22 也非常简单。请记住,如果您单独使用 DHT22,未将其安装在模块上,且传感器距离较远(或者您使用较低的电压为其供电),则需要使用上拉电阻连接 Vcc 引脚和数据引脚。但如果您使用模块,则可以跳过此步骤,直接按照上图所示进行连接。此外,请记住,模块上没有未使用的 NC 引脚,这样更容易避免混淆。
你只需要将 GND 和 Vcc 连接到Arduino 板上相应的引脚,也就是本例中标有 GND 和 5V 的引脚。数据引脚可以连接到 Arduino 的任意数字输入引脚;在本例中,我们使用了引脚 7。如果你使用的是其他引脚,请记住调整代码以适应你具体的元件连接(这看似显而易见,但却是将代码复制粘贴到 Arduino IDE 时非常常见的错误)。
Arduino IDE中的代码
现在连接已经完成,我们来看一个简单的 Arduino IDE 代码示例。别忘了,我们提供了一份 Arduino 入门指南(PDF 格式),您可以从这里免费下载,或许对您有所帮助。另外,如果您读过我们关于 DHT11 的文章,您应该记得有一个用于 DHTxx 系列传感器的库;因此,用于 DHT11 的库也可以用于 DHT22。
安装好库并一切准备就绪后,就可以输入代码来对 Arduino 微控制器进行编程,从而使您的项目正常运行。一个简单的示例是:
#include "DHT.h"
// Ejemplo sencillo de uso para el DHT22
const int DHTPin = 7;
DHT dht(DHTPin, DHTTYPE);
void setup() {
Serial.begin(9600);
Serial.println("Test DHT22");
dht.begin();
}
void loop() {
// Tiempo de espera entre tomas de mediciones de 2 segundos.
delay(2000);
// Lee temperatura y humedad durante unos 250ms
float h = dht.readHumidity();
float t = dht.readTemperature();
if (isnan(h) || isnan(t)) {
Serial.println("Fallo en la lectura");
return;
}
Serial.print("Humedad relativa: ");
Serial.print(h);
Serial.print(" %\t");
Serial.print("Temperatura: ");
Serial.print(t);
Serial.print(" *C ");
}
我希望我们关于DHTxx的指南对您有所帮助,虽然通常完成的项目会更复杂一些,但这些用于了解传感器工作原理的代码对于以后修改代码和添加您想要的任何功能都非常有参考价值……