在物联网和智能家居项目中,显示环境的温湿度是一个常见的需求。今天,我们将通过一个简单的项目,使用 Arduino Uno、DHT11 温湿度传感器和 0.96 寸 OLED 显示屏来实现这一功能。这个项目不仅适合初学者,还能为更复杂的项目提供基础。
DHT11 温湿度传感器
- VCC 连接到 Arduino Uno 的 5V 引脚。
- GND 连接到 Arduino Uno 的 GND 引脚。
- DATA 连接到 Arduino Uno 的 D2 引脚。
0.96 寸 OLED 显示屏(I2C)
- VCC 连接到 Arduino Uno 的 5V 引脚。
- GND 连接到 Arduino Uno 的 GND 引脚。
- SCL 连接到 Arduino Uno 的 A5 引脚。
- SDA 连接到 Arduino Uno 的 A4 引脚。
在开始编程之前,确保已经安装了以下库:
- Adafruit GFX Library
- Adafruit SSD1306 Library
- DHT Library
可以通过 Arduino IDE 的“库管理器”安装这些库:
- 打开 Arduino IDE,点击“草图”->“包含库”->“管理库...”。
- 在库管理器中搜索并安装
Adafruit GFX Library
、Adafruit SSD1306 Library
和DHT Library
。
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include "DHT.h"
// OLED显示屏设置
#define SCREEN_WIDTH 128 // OLED显示宽度,以像素为单位
#define SCREEN_HEIGHT 64 // OLED显示高度,以像素为单位
// 创建SSD1306显示对象
#define OLED_RESET -1 // 重置引脚(不适用时使用-1)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// DHT11设置
#define DHTPIN 2 // DHT传感器数据引脚连接到Arduino的数字引脚2
#define DHTTYPE DHT11 // DHT 11
DHT dht(DHTPIN, DHTTYPE);
void setup() {
// 初始化串口通信,以便在串行监视器中查看输出(可选)
Serial.begin(9600);
// 初始化DHT11传感器
dht.begin();
// 初始化OLED显示屏
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // 0x3C是大多数0.96" OLED的默认I2C地址
Serial.println(F("SSD1306 allocation failed"));
for(;;); // 停止执行
}
// 清空显示屏
display.clearDisplay();
// 设置文本大小(可选)
display.setTextSize(1);
// 设置文本颜色(白色)
display.setTextColor(SSD1306_WHITE);
// 设置光标位置
display.setCursor(0,0);
// 显示一些初始文本(可选)
display.println(F("DHT11 Test!"));
// 更新显示屏
display.display();
}
void loop() {
// 等待传感器稳定
delay(2000);
// 读取温度和湿度数据
float humidity = dht.readHumidity();
float temperature = dht.readTemperature();
// 检查是否读取失败,有时传感器需要更长时间来稳定
if (isnan(humidity) || isnan(temperature)) {
Serial.println(F("Failed to read from DHT sensor!"));
return;
}
// 清空显示屏
display.clearDisplay();
// 设置光标位置
display.setCursor(0,0);
// 显示温度和湿度数据
display.print(F("Temp: "));
display.print(temperature);
display.print(F(" *C Humidity: "));
display.print(humidity);
display.println(F("%"));
// 更新显示屏
display.display();
// 等待一段时间再读取下一次数据
delay(2000);
}