【花雕学编程】Arduino动手做(218)--DHT22模块五个小实验
2025-05-085208
精华项目
AI 快速预览详细
本文介绍了使用DHT22单总线数字温湿度传感器AM2302电子积木模块进行的五个小实验。这些实验涵盖了从基础到进阶的内容,帮助读者逐步掌握温湿度传感器的应用。每个实验都提供了详细的接线图、代码示例及调试经验。无论是零基础的新手还是有一定经验的Arduino爱好者,都能从中受益。
|
37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手试试多做实验,不管成功与否,都会记录下来——小小的进步或是搞不掂的问题,希望能够抛砖引玉。 【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程) 实验二百一十八:DHT22 单总线数字温湿度传感器 AM2302电子积木模块 ![]() ![]() |






这段代码实现了一个基于Arduino平台的温湿度监测系统,使用DHT22传感器采集环境温湿度数据,并通过OLED显示屏实时显示,同时将数据通过串口输出。
1. 头文件包含
[code]
Wire.h:Arduino的I2C通信库,用于OLED显示屏与Arduino之间的数据传输。
Adafruit_GFX.h:Adafruit图形库的基础库,提供绘图函数,如绘制线条、矩形、文字等,为后续在OLED上显示内容提供基础支持。
Adafruit_SSD1306.h:Adafruit针对SSD1306 OLED显示屏的驱动库,封装了对SSD1306显示屏的各种操作,如初始化、清屏、显示文字等。
DHT.h:DHT传感器库,用于与DHT系列温湿度传感器进行通信,读取温湿度数据。
2. 宏定义与对象创建
[code]
SCREEN_WIDTH 和 SCREEN_HEIGHT:定义OLED显示屏的宽度和高度,这里使用的是128x64像素的屏幕。
OLED_RESET:OLED显示屏的复位引脚,设为 -1 表示与Arduino的复位引脚共用。
Adafruit_SSD1306 display:创建一个SSD1306显示屏对象,指定屏幕尺寸、I2C通信对象 Wire 和复位引脚。
DHTPIN:定义DHT22传感器的数据引脚连接到Arduino的数字引脚2。
DHTTYPE:指定传感器类型为DHT22。
DHT dht:创建一个DHT对象,用于与DHT22传感器进行通信。
3. setup() 函数
[code]
Serial.begin(115200):初始化串口通信,波特率设置为115200,用于将数据通过串口输出到计算机。
display.begin(SSD1306_SWITCHCAPVCC, 0x3C):初始化OLED显示屏,SSD1306_SWITCHCAPVCC 表示使用内部稳压器为显示屏供电,0x3C 是OLED显示屏的I2C地址。
若初始化失败,通过串口输出错误信息,并进入死循环。
清除显示屏内容,设置文字大小为1,文字颜色为白色,设置光标位置为(0, 0),显示“Initializing...”提示信息,然后更新显示屏。
调用 dht.begin() 初始化DHT22传感器,并延迟2秒等待传感器稳定。
4. loop() 函数
[code]
dht.readHumidity() 和 dht.readTemperature():分别读取DHT22传感器的湿度和温度数据。
使用 isnan() 函数检查读取的数据是否为有效值,若无效则通过串口输出错误信息,在OLED上显示“DHT22 Error!”,延迟2秒后返回。
清除显示屏内容,设置文字大小为2,设置光标位置为(0, 0),显示温度信息;再将光标位置设置为(0, 32),显示湿度信息,然后更新显示屏。
通过串口输出温度和湿度信息。
延迟2秒后再次循环执行。
总结
这段代码实现了一个简单的温湿度监测系统,通过DHT22传感器采集环境温湿度数据,使用OLED显示屏实时显示数据,并通过串口将数据输出到计算机,方便用户查看和分析。
实验二百一十八:DHT22 单总线数字温湿度传感器 AM2302电子积木模块
项目之五:将实时温湿度数据显示在 0.96寸 OLED 屏幕上
实验开源代码
[code]/*
【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百一十八:DHT22 单总线数字温湿度传感器 AM2302电子积木模块
项目之五:将实时温湿度数据显示在 0.96寸 OLED 屏幕上
*/
#include
#include
#include
#include
// 定义OLED屏幕尺寸和引脚
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// 定义DHT22传感器引脚
#define DHTPIN 2
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
void setup() {
Serial.begin(115200);
// 初始化OLED显示屏
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 display allocation failed"));
for(;;);
}
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println("Initializing...");
display.display();
// 初始化DHT22传感器
dht.begin();
delay(2000); // 等待传感器稳定
}
void loop() {
// 读取温湿度数据
float h = dht.readHumidity();
float t = dht.readTemperature();
// 检查读取是否成功
if (isnan(h) || isnan(t)) {
Serial.println("Failed to read from DHT sensor!");
display.clearDisplay();
display.setCursor(0, 0);
display.println("DHT22 Error!");
display.display();
delay(2000);
return;
}
// 显示数据到OLED
display.clearDisplay();
display.setCursor(0, 0);
display.setTextSize(2);
display.print("Temp: ");
display.print(t);
display.println(" C");
display.setCursor(0, 32);
display.print("Hum: ");
display.print(h);
display.println(" %");
display.display();
// 打印数据到串口
Serial.print("Temperature: ");
Serial.print(t);
Serial.print(" °C, Humidity: ");
Serial.print(h);
Serial.println(" %");
delay(2000); // 每2秒更新一次
} [/code]
实验二百一十八:DHT22 单总线数字温湿度传感器 AM2302电子积木模块
项目之五:将实时温湿度数据显示在 0.96寸 OLED 屏幕上
硬件连接
组件 引脚 连接到 Arduino uno
DHT22
VCC 3.3V
GND GND
DATA GPIO2
SSD1306
VCC 3.3V
GND GND
SDA A4
SCL A5
实验模块接线示意图
这段代码使用 Adafruit DHT Unified 库 读取 DHT22 传感器的温度和湿度数据,核心逻辑如下:
1. 初始化
✅ #define DHTPIN 2 → 数据引脚连接到 Arduino D2
✅ #define DHTTYPE DHT22 → 指定传感器类型(DHT22,可改为 DHT11 或 DHT21)
✅ DHT_Unified dht(DHTPIN, DHTTYPE); → 初始化 DHT 传感器
2. 设备检测
✅ sensor_t sensor; dht.temperature().getSensor(&sensor); → 获取温度传感器详情
✅ dht.humidity().getSensor(&sensor); → 获取湿度传感器详情
✅ 打印传感器信息(型号、分辨率、最大/最小值)
3. 读取温湿度数据
✅ sensors_event_t event; dht.temperature().getEvent(&event); → 获取温度事件
✅ dht.humidity().getEvent(&event); → 获取湿度事件
✅ isnan(event.temperature) → 检测错误数据(避免错误读取)
4. 采集间隔
✅ delayMS = sensor.min_delay / 1000; → 根据传感器特性自动设定读取间隔
5. 输出数据
✅ 打印温度 → Serial.print(event.temperature); Serial.println("°C");
✅ 打印湿度 → Serial.print(event.relative_humidity); Serial.println("%");
这段代码让 DHT22 传感器定期测量温湿度,并打印结果。
实验二百一十八:DHT22 单总线数字温湿度传感器 AM2302电子积木模块
项目之四:使用 Adafruit DHT Unified 库读取 DHT22 数据
实验开源代码
[code]/*
【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百一十八:DHT22 单总线数字温湿度传感器 AM2302电子积木模块
项目之四:使用 Adafruit DHT Unified 库读取 DHT22 数据
*/
#include
#include
#include
#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 the type of sensor in use:
//#define DHTTYPE DHT11 // DHT 11
#define DHTTYPE DHT22 // DHT 22 (AM2302)
//#define DHTTYPE DHT21 // DHT 21 (AM2301)
DHT_Unified dht(DHTPIN, DHTTYPE);
uint32_t delayMS;
void setup() {
Serial.begin(9600);
// Initialize device.
dht.begin();
Serial.println(F("DHTxx Unified Sensor Example"));
// Print temperature sensor details.
sensor_t sensor;
dht.temperature().getSensor(&sensor);
Serial.println(F("------------------------------------"));
Serial.println(F("Temperature Sensor"));
Serial.print (F("Sensor Type: ")); Serial.println(sensor.name);
Serial.print (F("Driver Ver: ")); Serial.println(sensor.version);
Serial.print (F("Unique ID: ")); Serial.println(sensor.sensor_id);
Serial.print (F("Max Value: ")); Serial.print(sensor.max_value); Serial.println(F("°C"));
Serial.print (F("Min Value: ")); Serial.print(sensor.min_value); Serial.println(F("°C"));
Serial.print (F("Resolution: ")); Serial.print(sensor.resolution); Serial.println(F("°C"));
Serial.println(F("------------------------------------"));
// Print humidity sensor details.
dht.humidity().getSensor(&sensor);
Serial.println(F("Humidity Sensor"));
Serial.print (F("Sensor Type: ")); Serial.println(sensor.name);
Serial.print (F("Driver Ver: ")); Serial.println(sensor.version);
Serial.print (F("Unique ID: ")); Serial.println(sensor.sensor_id);
Serial.print (F("Max Value: ")); Serial.print(sensor.max_value); Serial.println(F("%"));
Serial.print (F("Min Value: ")); Serial.print(sensor.min_value); Serial.println(F("%"));
Serial.print (F("Resolution: ")); Serial.print(sensor.resolution); Serial.println(F("%"));
Serial.println(F("------------------------------------"));
// Set delay between sensor readings based on sensor details.
delayMS = sensor.min_delay / 1000;
}
void loop() {
// Delay between measurements.
delay(delayMS);
// Get temperature event and print its value.
sensors_event_t event;
dht.temperature().getEvent(&event);
if (isnan(event.temperature)) {
Serial.println(F("Error reading temperature!"));
}
else {
Serial.print(F("Temperature: "));
Serial.print(event.temperature);
Serial.println(F("°C"));
}
// Get humidity event and print its value.
dht.humidity().getEvent(&event);
if (isnan(event.relative_humidity)) {
Serial.println(F("Error reading humidity!"));
}
else {
Serial.print(F("Humidity: "));
Serial.print(event.relative_humidity);
Serial.println(F("%"));
}
}[/code]
这段代码使用 DHT22 传感器 读取 温度和湿度数据,并计算 热指数,核心逻辑如下:
1. 传感器连接
✅ #define DHTPIN 2 → 数据线连接 Arduino 的 D2 引脚
✅ #define DHTTYPE DHT22 → 指定传感器类型(DHT22,可更换为 DHT11 或 DHT21)
✅ 供电连接 → 5V 或 3.3V(根据开发板逻辑电压选择)
✅ 上拉电阻 → 使用 10kΩ 电阻连接数据线与电源,确保信号稳定
2. 初始化
✅ Serial.begin(9600); → 启动串口通信
✅ dht.begin(); → 初始化 DHT22 传感器
3. 读取温湿度
✅ float h = dht.readHumidity(); → 获取湿度
✅ float t = dht.readTemperature(); → 获取温度(摄氏度)
✅ float f = dht.readTemperature(true); → 获取温度(华氏度)
4. 数据处理
✅ 检测读取失败 → isnan(h) || isnan(t) || isnan(f) 确保数据有效
✅ 计算热指数(体感温度) → dht.computeHeatIndex(t, h, false); 以摄氏度计算
✅ dht.computeHeatIndex(f, h); 以华氏度计算
5. 输出数据
✅ 湿度 → Serial.print(h); Serial.print("%");
✅ 温度(摄氏 & 华氏) → Serial.print(t); Serial.print("°C "); Serial.print(f); Serial.print("°F");
✅ 热指数 → Serial.print(hic); Serial.print("°C "); Serial.print(hif); Serial.println("°F");
6. 循环采集
✅ delay(2000); → 每 2 秒采集一次数据,适合定期监测
这段代码让 DHT22 传感器不断测量环境温湿度,并计算体感温度后输出到串口。
实验二百一十八:DHT22 单总线数字温湿度传感器 AM2302电子积木模块
项目之三:使用 DHT22 传感器读取温湿度数据并计算热指数
实验开源代码
[code]/*
【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百一十八:DHT22 单总线数字温湿度传感器 AM2302电子积木模块
项目之三:使用 DHT22 传感器读取温湿度数据并计算热指数
*/
#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"));
}[/code]
这段代码使用 DHT22 传感器 测量温度和湿度,并通过 Arduino Serial Plotter 显示波形,核心逻辑如下:
1. 初始化
✅ #define DHTPIN 9 → 数据引脚连接到 Arduino 的 D2
✅ #define DHTTYPE DHT22 → 指定传感器类型为 DHT22
✅ DHT dht(DHTPIN, DHTTYPE); → 初始化 DHT 传感器
✅ Serial.begin(9600); → 启动串口通信
✅ dht.begin(); → 激活传感器
2. 采集温湿度数据
✅ float temp = dht.readTemperature(); → 获取温度数据
✅ float hum = dht.readHumidity(); → 获取湿度数据
3. 处理数据
✅ if (isnan(temp) || isnan(hum)) → 检查数据是否有效
✅ 如果传感器未检测到数据,打印“传感器不可用”
4. 显示波形
✅ Serial.print(temp); Serial.print(","); Serial.println(hum); → 以逗号分隔数据,适配 Arduino Serial Plotter
✅ 绘图器会自动将温度和湿度转换成两条曲线
5. 采集间隔
✅ delay(500); → 每 500 毫秒更新数据,提高波形流畅度
这段代码让 DHT22 传感器不断测量温湿度,并在 Arduino Serial Plotter 生成实时波形。
实验二百一十八:DHT22 单总线数字温湿度传感器 AM2302电子积木模块
项目之二:串口绘图器显示温湿度波形曲线
实验开源代码
[code]/*
【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百一十八:DHT22 单总线数字温湿度传感器 AM2302电子积木模块
项目之二:串口绘图器显示温湿度波形曲线
*/
#include
#define DHTPIN 2 // 数据引脚连接到 D2
#define DHTTYPE DHT22 // 使用 DHT22 传感器
DHT dht(DHTPIN, DHTTYPE);
void setup() {
Serial.begin(9600);
dht.begin();
}
void loop() {
float temp = dht.readTemperature(); // 读取温度
float hum = dht.readHumidity(); // 读取湿度
if (isnan(temp) || isnan(hum)) {
Serial.println("Sensor is not available right now");
} else {
// **只输出数值,适配 Arduino Serial Plotter**
Serial.print(temp);
Serial.print(",");
Serial.println(hum);
}
delay(150); // **降低刷新间隔,使波形更流畅**
}
[/code]