📌

【XIAO ESP32S3】温湿度センサー(DHT20)で温度・湿度を測定

に公開

DHT20(温度・湿度センサー)

https://akizukidenshi.com/catalog/g/g116732/

使用するピン

Seeed Studio XIAO ESP32S3

DHT20

配線図

あとでOLEDディスプレイに表示するので事前に配線しておきます。

ESP32S3 DHT20 OLED
GND GND GND
3.3V VCC
(2.2V-5.5V)
VCC
(3.3V-5V)
D4(SDA) SDA SDA
D5(SCL) SCL SCL

ブレッドボードでの配線

ライブラリをインストール

ライブラリマネージャーに以下を入力して検索

DHT20

DHT20by Rob Tillaartをインストールする

スケッチ

1秒ごとに温度・湿度を測定し、シリアルモニタとOLEDディスプレイに表示する。

#include <Wire.h>
#include "DHT20.h"
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

// --- OLED設定 ---
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define SCREEN_ADDRESS 0x3C // I2C address for the OLED
#define OLED_RESET     -1   // Reset pin # (or -1 if sharing Arduino reset pin)

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

// --- DHT20設定 ---
DHT20 DHT;

// 更新間隔管理(DHT内部で行うため変数は不要)

void setup() {
  // I2C初期化 (SDA=D4, SCL=D5 for XIAO ESP32S3)
  Wire.begin();
  // シリアル通信の開始
  Serial.begin(115200);

  // --- OLED初期化 ---
  // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internal
  if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
    // OLED初期化失敗時はここで停止(シリアル出力禁止のため視覚的なフィードバックは難しいが、コード上はループ)
    for(;;);
  }

  display.clearDisplay();
  display.setTextColor(SSD1306_WHITE);
  display.setTextSize(1);
  display.setCursor(0, 0);
  display.println(F("Initializing..."));
  display.display();

  // --- DHT20初期化 ---
  DHT.begin();
  
  // 最初の読み取りまで少し待機
  delay(1000);
}

void loop() {
  // 1秒ごとに更新 (DHT20の最終読み取り時間を使用)
  if (millis() - DHT.lastRead() >= 1000) {
    // センサー読み取り
    int status = DHT.read();

    // 画面クリア
    display.clearDisplay();
    display.setCursor(0, 0);

    // タイトル表示
    display.setTextSize(1);
    display.println(F("DHT20 Sensor Data"));
    display.println(F("---------------------"));

    // ステータスチェックと表示
    if (status == DHT20_OK) {
      float humidity = DHT.getHumidity();
      float temperature = DHT.getTemperature();

      // シリアルモニタへの出力
      Serial.print("Temperature: ");
      Serial.print(temperature, 1);
      Serial.print(" C, Humidity: ");
      Serial.print(humidity, 1);
      Serial.println(" %");

      // 温度表示
      display.setTextSize(1);
      display.print(F("Temp: "));
      display.setTextSize(2);
      display.print(temperature, 1);
      display.setTextSize(1);
      display.println(F(" C"));

      display.println(); // 改行で少しスペースを空ける

      // 湿度表示
      display.print(F("Humi: "));
      display.setTextSize(2);
      display.print(humidity, 1);
      display.setTextSize(1);
      display.println(F(" %"));
      
    } else {
      // エラー表示
      display.setTextSize(1);
      display.print(F("Error: "));

      // シリアルモニタへのエラー出力
      Serial.print("DHT20 Error: ");
      Serial.println(status);
      
      switch (status) {
        case DHT20_ERROR_CHECKSUM:
          display.println(F("Checksum"));
          break;
        case DHT20_ERROR_CONNECT:
          display.println(F("Connect"));
          break;
        case DHT20_MISSING_BYTES:
          display.println(F("Missing B"));
          break;
        case DHT20_ERROR_BYTES_ALL_ZERO:
          display.println(F("All Zero"));
          break;
        case DHT20_ERROR_READ_TIMEOUT:
          display.println(F("Timeout"));
          break;
        case DHT20_ERROR_LASTREAD:
          display.println(F("LastRead"));
          break;
        default:
          display.println(F("Unknown"));
          break;
      }
    }

    // 画面更新
    display.display();
  }
}

動作確認

シリアルモニタ

OLEDディスプレイ

Discussion