🌏

電子工作 その18(温湿度センサー:DHT11/DHT22の使い方)

2023/09/13に公開

こんにちは、Ideagearの鈴木陽介です。

今回は温湿度センサーのご紹介ですが、DHT11については以前使ったことがありましたが、先週つくったデジペでぬいぐるみに埋め込んだことで、改めて使いました。

ただ、DHT11とDHT22で値がかなり異なることと、同じDHT11でも個体差がかなりあることがわかりましたので、それらの分析も含めて今回単独の記事として残すことにしました。


左の青いのがDHT11で、右の白いのがDHT22です。

はじめに

DHT11とDHT22は、温湿度センサーとして電子工作ではかなり一般的で、ネット上の文献も豊富です。また、この2つの配線はまったく同じで、ソースコードもほぼ同じですが、大きな違いはその精度です。

まず、湿度に関しては、DHT11は95%までしか測定できません。というより、正確には95%以上はすべて95%として表示されます。まぁそもそも誤差が±5%もあるのでそのような仕様になっていると思われます。それ以上に、DHT11を何個か使用した実感では、個体差でも10%~15%も値の差があるためガバガバです。

一方で、DHT22は100%までちゃんと計測でき、その誤差も±2%です。

次に、温度ですが、実感としてはほとんど差はありません。ただ、スペック上は、

DHT11:-20~+60℃・精度:±2.0℃
DHT22:-40~+80℃・精度:±0.5℃

となっており、DHT22の方が測定範囲も精度も上です。これらのこともあり、値段もDHT22の方が高くなっています。以下は、中国のタオバオでの値段ですが、

DHT11:7元→約140円
DHT22:32元→約640円
※約20円/元

ということで、DHT22とDHT11では、4~5倍の値段差があります。

つまり、大体の温湿度がわかれば十分ということであれば、DHT11で十分ですし、たとえば、プログラムでif文やswitch case文などを使って、ちょっとした温度や湿度の違いで分岐させたい場合は、DHT22を使った方がいいと思います。

各温湿度センサーのスペック

手抜きで申し訳ありませんが、秋月電子通商さんのページが秀逸で、仕様だけでなくデーターシートもあるのでそのまま引用させてください。

なお、DHT20とDHT21という黒いセンサーやAM2322というピンが垂直についているタイプもあるようですので一緒にご紹介しますが、今回は試していませんのでご了承ください。これらの詳細は下記リンクからご自身で確かめてください。

温湿度センサ モジュール DHT11
https://akizukidenshi.com/catalog/g/gM-07003/

温湿度センサ モジュール AM2302 ※DHT22
https://akizukidenshi.com/catalog/g/gM-07002/

温湿度センサ モジュール DHT20
https://akizukidenshi.com/catalog/g/gM-16732/

温湿度センサ モジュール AM2301B ※DHT21
https://akizukidenshi.com/catalog/g/gM-16730/

温湿度センサ モジュール AM2322
https://akizukidenshi.com/catalog/g/gM-10880/

参考記事

DHT11については、以前、ESP32からクラウドへのデータ送信で使った下記記事がありますので、併せてご覧ください。
https://zenn.dev/suzuky/articles/704b3f5ead9cd2

配線図などに関しては、今回もRandom Nerd Tutorialsの内容を活用させていただきました。
Complete Guide for DHT11/DHT22 Humidity and Temperature Sensor With Arduino
https://randomnerdtutorials.com/complete-guide-for-dht11dht22-humidity-and-temperature-sensor-with-arduino/#more-5378

DHT11とDHT22の違いについては、下記記事が上手にまとめられているので、こちらもご覧ください。
https://www.hobbyhappyblog.jp/dht22-dht11

ピン配置

参考記事から引用。


画像引用元:https://randomnerdtutorials.com/complete-guide-for-dht11dht22-humidity-and-temperature-sensor-with-arduino/#more-5378

ブレッドボード図

同じく参考記事から引用。


画像引用元:https://randomnerdtutorials.com/complete-guide-for-dht11dht22-humidity-and-temperature-sensor-with-arduino/#more-5378

下記は、DHT11とDHT22を実際にArduino Unoと配線した時の様子です。

ライブラリー

Arduino IDEを開き、スケッチ -> ライブラリーをインクルード -> ライブラリーを管理 ->ライブラリーマネージャから、下記2つのライブラリーをインクルードしてください。

DHT sensor library by Adafruit
Adafruit Unified Sensor by Adafruit

ソースコード

手元には、温湿度センサーをESP32でWi-FiにつなげたものやデジペでDFPlayer Miniにつなげたものなどがありますが、単純なDHT11とDHT22の比較という意味では、やはり、参考記事のソースコードがわかりやすいためそのまま拝借しました。

