Arduino关于DHT11和DHT22湿度和温度传感器的完整指南

原文地址:https://gndtovcc.home.blog/2020/04/16/complete-guide-for-dht11-dht22-humidity-and-temperature-sensor-with-arduino/

本文是Arduino上流行的DHT11和DHT22温度和湿度传感器的指南。我们将解释其工作原理,展示其某些功能并分享一个Arduino项目示例,您可以对其进行修改以在自己的项目中使用。

DHT11和DHT22]

有关其他流行传感器的更多指南,请查看我们对60多个Arduino教程和项目的汇编: 60多个Arduino项目和教程

介绍DHT11和DHT22传感器

DHT11和DHT22传感器用于测量温度和相对湿度。这些在制造商和电子爱好者中非常受欢迎。

外链图片

这些传感器包含一个芯片,该芯片进行模数转换,并随温度和湿度发出数字信号。这使得它们非常易于与任何微控制器一起使用。

外链图片

DHT11和DHT22

DHT11和DHT22非常相似,但规格不同。下表比较了DHT11和DHT22温度和湿度传感器的一些最重要的规格。要对这些传感器进行更深入的分析,请检查传感器的数据表。

DHT11DHT22
在这里插入图片描述在这里插入图片描述
温度范围0至50ºC +/- 2ºC-40至 80ºC+/-0.5ºC
湿度范围20至90% +/- 5%0至100% +/- 2%
解析度湿度:1% 温度:1ºC湿度:0.1% 温度:0.1ºC
工作电压3 – 5.5 V直流直流3 – 6 V
供电0.5 – 2.5毫安1 – 1.5毫安
采样期1秒2秒

DHT22传感器具有更好的分辨率以及更宽的温度和湿度测量范围。但是,它有点贵,并且您只能以2秒的间隔请求读数。

DHT11的范围更小,准确度也更低。但是,您可以每秒请求一次传感器读数。它也便宜一些。

尽管它们有所不同,但它们的工作方式相似,您可以使用相同的代码读取温度和湿度。您只需要在代码中选择要使用的传感器类型。

DHT引脚排列

DHT传感器具有四个引脚,如下图所示。但是,如果将DHT传感器放在分线板上,则它只有三个引脚,引脚2上带有内部上拉电阻。

img

下表显示了DHT22和DHT11的引脚排列。当传感器面对您时,插针编号从左到右从1开始

DHT引脚连接到
1个5伏
2个任何数字GPIO; 还连接一个10k欧姆上拉电阻
3不要连接
4地线

带Arduino的DHT11温湿度传感器

在本节中,我们将使用Arduino构建一个简单的项目,该项目读取温度和湿度并将结果显示在串行监视器上。

所需零件

要完成本教程,您需要以下组件:

  • Arduino UNO –阅读最佳Arduino入门套件
  • DHT11温湿度传感器
  • 面包板
  • 4.7k欧姆电阻
  • 跳线

原理图

按照下一个示意图将DHT11(或DHT22)温度和湿度传感器连接到Arduino。
在这里插入图片描述
这里是连接(从左到右):

DHT引脚Arduino的
pin15伏
pin2D2或任何其他数字引脚
pin3不要连接
pin4地线

注意: 如果您使用的模块带有DHT传感器,则通常仅带有三个引脚。引脚上应标有标签,以便您知道如何对其进行接线。此外,这些模块中的许多模块已经带有内部上拉电阻,因此您无需在电路中增加一个。

安装库

要读取DHT传感器,我们将使用AdafruitDHT库。要使用此库,您还需要安装 Adafruit Unified Sensor库。请按照以下步骤安装这些库。

打开您的Arduino IDE并转到 “草图” >“ 包含库” >“ 管理库”。图书馆管理器应打开。

在“搜索”框中搜索“ DHT ”,然后从Adafruit安装DHT库。

外链图片

从Adafruit安装DHT库后,在搜索框中键入“ Adafruit Unified Sensor ”。一直向下滚动以找到该库并进行安装。

外链图片

安装库后,重新启动Arduino IDE。

代码

安装必要的库之后,您可以从库中上传示例代码。

在您的Arduino IDE中,转到“ 文件” >“ 示例” >“ DHT传感器库” >“ DHTtester”

以下代码应加载。它读取温度和湿度,并将结果显示在串行监视器中。

// Example testing sketch for various DHT humidity/temperature sensors
// Written by ladyada, public domain

