部品 · 読了まで6分

DHT11温湿度センサー:Arduino・ESP32・Picoで使うガイド

DHT11温湿度センサーとは何か、どう動くのか。Arduinoへの配線、DHTライブラリ、サンプルコード、DHT11とDHT22の違い、ESP32とPicoでの使い方、よくある失敗を解説します。

DHT11は、1本のデータ線で温度と相対湿度の両方を読み取れる、青いプラスチックケースの安価なデジタルセンサーです。Arduinoで作る気象ステーション、温室や植物のモニター、子ども部屋の温度計、湿度が上がるとファンを回すスマートホームのプロジェクトなど、ほぼすべてで使われています。アナログセンサーとは違い、電圧を測って計算式をいじる必要はありません。センサーが測定値をそのまま数値で送ってくれます。

DHT11温湿度センサー
DHT11:格子状の青いケースの中に、湿度を測る素子と小さなサーミスタが入っています。

DHT11とは?どこで使われる?

このセンサーが測る湿度は相対湿度です。その温度で空気が含める水蒸気の最大量に対して、何パーセント含んでいるかを表します。40〜60%が快適とされ、70%を超えると湿気やカビ、30%を下回ると乾燥した空気を意味します。DHT11はこの値と周囲の温度を約1秒に1回測ります。

  • 家庭用の気象ステーション:温度と湿度をLCDやOLEDのディスプレイに表示します。
  • 温室や植物のモニター:湿度が下がったら知らせ、土壌水分センサーと組み合わせて水やりをします。
  • 湿気やカビの警告:浴室、地下室、クローゼットの湿度が70%を超えたらアラームを鳴らします。
  • 自動ファンや除湿機:湿度のしきい値を超えたら、リレーで機器をオンにします。
  • データロガー:測定値をSDカードに書き込み、1日のグラフを作ります。
  • リモート監視:ESP32を使って、スマートフォンで開けるWebページに値を表示します。

DHT11はどう動く?

ケースの中には2つの測定素子があります。湿度素子は2つの電極の間に湿気を吸う材料をはさんだもので、空気中の湿度が上がると抵抗値が下がります。温度はNTCサーミスタで測ります。温度が上がると抵抗値が下がる小さな抵抗です。センサーの中の小さなマイコンが2つの抵抗値を測り、工場で記録された校正値で補正して、結果をデジタルで送ります。

通信は1本の線で行います。Arduinoがデータ線を少なくとも18ミリ秒LOWにしてセンサーを起こすと、センサーは40ビットのパケットで応答します。内訳は湿度16ビット、温度16ビット、読み取りエラーを見つけるための8ビットのチェックサムです。このタイミングを自分で書く必要はありません。このあとインストールするライブラリがすべて処理してくれます。

仕様:DHT11とDHT22の違い

項目DHT11DHT22 (AM2302)
電源電圧3〜5.5 V3.3〜6 V
測定中の電流0.5〜2.5 mA1〜1.5 mA
温度範囲0〜50 °C−40〜80 °C
温度の精度±2 °C±0.5 °C
湿度範囲20〜90%0〜100%
湿度の精度±5%±2%(最大±5%)
分解能1 °C / 1%0.1 °C / 0.1%
測定頻度1秒に1回2秒に1回
ケースの色青白
DHT22 AM2302温湿度センサー
DHT22(AM2302):白いケースの兄弟分で、より正確に、氷点下まで測れます。

まとめると、室内の温度と湿度をおおまかに知りたいなら、DHT11で十分で、価格も安いです。屋外、氷点下、または0.5度の差が重要な用途ではDHT22を選んでください。どちらも配線とコードは同じで、コードのセンサーの種類を変えるだけです。

DHT11のピン配置と配線

DHT11には2つの形態があります。基板に抵抗とLEDが付いた3ピンのモジュールと、4本足のセンサー単体です。センサー単体の場合は、格子のある面を手前に向けて、左から右へ足を数えます。