// Example testing sketch for various DHT humidity/temperature sensors
// Written by ladyada, public domain

#include "DHT.h"

#define DHTPIN 2     // what pin we're connected to

// Uncomment whatever type you're using!
#define DHTTYPE DHT11   // DHT 11 
//#define DHTTYPE DHT22   // DHT 22  (AM2302)
//#define DHTTYPE DHT21   // DHT 21 (AM2301)

// Initialize DHT sensor for normal 16mhz Arduino
DHT dht(DHTPIN, DHTTYPE);

void setup() {
  Serial.begin(9600); 
  Serial.println("DHTxx test!");
 
  dht.begin();
}

void loop() {
  // Wait a few seconds between measurements.
  delay(2000);

  // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  float h = dht.readHumidity();
  // Read temperature as Celsius
  float t = dht.readTemperature();
  // Read temperature as Fahrenheit
  float f = dht.readTemperature(true);
  
  // Check if any reads failed and exit early (to try again).
  if (isnan(h) || isnan(t) || isnan(f)) {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }

  // Compute heat index
  // Must send in temp in Fahrenheit!
  float hi = dht.computeHeatIndex(f, h);

  Serial.print("Humidity: "); 
  Serial.print(h);
  Serial.print(" %\t");
  Serial.print("Temperature: "); 
  Serial.print(t);
  Serial.print(" *C ");
  Serial.print(f);
  Serial.print(" *F\t");
  Serial.print("Heat index: ");
  Serial.print(hi);
  Serial.println(" *F");
}

上記は、DHT11を使う場合です。

DHT22を使う場合は、下記の通り、DHT11の定義の行をコメントアウトし、DHT22の行を有効にしてください。

//#define DHTTYPE DHT11   // DHT 11 
#define DHTTYPE DHT22   // DHT 22  (AM2302)
//#define DHTTYPE DHT21   // DHT 21 (AM2301)

つまり、私が先週のデジペ制作時にDHT22をテストして値がおかしかったのは、単に#defineでDHT22を指定していなかったのが原因のようです。

テスト

Arduino IDEのシリアルモニタを開いて値の変化を確認します。
https://twitter.com/Ideaport_Suzuky/status/1701594082768982066

1、DHT11の定義でDHT11を使用
2、DHT11に息を吹きかける(湿度は最大95%まで)
3、DHT11の定義でDHT22を使用(値がおかしい)
4、DHT22の定義でDHT22を使用
5、DHT22に息を吹きかける(湿度は最大100%まで)


上記は、シリアルモニタを開き、DHT11の定義を使用してDHT11を使っている状態から、DHT11を抜き、配線はそのままで、DHT22に挿し替えた時の表示の変化です。後者の値は明らかにおかしいですね。

なお、DHT11の定義でDHT22を使用した場合は、上記の通り値は異常でも検知はされますが、その逆に、DHT22の定義でDHT11を使おうとすると、「Failed to read from DHT sensor!」と表示され続けて検知すらされません。

おまけ

デジペの制作過程で撮った過去の実績動画も併せて共有します。

https://twitter.com/Ideaport_Suzuky/status/1699687958209761365
(撮影日:2022年9月7日)

このデジペの本来の目的は、お酒を飲んだ人に息を吹きかけてもらい、アルコールを検知した場合に「くっさっ!」と発話するというものです。

ただ、アルコールを検知できるような気体センサーは暖機運転が必須っぽく、安定して使えるようになるまで時間がかかりそうで困っていました。

※暖機運転とは、設備/機器/センサー等を低負荷でアイドリング状態にしておき、本来の能力を発揮できるよう、かつ精度が安定するように準備しておくことです。

一方で、温湿度センサーに息を吹きかければ湿度が一気に上がることに気づき、であれば、このバージョンの初期プロトタイプは、制作の時短も兼ねて、とりあえず息を吹きかけたら反応するようにすることにし、それだけならDHT11でも十分だと考えてこのようにしました。

最終的には、ちゃんとした気体センサーへ切り替える予定です。

まとめ

いかがでしたでしょうか?

DHT11とDHT22は共に、配線3つとプルアップ抵抗だけで使え、なおかつ気体系のセンサーでよくありがちな暖機運転もほぼ不要なため、扱いが非常にカンタンでわかりやすいセンサーです。

これらはライブラリーを2つインクルードしなければならないのは若干面倒ですが、非常に安価なセンサーでありながら、初心者から実用まで幅広い用途で使えるとても便利なセンサーではないでしょうか?

それではまた!

Discussion