Skip to content

Arduino - 湿度传感器

现代电子项目通常需要感知环境。在本教程中,我们将探讨如何将传感器连接到您的Arduino。我们将重点介绍流行的 DHT22 传感器,用于测量湿度和温度,这是气象站、家庭自动化和农业技术中的常见任务。

虽然本指南主要关注DHT22,但其原理适用于多种数字传感器。我们还将简要讨论其他流行的传感器,例如用于更高级项目的BME280。

DHT22(也称作AM2302)是一种多功能且低成本的数字传感器,用于测量相对湿度和温度。它将一个电容式湿度传感器和一个热敏电阻集成在一个单元中,通过单线数字接口进行通信,使其易于与Arduino等微控制器 (microcontroller) 配合使用。

  • 电源: 3.3V - 5V DC
  • 电流: 测量期间最大2.5mA
  • 湿度范围: 0-100%,精度2-5%
  • 温度范围: -40至80°C,精度±0.5°C
  • 接口: 数字 (1-Wire)

要构建此项目,您需要:

  • 1 × Arduino Uno R3 (或任何其他Arduino板)
  • 1 × 面包板 (Breadboard)
  • 1 × DHT22传感器
  • 1 × 10kΩ电阻 (作为上拉电阻 pull-up resistor)
  • 杜邦线 (Jumper wires)

连接DHT22很简单。请仔细遵循以下接线方式。当传感器网格面朝向您时,DHT22的引脚通常从左到右编号为1到4。

  • DHT22引脚1 (VCC) → Arduino 5V
  • DHT22引脚2 (Data) → Arduino数字引脚2
  • DHT22引脚3 (NC) → 不连接 (留空)
  • DHT22引脚4 (GND) → Arduino GND

关键步骤: 为了可靠通信,需要一个上拉电阻 (pull-up resistor)。将 10kΩ电阻 连接在DHT22的 引脚1 (VCC) 和 引脚2 (Data) 之间。

在编写代码之前,您需要安装一个库来处理DHT传感器的复杂通信协议。我们将使用流行的 Adafruit DHT传感器库。

  1. 打开Arduino IDE(推荐使用2.0及以上版本)。
  2. 导航到 工具 > 管理库… (Tools > Manage Libraries…) 或点击左侧的库管理器图标。
  3. 在搜索栏中,输入 DHT sensor library。
  4. 找到Adafruit的库并点击 安装 (Install)。IDE可能会要求安装 Adafruit Unified Sensor 等依赖项。点击 全部安装 (Install All)。

创建一个新的草图 (sketch) 并粘贴以下代码。此代码初始化传感器,每两秒读取一次湿度和温度,并将数值打印到串行监视器 (Serial Monitor)。

/**
* @file dht22_modern_example.ino
* @author Your Name
* @brief 一个现代、简洁的DHT22传感器温湿度读取示例。
* @version 0.1
* @date 2023-10-27
*/
// 包含所需库
#include <Adafruit_Sensor.h>
#include "DHT.h"
// --- 常量 ---
// 定义我们正在使用的DHT传感器类型 (DHT11, DHT21, DHT22)
#define DHTTYPE DHT22
// 定义DHT传感器连接到的数字引脚
const int DHT_PIN = 2;
// --- 全局对象 ---
// 初始化DHT传感器对象
DHT dht(DHT_PIN, DHTTYPE);
void setup() {
// 启动串口通信用于调试
Serial.begin(9600);
Serial.println(F("\nDHT22 Sensor Test!"));
// 初始化传感器
dht.begin();
}
void loop() {
// 在两次测量之间等待几秒。
// DHT22传感器速度较慢,只能每2秒读取一次。
delay(2000);
// 读取温度或湿度大约需要250毫秒!
// 传感器读数可能也会“旧”达2秒(它是一个非常慢的传感器)。
float humidity = dht.readHumidity();
// 读取摄氏温度(默认)
float temperature_c = dht.readTemperature();
// 检查是否有任何读取失败,并提前退出(以便再次尝试)。
// isnan() 检查一个值是否为“非数字”(Not-a-Number),这表示读取错误。
if (isnan(humidity) || isnan(temperature_c)) {
Serial.println(F("Error: Failed to read from DHT sensor!"));
return; // 退出 loop() 函数,在下一次迭代中重试
}
// --- 数据处理与输出 ---
// (可选)将温度转换为华氏度
float temperature_f = temperature_c * 1.8 + 32.0;
// 将结果打印到串行监视器,带有清晰的标签和单位。
Serial.print(F("Humidity: "));
Serial.print(humidity);
Serial.println(F(" %"));
Serial.print(F("Temperature: "));
Serial.print(temperature_c);
Serial.print(F(" °C / "));
Serial.print(temperature_f);
Serial.println(F(" °F"));
}
  • #include指令: 这些指令加载DHT传感器和底层Adafruit传感器框架所需的库。
  • #define和const int: 我们使用它们来定义传感器类型和引脚号。使用常量使代码更易读和修改。
  • DHT dht(DHT_PIN, DHTTYPE);: 这会创建一个DHT对象实例,告诉库要使用哪个引脚以及传感器类型。
  • dht.begin();: 在setup()函数中,这会初始化与传感器的通信。
  • dht.readHumidity()和dht.readTemperature(): 在loop()函数中,这些函数从传感器检索最新数据。
  • 错误处理: if (isnan(humidity) || ...) 代码块至关重要。它检查传感器是否返回了有效数字。如果不是,它会打印错误消息并跳过循环的其余部分,防止您的程序使用无效数据。
  1. 将代码上传到您的Arduino板。
  2. 打开串行监视器 (工具 > 串行监视器 或 Ctrl+Shift+M)。
  3. 确保波特率 (baud rate) 设置为 9600。
  4. 您应该会看到湿度和温度读数每两秒更新一次。
  • Error: Failed to read from DHT sensor! (错误:无法从DHT传感器读取!): 这是最常见的问题。请仔细检查您的接线,特别是VCC和GND。确保10kΩ上拉电阻正确连接在Data和VCC线之间。验证您在代码中定义了正确的DHT_PIN。
  • 读数显示nan或0: 这也表明存在接线或电源问题。某些DHT传感器较为敏感;请确保您的Arduino提供稳定的5V电源。
  • 代码编译失败: 确保您已正确安装 Adafruit DHT传感器库 及其依赖项。

既然您已经能够读取环境数据,那么可能性是无限的!

  • 迷你项目:简易恒温器: 添加两个LED(例如红色和蓝色)。如果温度超过某个阈值,则点亮红色LED;如果低于另一个阈值,则点亮蓝色LED。
  • 进阶物联网 (IoT): 使用具备Wi-Fi功能的Arduino(如Nano 33 IoT或ESP32)将数据发送到 Arduino IoT Cloud 或 ThingSpeak 等云服务,以便随时随地监控您的房间。
  • 升级您的传感器: 为获得更高的精度和稳定性,可以考虑使用 BME280 传感器。它通过I2C协议通信,并能测量大气压力。