#include "DHT.h"
#define sensorPin 51
#define DHTTYPE DHT22
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
DHT dht_sensor(sensorPin, DHTTYPE);
const int SCREEN_WIDTH = 128; // OLED display width
const int SCREEN_HEIGHT = 64; // OLED display height
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
// 模拟时间(递增秒数)
unsigned long lastUpdate = 0;
int seconds = 0;
void setup() {
Serial.begin(9600);
Serial.println(F("DHT22 example!"));
dht_sensor.begin();
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
while (true); // 停止程序
}
display.clearDisplay();
display.display();
}
void loop() {
// 每 1 秒更新一次模拟时间
if (millis() - lastUpdate >= 1000) {
lastUpdate = millis();
seconds++;
}
// 模拟当前时间(你之后可以替换为 RTC 实时时间)
int hr = (seconds / 3600) % 24;
int min = (seconds / 60) % 60;
int sec = seconds % 60;
// 读取传感器数据
float temperature = dht_sensor.readTemperature();
float humidity = dht_sensor.readHumidity();
if (isnan(temperature) || isnan(humidity)) {
Serial.println(F("Failed to read from DHT sensor!"));
return;
}
// 在串口打印数据
Serial.print(F("Humidity: "));
Serial.print(humidity);
Serial.print(F("% Temperature: "));
Serial.print(temperature);
Serial.println(F("°C"));
// OLED 显示格式化输出
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0, 0);
display.println(F("Time Humi Temp"));
char line[32];
sprintf(line, "%02d:%02d:%02d %.0f%% %.0f\xB0""C", hr, min, sec, humidity, temperature);
// 说明:\xB0 是 "°" 符号的 ASCII 十六进制
display.setCursor(0, 20);
display.println(line);
display.display();
delay(1000);
}