信号3ピンモジュール4本足センサーつなぎ先
電源VCC (+)1番の足5V(ESP32とPicoでは3V3)
データDATA / OUT / S2番の足デジタルピン(UnoではD2)
未使用—3番の足接続しない
グラウンドGND (−)4番の足GND
センサー単体を使う場合は、データの足とVCCの間に必ず10 kΩのプルアップ抵抗を入れてください。ケーブルが数メートルより長い場合は4.7 kΩを使います。モジュール基板にはこの抵抗がすでに付いているので、追加は不要です。カラーバンドから抵抗値を読むには、抵抗カラーコードツールを使ってください。

DHTライブラリをインストールする

  1. Arduino IDEでライブラリマネージャを開きます(Arduino IDE 2では左サイドバーの本のアイコン)。
  2. 検索欄にDHT sensor libraryと入力し、Adafruit製のライブラリをインストールします。
  3. 依存関係について聞かれたら全てをインストールを選び、Adafruit Unified Sensorも一緒にインストールします。
  4. 必要なら、「ファイル」>「スケッチ例」> DHT sensor library > DHTtesterにある既製のサンプルを試してみてください。

Arduinoのサンプルコード:温度、湿度、暑さ指数

下のコードは2秒ごとに測定し、読み取りに失敗したときはそれを知らせ、温度と湿度を組み合わせて暑さ指数(体感温度)を計算します。結果を見るには、シリアルモニタを9600 baudで開いてください。

C++ (Arduino IDE)
1#include <DHT.h>
2
3#define DHT_PIN 2          // veri pini / data pin
4#define DHT_TYPE DHT11     // DHT22 kullanıyorsan DHT22 yaz / write DHT22 for a DHT22
5
6DHT dht(DHT_PIN, DHT_TYPE);
7
8void setup() {
9  Serial.begin(9600);
10  dht.begin();
11}
12
13void loop() {
14  delay(2000);                                // ölçümler arası bekleme / wait between readings
15
16  float humidity = dht.readHumidity();        // % bağıl nem / % relative humidity
17  float temperature = dht.readTemperature();  // °C
18
19  if (isnan(humidity) || isnan(temperature)) {
20    Serial.println("Okuma hatası / read error");
21    return;
22  }
23
24  // hissedilen sıcaklık / heat index (°C)
25  float heatIndex = dht.computeHeatIndex(temperature, humidity, false);
26
27  Serial.print("Sicaklik / Temp: ");
28  Serial.print(temperature);
29  Serial.print(" C  Nem / Humidity: %");
30  Serial.print(humidity);
31  Serial.print("  Hissedilen / Feels like: ");
32  Serial.print(heatIndex);
33  Serial.println(" C");
34}
DHT11は最大で1秒に1回、DHT22は2秒に1回しか測定できません。測定の間に2秒待てば、どちらでも安全です。それより頻繁に読んでも新しい値は得られず、ライブラリは前回の測定値かエラーを返します。

ESP32でDHT11を使う

ESP32でも同じコードが動きます。DHT_PINをたとえば4に変えるだけです。データ線も3.3 Vのままになるように、センサーはESP32の3V3ピンから給電してください。DHT11はこの電圧で問題なく動作します。データ線は双方向なので、入力専用のGPIO 34〜39はDHTには向いていません。ピンを選ぶときは、ピン配置ツールでESP32のどのピンが安全かを確認してください。Wi-Fi経由で測定値をWebページに表示し、スマートフォンから確認することもできます。

Raspberry Pi PicoでDHT11を使う(MicroPython)

MicroPythonにはDHTセンサー用のdhtモジュールが組み込まれているので、ライブラリをインストールする必要はありません。センサーをPicoの3V3ピン、GND、GP15ピンにつなぎます。

MicroPython
1import dht
2from machine import Pin
3import time
4
5sensor = dht.DHT11(Pin(15))   # GP15 veri pini / data pin (DHT22 için dht.DHT22)
6
7while True:
8    try:
9        sensor.measure()
10        t = sensor.temperature()   # °C
11        h = sensor.humidity()      # %
12        print("Sicaklik:", t, "C  Nem: %", h)
13    except OSError:
14        print("Okuma hatası / read error")
15    time.sleep(2)

