// ===============================================
// サンプル5:温湿度センサーの値をリアルタイム表示(Adafruit版)
// DHT22 を GPIO4 に接続(データ線に 10kΩ プルアップ)
// ライブラリ: "DHT sensor library" (Adafruit)
// 基本パターン: 測定 → clearDisplay → 描画 → display → 待つ
// ===============================================
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <DHT.h>
#define DHT_PIN 4
#define DHT_TYPE DHT22 // DHT11 の場合はここを変える
Adafruit_SSD1306 display(128, 64, &Wire, -1);
DHT dht(DHT_PIN, DHT_TYPE);
void setup() {
Serial.begin(115200);
Wire.begin();
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
dht.begin();
// 起動画面(センサーが安定するまでの時間稼ぎにもなる)
display.clearDisplay();
display.setTextColor(SSD1306_WHITE);
display.setTextSize(1);
display.setCursor(0, 28);
display.print("DHT22 starting...");
display.display();
delay(2000);
}
void loop() {
// --- 測定 ---
float hum = dht.readHumidity();
float temp = dht.readTemperature();
// --- 描画(毎回バッファを作り直す) ---
display.clearDisplay();
if (isnan(hum) || isnan(temp)) {
// 読み取り失敗時の表示も用意しておく
display.setTextSize(1);
display.setCursor(0, 28);
display.print("Sensor error!");
} else {
// ラベル(小)
display.setTextSize(1);
display.setCursor(0, 0);
display.print("Temperature");
display.setCursor(0, 34);
display.print("Humidity");
// 値(大)
display.setTextSize(2);
display.setCursor(0, 12);
display.print(temp, 1);
display.print(" C");
display.setCursor(0, 46);
display.print(hum, 1);
display.print(" %");
// 右側に簡易バー(湿度 0-100% を高さ 60px に対応)
int barH = map((int)hum, 0, 100, 0, 60);
display.drawRect(118, 2, 8, 60, SSD1306_WHITE);
display.fillRect(118, 62 - barH, 8, barH, SSD1306_WHITE);
}
display.display();
// DHT22 は 2秒に1回まで。DHT11 は 1秒に1回
delay(2000);
}
// 動画用メモ:
// ・「前の値を消す」必要はない。毎回 clearDisplay してから全部描くのが一番シンプル
// ・delay 中は何もできない → 次のステップとして millis() による非ブロッキング化
// さらに先(ESP32)なら FreeRTOS でセンサー読み取りと描画をタスク分離