Arduinoで温湿度センサーを使う方法――DHT11・DHT22の使い分けから配線まで。
見た目はそっくりなDHT11とDHT22、精度も測定範囲も違います。配線・コードの基本から、nan表示への対処法までを解説します。
目次
01なぜDHT11とDHT22は混同されやすいのか
結論から言えば、DHT11とDHT22は見た目がほぼ同じで、配線方法もほとんど変わらないため、購入したセンサーの型番とコード上の指定を混同しやすい。両者は測定精度や対応温度範囲が異なるため、この混同はプロジェクトの精度不足だけでなく、そもそも値が正しく取得できない「nan」表示の原因にもなり得る。
実例として、Arduino初心者がDHT11を使って温湿度を計測しようとした際、配線・コードともに一見問題なさそうに見えたにもかかわらず、シリアルモニタに値が表示されずnanが返り続けたという経験談がある。Arduino 温度湿度センサーを使ってみる(失敗編)(渋谷ほととぎす通信)では、配線を行いシンプルなサンプルコードを実行したにもかかわらず、いくらやってもNaNとなってしまったという結果が報告されている。
編集部見解:DHT11・DHT22は数百円で入手できる手軽なセンサーである一方、1本の信号線で通信するプロトコルの特性上、配線・タイミング・センサー種別の指定のいずれかが少しでもズレるとnanという分かりにくいエラーだけが返ってくる。トラブル時の切り分け方を事前に知っておく価値が大きいセンサーだと考えられる。
― YOFUKASI AI編集部
本記事では、DHT11・DHT22の基本的な違いから、配線とコードの基礎、そしてnan表示が出た際のトラブルシューティングまでを、初心者から中級者を対象に体系的に解説する。なお、素材画像の提供がなかったため、配線は図ではなく手順化されたテキストで示す。
02Arduinoにおける温湿度センサーの基礎知識
DHT11とDHT22は、1本の信号線で温度と湿度の両方を取得できる、Arduinoの電子工作で定番の温湿度センサーである。どちらも1-wire形式の独自プロトコルで通信し、Adafruitが公開しているDHT sensor libraryを使うことで、同じような書き方でコードを扱える。
ライブラリの公式ページでは、Arduino公式「DHT sensor library」において、このライブラリがDHT11・DHT22などの温度・湿度センサー用のArduinoライブラリであり、すべてのアーキテクチャに対応しているためほとんどのArduinoボードで利用できると説明されている。
用語の整理
- DHTPIN:センサーのデータ線を接続したデジタルピン番号を指定する定数。
- DHTTYPE:使用するセンサーの種類(DHT11・DHT22など)をコード上で指定する定数。
- プルアップ抵抗:データ線の電位を安定させるために、VCCとデータ線の間に入れる抵抗。3ピンのモジュール版には内蔵されていることが多い。
ライブラリのサンプルコードでは、センサーの配線について次のような注意点が示されている。DHT-sensor-library サンプルコード「DHTtester.ino」(GitHub)では、センサーの1番ピン(左側)を+5Vに、2番ピンをDHTPINに指定したピンに、3番ピン(右側)をGNDに接続し、3ピン仕様のセンサーの場合は4番ピンは空けておくと説明されている。
センサーを扱う前に、Arduinoの基礎文法をまだ体系的に学んでいない場合は、先に基礎を押さえておくとこの先の理解がスムーズになる。Arduinoのコードの書き方の基礎はこちらの記事で詳しく解説している。
03DHT11とDHT22の仕組みと技術的な違い
DHT11とDHT22は、配線・使い方こそ似ているものの、測定範囲・精度・サンプリング周期には明確な違いがある。実際に両方のセンサーを動かして比較した記事がある。【Arduino】温湿度センサーのDHT11とDHT22を比較してみた(Qiita)では、DHT22は氷点下も計測できるため屋外でも活躍しそうだが、サンプリング周期は約2秒とやや長めであると報告されている。
測定できる温度範囲の違いについては、より詳しい比較記事もある。温湿度計DHT22をDHT11と比較してみる(hobbyhappyblog)では、-40〜-20℃と60〜80℃の範囲はDHT11では測定できないため、その温度域になることがわかっている場合はDHT22を選択したほうがよいと説明されている。
| 項目 | DHT11 | DHT22 |
|---|---|---|
| 価格帯の傾向 | 安価 | DHT11よりやや高価 |
| 測定できる温度範囲 | 限定的(氷点下・高温域は対象外になりやすい) | より広い範囲(氷点下も測定可能) |
| サンプリング周期の目安 | 約1秒に1回程度 | 約2秒に1回程度 |
| 向いている用途 | 室内での簡易的な確認・入門用途 | 屋外・気温変化の大きい環境 |
※数値は各参考記事に基づく目安であり、個体差・メーカーにより変動する場合がある。
室内の観葉植物管理用に組んだDHT11のシステムを、そのまま屋外のベランダに移設したところ、冬場の早朝に温度表示が異常値になる現象が起きることがある。これはDHT11の測定範囲外の温度になっていることが原因であるケースが多く、この場合はDHT22への交換が根本的な解決策になる。
圧力センサーなど、他のアナログ・デジタルセンサーとの配線の考え方を比較したい場合は、以下の記事も参考になる。
04温湿度センサーの選択肢の比較
用途によって、選ぶべきセンサーは変わる。以下に3つの選択肢を整理する。
| 項目 | A. DHT11 | B. DHT22 | C. 高精度センサー(SHT31等) |
|---|---|---|---|
| 向いている用途 | 室内の簡易確認・学習用途 | 屋外・気温変化の大きい環境 | 研究・業務レベルの精度が必要な用途 |
| コスト | 低い | 中程度 | やや高い |
| 通信方式 | 1-wire(独自プロトコル) | 1-wire(独自プロトコル) | I2Cが主流 |
| 入手性・情報量 | 非常に多い(定番) | 多い | DHT系列よりやや少ない |
※各センサーの適用範囲の目安は編集部見解を含む。
趣味の電子工作や学習目的であれば、まずはDHT11で全体の動作を確認し、屋外利用や氷点下計測が必要になった段階でDHT22に切り替える、という順序で十分なことが多い。
05実践:DHT11・DHT22で温湿度をシリアル表示する5ステップ
ここでは「DHT11(またはDHT22)で温度と湿度を測定し、2秒おきにシリアルモニタへ表示する」という編集部想定シナリオを題材に、配線からコード作成までの具体的な手順を示す。
-
STEP1. センサーを配線する
VCC・GND・データ線の3本(または4本)を接続する。
配線手順(テキスト版)- センサーのVCCピンを、Arduinoの5Vピンに接続する
- センサーのGNDピンを、ArduinoのGNDピンに接続する
- センサーのデータピンを、Arduinoのデジタルピン2番に接続する
- 4ピンのむき出しタイプを使う場合、データピンとVCCの間に4.7kΩ〜10kΩのプルアップ抵抗を追加する
実例:データピンをデジタルピン2番に接続した。3ピンのモジュール版を使用したため、追加のプルアップ抵抗は不要だった。 -
STEP2. DHTライブラリをインストールし、インクルードする
Arduino IDEのライブラリマネージャーから「DHT sensor library」を検索してインストールし、スケッチの冒頭でインクルードする。
実例:#include <DHT.h>を追加した。 -
STEP3. DHTPINとDHTTYPEを定義する
データピンの番号と、使用するセンサーの種類を定義する。実際のセンサーの型番と一致させることが重要である。
実例:#define DHTPIN 2と#define DHTTYPE DHT11を定義した。DHT22を使う場合はDHT22に書き換えるだけでよい。 -
STEP4. setup()でセンサーを初期化する
DHT dht(DHTPIN, DHTTYPE);でオブジェクトを作成し、setup()内でdht.begin()を呼び出す。実例:DHT dht(DHTPIN, DHTTYPE); void setup() { Serial.begin(9600); dht.begin(); }を記述した。 -
STEP5. loop()で読み取り、シリアルモニタに表示する
dht.readTemperature()とdht.readHumidity()で値を取得し、2秒程度の間隔を空けてから次の読み取りに移る。実例:float h = dht.readHumidity(); float t = dht.readTemperature(); Serial.print(t); Serial.print("C "); Serial.print(h); Serial.println("%"); delay(2000);を追加。初回はnanが表示されたが、データピンの接続を確認したところ配線がずれていたことが原因で、正しく挿し直すと正常な値が表示された(編集部想定シナリオ)。
ブレッドボード上での配線の基礎をもう一度確認したい場合は、以下の記事も参考になる。
06注意点・よくある誤解
配線とライブラリの使い方はほぼ同じだが、コード上のDHTTYPE定義を実際のセンサーの型番と一致させる必要がある。DHT11用のコードでDHTTYPEをDHT22のままにしていると、値が正しく取得できない原因になる。
nan(読み取り失敗)の原因は配線ミスだけとは限らない。DHTPINの番号とコードの指定のズレ、DHTTYPEの誤指定、プルアップ抵抗の不足、読み取り間隔が短すぎること、電源の不安定さなど、複数の原因が考えられる。ひとつずつ切り分けて確認する必要がある。
DHT11・DHT22には、正常に動作するための最低限のサンプリング間隔がある(目安としてDHT11で約1秒、DHT22で約2秒)。この間隔より短いスパンで連続して読み取ろうとすると、正しい値が得られずnanや古い値が返ってくることがある。
07FAQ
参考文献
- Arduino公式ドキュメント編集チーム「DHT sensor library」Arduino Documentation, 2026年改訂. https://docs.arduino.cc/libraries/dht-sensor-library/
- Adafruit Industries「DHTtester.ino」DHT-sensor-library, GitHub. https://github.com/adafruit/DHT-sensor-library/blob/master/examples/DHTtester/DHTtester.ino
- denden888「【Arduino】温湿度センサーのDHT11とDHT22を比較してみた」Qiita, 2025年. https://qiita.com/denden888/items/55c21db3b0464ba319cb
- hobbyhappyblog「温湿度計DHT22をDHT11と比較してみる【Arduinoで実際に測定してみる方法も】」hobbyhappyblog, 2023年. https://www.hobbyhappyblog.jp/dht22-dht11/
- 渋谷ほととぎす通信「Arduino 温度湿度センサーを使ってみる(失敗編)」渋谷ほととぎす通信, 2021年. https://www.shibuya24.info/entry/arduino_dht11_error
- 本文中の具体的な原因特定エピソードは、断りのない限り編集部想定シナリオに基づく想定であり、実測データではありません。
関連記事(内部リンク)
- Arduinoのコードの書き方|基礎から応用まで全てがわかる初心者の手引き ― https://yofukasi-lab-wp.com/2025/03/07/arduino-cord/
- 圧センサーを用いた電子工作の基礎編|圧センサーの種類、配線、読み取り値など徹底解説 ― https://yofukasi-lab-wp.com/2025/03/08/pressure/
- 電子工作 ブレッドボード完全攻略ガイド ― これだけ読めば全てがわかる!(2026年更新版) ― https://yofukasi-lab-wp.com/2026/07/18/breadboard/
コメント