// REQUIRES the following Arduino libraries:
// - DHT Sensor Library: https://github.com/adafruit/DHT-sensor-library
// - Adafruit Unified Sensor Lib: https://github.com/adafruit/Adafruit_Sensor

#include "DHT.h"

#define DHTPIN 2     // Digital pin connected to the DHT sensor
// Feather HUZZAH ESP8266 note: use pins 3, 4, 5, 12, 13 or 14 --
// Pin 15 can work but DHT must be disconnected during program upload.

// Uncomment whatever type you're using!
//#define DHTTYPE DHT11   // DHT 11
#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321
//#define DHTTYPE DHT21   // DHT 21 (AM2301)

// Connect pin 1 (on the left) of the sensor to +5V
// NOTE: If using a board with 3.3V logic like an Arduino Due connect pin 1
// to 3.3V instead of 5V!
// Connect pin 2 of the sensor to whatever your DHTPIN is
// Connect pin 3 (on the right) of the sensor to GROUND (if your sensor has 3 pins)
// Connect pin 4 (on the right) of the sensor to GROUND and leave the pin 3 EMPTY (if your sensor has 4 pins)
// Connect a 10K resistor from pin 2 (data) to pin 1 (power) of the sensor

// Initialize DHT sensor.
// Note that older versions of this library took an optional third parameter to
// tweak the timings for faster processors.  This parameter is no longer needed
// as the current DHT reading algorithm adjusts itself to work on faster procs.
DHT dht(DHTPIN, DHTTYPE);

void setup() {
  Serial.begin(9600);
  Serial.println(F("DHTxx test!"));

  dht.begin();
}

void loop() {
  // Wait a few seconds between measurements.
  delay(2000);

  // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  float h = dht.readHumidity();
  // Read temperature as Celsius (the default)
  float t = dht.readTemperature();
  // Read temperature as Fahrenheit (isFahrenheit = true)
  float f = dht.readTemperature(true);

  // Check if any reads failed and exit early (to try again).
  if (isnan(h) || isnan(t) || isnan(f)) {
    Serial.println(F("Failed to read from DHT sensor!"));
    return;
  }

  // Compute heat index in Fahrenheit (the default)
  float hif = dht.computeHeatIndex(f, h);
  // Compute heat index in Celsius (isFahreheit = false)
  float hic = dht.computeHeatIndex(t, h, false);

  Serial.print(F("Humidity: "));
  Serial.print(h);
  Serial.print(F("%  Temperature: "));
  Serial.print(t);
  Serial.print(F("°C "));
  Serial.print(f);
  Serial.print(F("°F  Heat index: "));
  Serial.print(hic);
  Serial.print(F("°C "));
  Serial.print(hif);
  Serial.println(F("°F"));
}
代码如何工作

首先包括DHT库:

#include "DHT.h"

然后,定义DHT传感器连接的引脚。在这种情况下,它连接到数字引脚2。

#define DHTPIN 2 // what digital pin we're connected to

然后,您需要定义您正在使用的DHT传感器类型。在我们的示例中,我们使用的是DHT11。

#define DHTTYPE DHT11 // DHT 11

如果您正在使用其他DHT传感器,则需要注释上一行,并取消注释以下其中一项:

//#define DHTTYPE DHT22 // DHT 22 (AM2302)
//#define DHTTYPE DHT21 // DHT 21 (AM2301)

然后,使用引脚和您先前定义的类型初始化一个名为dht的DHT对象:

DHT dht(DHTPIN, DHTTYPE);

在setup()中,以9600的波特率初始化串行监视器,以进行调试。

erial.begin(9600);
Serial.println("DHTxx test!");

使用.begin()方法初始化DHT传感器。

dht.begin();

在loop()的开头,有2秒的延迟。需要此延迟,以使传感器有足够的时间进行读数。DHT22的最大采样率为2秒,DHT11的最大采样率为1秒。

delay(2000);

读取温度和湿度非常简单。为了获得湿度,您只需要在dht对象上使用readHumidity()方法。在这种情况下,我们将湿度保存在h变量中。请注意,readHumidity()方法返回的是float类型的值。

float h = dht.readHumidity();

同样,要读取温度,请使用readTemperature()方法。

float t = dht.readTemperature();

要获取以华氏度为单位的温度,只需将true传递给readTemperature()方法,如下所示:

float f = dht.readTemperature(true);

该库还提供了以华氏度和摄氏度计算热量指数的方法:

