📌
【XIAO ESP32S3】温湿度センサー(DHT20)で温度・湿度を測定
DHT20(温度・湿度センサー)
使用するピン
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