回到首页 返回首页
回到顶部 回到顶部
返回上一页 返回上一页

【花雕学编程】Arduino动手做(218)---将实时温湿度数据显示在 0.96寸 OLED 屏幕上 简单

头像 驴友花雕 2025.05.09 49 0

0.jpg
03.jpg
04-1.jpg
05.jpg
05-0.jpg
06.jpg

  【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

实验模块接线示意图

 

12 (1).jpg
12 (2).jpg

  【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显示屏实时显示数据,并通过串口将数据输出到计算机,方便用户查看和分析。

实验串口返回情况

 

12-.jpg

实验场景图 

 

13 (1).jpg

 

13 (3).jpg

评论

user-avatar
icon 他的勋章
    展开更多