// Compute heat index in Fahrenheit (the default)
float hif = dht.computeHeatIndex(f, h);
// Compute heat index in Celsius (isFahreheit = false)
float hic = dht.computeHeatIndex(t, h, false);

最后,所有读数都显示在串行监视器上。

Serial.print("Humidity: ");
Serial.print(h);
Serial.print(" %\t");
Serial.print("Temperature: ");
Serial.print(t);
Serial.print(" *C ");
Serial.print(f);
Serial.print(" *F\t");
Serial.print("Heat index: ");
Serial.print(hic);
Serial.print(" *C ");
Serial.print(hif);
Serial.println(" *F");

示范

将代码上传到Arduino之后,以9600的波特率打开Serial Monitor。您应该每两秒钟获取一次传感器读数。这是您在Arduino IDE串行监视器中应该看到的内容。

img

故障排除–无法从DHT传感器读取

如果您尝试从DHT11 / DHT22传感器读取温度和湿度,并且在串行监视器中收到错误消息,请按照以下步骤查看是否可以使传感器正常工作(或阅读我们专用的 DHT故障排除指南) 。

“无法从DHT传感器读取!” 或Nan读数

如果您的DHT传感器返回错误消息“无法从DHT传感器读取!” 或DHT读数返回“ Nan”:

img

请尝试以下故障排除提示之一:

  • 接线: 构建电子项目时,需要仔细检查接线或引脚分配。在检查并测试电路是否正确连接后,如果仍然无法正常工作,请继续阅读以下故障排除提示。
  • 电源: DHT传感器的工作范围为3V至5.5V(DHT11)或3V至6V(DHT22)。如果您是通过3.3V引脚为传感器供电,则在某些情况下,以5V为DHT供电可以解决该问题。
  • USB端口或USB电缆 损坏**:**有时仅通过PC USB端口直接为Arduino供电是不够的。尝试将其插入由外部电源供电的USB集线器。这也可能有助于用更好或更短的USB电缆代替USB电缆。拥有可提供足够电力的USB端口或使用良好的USB电缆通常可以解决此问题。
  • 电源: 如前一技巧中所述,您的Arduino可能无法提供足够的功率以正确地从DHT传感器读取数据。在某些情况下,您可能需要使用提供更多电流的电源为Arduino供电。
  • 传感器类型: 仔细检查您的代码中未注释/注释过的项目适用的传感器。在这个项目中,我们使用的是DHT22:
//#define DHTTYPE DHT11  // DHT 11
#define DHTTYPE DHT22  // DHT 22 (AM2302), AM2321
//#define DHTTYPE DHT21  // DHT 21 (AM2301)
  • 采样率: DHT传感器获取读数的速度非常慢(传感器读数最多可能需要2秒钟)。在某些情况下,增加两次读数之间的时间可以解决该问题。
  • DHT传感器油炸或破碎: 不幸的是,这些便宜的传感器有时看起来完全正常,但它们却被油炸/破碎。因此,即使您组装了正确的电路和代码,它仍将无法获得读数。尝试使用其他传感器,看看它是否可以解决您的问题。
  • 错误的波特率或无法上传代码: 如果您在Arduino IDE串行监视器中没有看到任何内容,请再次检查您是否选择了正确的波特率,COM端口或您是否成功上传了代码。

在构建项目时,我们在DHT方面遇到了类似的问题,始终可以通过采用上述方法之一来解决它。

致命错误:Adafruit_Sensor.h:没有此类文件或目录

当您尝试编译代码时,还会发生一个常见错误。如果收到以下错误:

fatal error: Adafruit_Sensor.h: No such file or directory 
#include <Adafruit_Sensor.h>

您需要安装Adafruit Unified Sensor驱动程序库。在您的Arduino IDE中,输入搜索框“ Adafruit Unified Sensor ”,一直向下滚动以查找该库并进行安装。

img

安装库之后,重新启动Arduino IDE,并且代码应该编译而不会出现错误消息。

包起来

DHT11和DHT22传感器为使用Arduino提供温度和湿度测量提供了一种简单而廉价的方法。接线非常简单–您只需要将DHT数据引脚连接到Arduino数字引脚即可。

借助DHT库,编写获取温度和湿度的代码也很简单。获取温度和湿度读数就像使用readTemperature()和readHumidity()方法一样简单。

希望本指南对您有所帮助。DHT11 / DHT22温湿度传感器的其他指南:

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