DHT11を使ったプロジェクトのアイデア

  • LCD付きデジタル温度計:値を16x2のディスプレイに表示します。方法はI2C LCDディスプレイの使い方で紹介しています。
  • 湿度で制御するファン:湿度が65%を超えたらリレーでファンを回します。配線はリレーモジュールとは?を参照してください。
  • 湿気アラーム:しきい値を超えたらブザーを鳴らします。音による通知はブザーとは?で解説しています。
  • 温度ロガー:時計モジュールとSDカードで、10分ごとに測定値を保存します。
  • Wi-Fi気象ステーション:ESP32で、家のネットワーク上のどの機器からでも開けるページに測定値を公開します。

よくある失敗と直し方

  • ずっとNaNや「Failed to read」が出る:データ線がコードとは別のピンにつながっている、プルアップ抵抗がない、コードのセンサーの種類が間違っている(DHT11ではなくDHT22)といった可能性があります。
  • 頻繁に読みすぎる:2秒より短い間隔で読むと、センサーは前回の値かエラーを返します。
  • 温度が実際より高い:センサーがArduinoの電圧レギュレーターに近すぎるか、日なたにある可能性があります。ボードから数センチメートル離して置いてください。
  • 長いケーブルで読み取りが途切れる:数メートルを超えると信号が弱くなります。プルアップを4.7 kΩに下げ、センサーを5 Vで給電し、品質のよいケーブルを使ってください。
  • ESP32で不安定になる:センサーを5 Vで給電すると、データ線が5 Vにプルアップされます。3V3から給電し、入力と出力の両方に使えるGPIO(たとえば4)を使ってください。
  • すぐに反応すると思ってしまう:湿度の変化を検出するには数秒かかります。DHT11は速い測定用ではなく、室内の監視用に作られています。

ほかにどんなセンサーが使えるか知りたいならArduinoセンサーガイドを、距離を測るならHC-SR04距離センサーを読んでみてください。BlueGraysアプリでは、DHT11とDHT22を使ったステップごとのプロジェクトを、回路図とコード付きで見られます。

よくある質問

DHT11とDHT22、どちらを買うべきですか?

室内の温度と湿度をおおまかに知るなら、DHT11で十分で、価格も安いです。屋外での使用、氷点下の温度、±0.5 °Cの精度が必要ならDHT22を選んでください。コードで変えるのは、センサーの種類をDHT22にすることだけです。

DHT11がNaNや「Failed to read from DHT sensor」を返すのはなぜですか?

よくある原因は、データピンの間違い、プルアップ抵抗の不足、コードのセンサーの種類の間違い、読み取りの頻度が高すぎることです。配線を確認し、センサー単体なら10 kΩの抵抗を入れ、測定の間に2秒待ってください。

DHT11の温度が正しくありません。どうやって校正しますか?

DHT11では±2 °Cの誤差は正常です。信頼できる温度計の横にセンサーを置いて差を記録し、コードで読み取り値にその一定の差を足すか引いてください。センサーが熱くなる部品から離れていることも確認しましょう。

DHT11は3.3 Vで動きますか?

はい、DHT11は3〜5.5 Vで動作します。ESP32やRaspberry Pi Picoのような3.3 Vのボードでは、3V3ピンから給電するのがいちばんです。そうすればデータ線に5 Vがかかることはありません。

DHT11は屋外や水の近くで使えますか?

DHT11は防水ではありません。雨、結露、直射日光はセンサーを傷めたり、誤った値の原因になったりします。屋外では日陰にある通気性のよい箱に入れて使ってください。水温を測るなら、防水のDS18B20のほうが適しています。

1台のArduinoに複数のDHT11をつなげますか?

はい。ただし、センサーごとに別のデータピンが必要で、データ線を共有することはできません。コードではそれぞれに別のDHTオブジェクトを定義します。たとえばDHT dht1(2, DHT11)とDHT dht2(3, DHT11)のようにします。

全プロジェクトを見る
DHT11で温度と湿度を測定
#55中級

DHT11で温度と湿度を測定

