使用Arduino uno开发板连接dht11温湿度传感器并将温湿度显示在oled屏幕上。

dht11温湿度模块

在这里插入图片描述

oled显示模块

在这里插入图片描述
连线

dht11 Arduino uno
VCC(+) 5v
out 13引脚
GND(-) GND
oled Arduino uno
VCC 3.3v
GND GND
SCL A5
SDA A4

安装库

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <DHT.h>

1.打开Arduino IDE并转到 “工具” >“ 管理库
2. 在“搜索”框中搜索“DHT”,找到并选择 “DHT sensor library” by Adafruit(由Adafruit提供的DHT传感器库)
3. 确保选择的版本是最新的稳定版本,然后点击 “install”(安装)按钮。
4. 其余Adafruit_GFX.h、Adafruit_SSD1306.h、Wire.h使用同样方法安装。

完整代码:

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <DHT.h>

#define SCREEN_WIDTH 128 // OLED显示屏宽度
#define SCREEN_HEIGHT 64 // OLED显示屏高度
#define OLED_RESET    -1 // 使用内部复位
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

#define DHTPIN 13
#define DHTTYPE DHT11 // 定义传感器类型
DHT dht(DHTPIN, DHTTYPE);

void setup() {
  Serial.begin(9600);
  dht.begin();
  
  // 初始化OLED显示屏
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // 地址0x3C
    Serial.println(F("OLED初始化失败"));
    for(;;);
  }
  display.clearDisplay();
  display.setTextColor(WHITE);
}

void loop() {
  // 读取温湿度数据
  float h = dht.readHumidity();
  float t = dht.readTemperature();
  
  // 检查读取是否成功
  if (isnan(h) || isnan(t)) {
    Serial.println("传感器读取失败!");
    display.clearDisplay();
    display.setTextSize(1);
    display.setTextColor(WHITE);
    display.setCursor(0, 0);
    display.print("Error Reading");
    display.print(" Sensor!");
    display.display();
    delay(2000);
    return;
  }
  
  // 显示数据到OLED
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0, 0);
  display.print("Temp: ");
  display.print(t);
  display.print(" C");
  
  display.setCursor(0, 16);
  display.print("Hum: ");
  display.print(h);
  display.print(" %");
  
  display.display();
  
  // 同时通过串口打印数据
  Serial.print("湿度: ");
  Serial.print(h);
  Serial.print(" 温度: ");
  Serial.print(t);
  Serial.println(" C");
  
  delay(2000); // 每2秒刷新一次数据
}

代码讲解
1.引入库

// An highlighted block
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <DHT.h>
  • Wire.h:用于I2C通信,OLED显示屏通过I2C接口连接。
  • Adafruit_GFX.h 和 Adafruit_SSD1306.h:用于控制OLED显示屏,提供图形和文本显示功能。
  • DHT.h:专门用于与DHT系列温湿度传感器通信的库。

2.定义显示屏参数

// An highlighted block
#define SCREEN_WIDTH 128 // OLED显示屏宽度
#define SCREEN_HEIGHT 64 // OLED显示屏高度
#define OLED_RESET    -1 // 使用内部复位
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
  • 定义OLED显示屏的尺寸(128x64像素)。
  • OLED_RESET 设置为-1表示使用内部复位电路。
  • 创建一个Adafruit_SSD1306对象display,用于控制显示屏

3.定义DHT11传感器

// An highlighted block
#define DHTPIN 13     // DHT11连接到数字引脚13
#define DHTTYPE DHT11 // 定义传感器类型
DHT dht(DHTPIN, DHTTYPE);;
  • 将DHT11传感器的数据引脚连接到Arduino的数字引脚13。
  • 创建一个DHT对象dht,用于与DHT11传感器通信。

4.初始化函数(setup())

// An highlighted block
void setup() {
  Serial.begin(9600);
  dht.begin();
  
  // 初始化OLED显示屏
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // 地址0x3C
    Serial.println(F("OLED初始化失败"));
    for(;;);
  }
  display.clearDisplay();
  display.setTextColor(WHITE);
}
  • 初始化串口通信:用于调试和显示数据。
  • 初始化DHT传感器:准备传感器进行数据读取。
  • 初始化OLED显示屏:检查显示屏是否成功初始化,如果失败则进入死循环。 清除显示屏内容。 设置文本颜色为白色(WHITE)。

5.主循环函数(loop())

// An highlighted block
void loop() {
  // 读取温湿度数据
  float h = dht.readHumidity();
  float t = dht.readTemperature();
  
  // 检查读取是否成功
  if (isnan(h) || isnan(t)) {
    Serial.println("传感器读取失败!");
    display.clearDisplay();
    display.setTextSize(1);
    display.setTextColor(WHITE);
    display.setCursor(0, 0);
    display.print("Error Reading");
    display.print(" Sensor!");
    display.display();
    delay(2000);
    return;
  }
  
  // 显示数据到OLED
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0, 0);
  display.print("Temp: ");
  display.print(t);
  display.print(" C");
  
  display.setCursor(0, 16);
  display.print("Hum: ");
  display.print(h);
  display.print(" %");
  
  display.display();
  
  // 同时通过串口打印数据
  Serial.print("湿度: ");
  Serial.print(h);
  Serial.print(" 温度: ");
  Serial.print(t);
  Serial.println(" C");
  
  delay(2000); // 每2秒刷新一次数据
}
  • 读取温湿度数据:使用dht.readHumidity()和dht.readTemperature()函数读取湿度和温度。
  • 检查数据有效性:如果读取失败(返回NAN),在串口和OLED上显示错误信息,并等待2秒后重新尝试。
  • 显示数据到OLED:清除显示屏内容、设置文本大小和颜色、在指定位置显示温度和湿度数据、更新显示屏显示。
  • 通过串口打印数据:在串口监视器上打印湿度和温度数据,便于调试和记录。
  • 延迟:每2秒刷新一次数据,避免数据更新过于频繁。

实物连接图

在这里插入图片描述

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