【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百一十八: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
实验模块接线示意图


【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百一十八:DHT22 单总线数字温湿度传感器 AM2302电子积木模块
项目之五:将实时温湿度数据显示在 0.96寸 OLED 屏幕上
实验开源代码
/*
【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百一十八:DHT22 单总线数字温湿度传感器 AM2302电子积木模块
项目之五:将实时温湿度数据显示在 0.96寸 OLED 屏幕上
*/
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <DHT.h>
// 定义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秒更新一次
}
代码解读
这段代码实现了一个基于Arduino平台的温湿度监测系统,使用DHT22传感器采集环境温湿度数据,并通过OLED显示屏实时显示,同时将数据通过串口输出。下面为你详细解读:
1. 头文件包含
#include
#include
#include
#include
Wire.h:Arduino的I2C通信库,用于OLED显示屏与Arduino之间的数据传输。
Adafruit_GFX.h:Adafruit图形库的基础库,提供绘图函数,如绘制线条、矩形、文字等,为后续在OLED上显示内容提供基础支持。
Adafruit_SSD1306.h:Adafruit针对SSD1306 OLED显示屏的驱动库,封装了对SSD1306显示屏的各种操作,如初始化、清屏、显示文字等。
DHT.h:DHT传感器库,用于与DHT系列温湿度传感器进行通信,读取温湿度数据。
2. 宏定义与对象创建
// 定义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);
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() 函数
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); // 等待传感器稳定
}
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() 函数
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秒更新一次
}
dht.readHumidity() 和 dht.readTemperature():分别读取DHT22传感器的湿度和温度数据。
使用 isnan() 函数检查读取的数据是否为有效值,若无效则通过串口输出错误信息,在OLED上显示“DHT22 Error!”,延迟2秒后返回。
清除显示屏内容,设置文字大小为2,设置光标位置为(0, 0),显示温度信息;再将光标位置设置为(0, 32),显示湿度信息,然后更新显示屏。
通过串口输出温度和湿度信息。
延迟2秒后再次循环执行。
总结
这段代码实现了一个简单的温湿度监测系统,通过DHT22传感器采集环境温湿度数据,使用OLED显示屏实时显示数据,并通过串口将数据输出到计算机,方便用户查看和分析。
实验串口返回情况

实验场景图


评论