ESP32とDHT22を使って気温・湿度・体感温度を取得する
こんなこと、やります。
- ESP32とDHT22を使って気温・湿度を取得する
- 気温と湿度から体感温度の算出
つかうもの
この記事でつかうものをご紹介いたします。
DHT22
DHT22センサは色々売られていますが、センサとプルアップ抵抗が基板にはんだ付けされており、ピン端子が出ているこちらの製品が使いやすくてオススメです。
水色のセンサDHT11もありますが、次の表のとおりDHT22の方が高性能で優秀なのです。値段も低価格なのでDHT22をオススメいたします。
項目 | DHT11 | DHT22 |
---|---|---|
電源 | 3V~5V | 3V~5V |
湿度 | 20~80%(5%) | 0~100%(2.5%) |
気温 | 0~50℃(±2℃) | -40~80℃(±0.5℃) |
測定レート | 毎秒1回 | 毎秒2回 |
ESP32
WiFi接続が簡単にできるESP32を使いました。 ディスプレイやボタン、バッテリーなどが内蔵されているM5Stackも使いやすくてオススメです。
▼ WiFiやBluetooth接続が必要なければ、他のArduinoでも構いません。こちらの記事で色々な種類のArduinoをご紹介していますので、ご参考になさってみてください。
その他
また、ブレッドボードやジャンプワイヤもあると便利です。
ESP32とDHT22の配線
下図はESP32とDHT22の配線の例です。
上の図ではプルアップ抵抗を繋いでいますが、下記商品ですとプルアップ抵抗が内蔵されてますのでその必要はありません。
DHT22のライブラリインストール
DHT22は一本線でデータのやり取りをする1-wire通信が採用されています。ゼロからプログラミングするのは大変ですのでライブラリを使いましょう。Adafruitさんが公開しているライブラリを使うと便利です。
Arduino IDEのライブラリマネージャーかインストールしてもらっても構いません。私はPlatformIO IDEを使ってますので、上記サイトから、DHT.hとDHT.cppだけダウンロードして、次のようなディレクトリ構造でテストしました。
.
├── include
│ └── README
├── lib
│ ├── DHT22
│ │ ├── DHT.cpp
│ │ ├── DHT.h
│ │ └── examples
│ │ └── demo
│ │ └── demo.ino
│ └── README
├── platformio.ini
├── src
│ └── main.cpp
└── test
└── README
気温・湿度をシリアルモニタへ表示する(ソースコード)
DHT22から気温・湿度をシリアルモニタへ表示する demo.ino のスケッチ内容です。
/**
* @date 2022-11-23
* @author Toshihiko Arai
* @copyright https://101010.fun
*/
#include <Arduino.h>
#include <DHT.h>
/**
* @brief DHT22 <--> ESP32 の配線
* VCC <--> 3.3V
* DATA <--> GPIO13
* GND <--> GND
*/
#define DHT_PIN 13
#define DHT_TYPE DHT22
DHT dht(DHT_PIN, DHT_TYPE);
void setup() {
Serial.begin(115200);
dht.begin();
delay(100);
}
void loop() {
float humidity = dht.readHumidity();
float temperature = dht.readTemperature();
float apparentTemperature =
dht.computeHeatIndex(temperature, humidity, false);
Serial.print(" Humidity: ");
Serial.println(humidity);
Serial.print(" Temperature: ");
Serial.println(temperature);
Serial.print(" Compute Heat: ");
Serial.println(apparentTemperature);
delay(1000); // 読み取りデータがNANにならないように十分に待つ必要があるかも
}
気温や湿度データがでたらめな値だったり、nanが表示されてしまう場合は dht.begin() の宣言を忘れているかも知れません。setup() 内で宣言すること、忘れないようにしてください。
気温と湿度から体感温度を取得する
プログラム中にある computeHeatIndex 関数は、体感温度を計算してくれます。
float apparentTemperature = dht.computeHeatIndex(temperature, humidity, false);
DHTライブラリのソースコードを除くと、下記のアルゴリズムによって気温と湿度から体感温度を計算しているようです。
▼ DS18B20を使った水温センサの記事もぜひ、ご参考ください。