部屋の温度は何度で、空気は湿っているでしょうか、それとも乾燥しているでしょうか?DHT11センサーが温度と湿度を測定し、Arduinoが2行のLCDディスプレイに値を表示して、数秒ごとに更新します。センサーに異常があればエラーメッセージが表示されます。自分だけの小さな気象観測装置を作る第一歩です。

4.7(47)
73
ESP32 DHT22温湿度計(LCDディスプレイ付き)
#117中級

ESP32 DHT22温湿度計(LCDディスプレイ付き)

DHT22センサーで周囲の温度と湿度を測定し、16x2 I2C LCDにリアルタイムで表示するプロジェクトです。Adafruit DHTライブラリを使い、1本の信号線を使うプロトコルでセンサーからデータを読み取ります。IoT気象観測装置やスマートホームの自動化、温室の環境監視システムの基礎となります。ESP32のGPIO 4ピンを介してDHT22と通信します。

4.8(38)
56
ESP32温度データロガー(DHT22 + DS1307 RTC + microSD + OLED)
#144上級
プレミアム

ESP32温度データロガー(DHT22 + DS1307 RTC + microSD + OLED)

ESP32で日時付きの温度・湿度記録システムを作ります!DHT22で1分ごとに温度と湿度を読み取り、DS1307 RTCから取得した日時とともにmicroSDカードへCSV形式で記録します。OLEDには最新の温度を大きな文字で表示し、湿度のパーセント値、日時、総記録数も表示します。SDカードの/temp_log.csvファイルはExcel、Google Sheets、Pythonのpandasで開いて分析できます。温室の監視、家や部屋の温度管理、実験室のデータ収集、食品の保管環境や養蜂箱の監視に適しています。

4.7(7)
12
ドットマトリクス時計・カレンダー・気象ステーション(MAX7219、DS1307)
#85中級
プレミアム

ドットマトリクス時計・カレンダー・気象ステーション(MAX7219、DS1307)

机や壁に置いて、時刻、日付、室内の温湿度を順番に表示する、文字がスクロールする表示板です。8x32のLEDディスプレイには、まず摂氏と華氏の温度、次に湿度、そして2つの点が1秒ごとに点滅する時計が表示されます。分が変わると、曜日と日付がスクロール表示されます。時計モジュールが時刻を保持し、DHT22センサーが温度と湿度を測定します。

5.0(50)
66
NTCと2x16 LCDディスプレイで温度を測定
#44初級
プレミアム

NTCと2x16 LCDディスプレイで温度を測定

小さなビーズのようなセンサーで周囲の温度を測ります。NTCというこの部品は、温まるほど電気が流れやすくなります。Arduinoがその変化を読み取り、数式で摂氏温度に変換して、2行のLCDディスプレイに0.5秒ごとに表示します。手のひらでセンサーを温めて、数値が上がる様子を見るのも楽しみの1つです。

4.5(33)
44
ESP32 HTTPClient+天気API(LCD付き)
#133上級
プレミアム

ESP32 HTTPClient+天気API(LCD付き)

このプロジェクトでは、ESP32でHTTPClient.hを使い、インターネット経由で天気API(wttr.in)をREST APIとして呼び出します。返されたJSONレスポンスをArduinoJson v7で解析し、都市名、気温、湿度、天気、風の情報をI2C LCDディスプレイにトルコ語と英語で表示します。wttr.inは無料で、APIキーも不要です。都市名を入力するだけで、その都市の現在の天気を取得できます。30分ごとに自動更新し、表示画面ごとに異なるLEDの光り方で状態を知らせます。

4.7(13)
20
スマート水やりステーション
#83上級
プレミアム

スマート水やりステーション

旅行中も植物が枯れないよう、自動で水やりをするシステムです。土壌水分センサーで土の湿り具合を測定し、乾燥するとArduinoが給水ポンプを数秒間動かして、青いライトを点灯させます。水分が適切なときは緑のライトが点灯します。土がひどく乾燥すると、赤いライトが点滅し、ブザーが鳴って知らせます。

5.0(42)
57