Arduinoで温湿度センサーを使う方法――DHT11・DHT22の使い分けから配線まで

プログラミング・電子工作






Arduinoで温湿度センサーを使う方法――DHT11・DHT22の使い分けから配線まで。|YOFUKASI AI




Arduino / 電子工作

Arduinoで温湿度センサーを使う方法――DHT11・DHT22の使い分けから配線まで。

見た目はそっくりなDHT11とDHT22、精度も測定範囲も違います。配線・コードの基本から、nan表示への対処法までを解説します。

YOFUKASI AI編集部 | 更新日:2026年8月18日 | 読了目安:約13分

Chapter 01 — Introduction

01なぜDHT11とDHT22は混同されやすいのか

結論から言えば、DHT11とDHT22は見た目がほぼ同じで、配線方法もほとんど変わらないため、購入したセンサーの型番とコード上の指定を混同しやすい。両者は測定精度や対応温度範囲が異なるため、この混同はプロジェクトの精度不足だけでなく、そもそも値が正しく取得できない「nan」表示の原因にもなり得る。

実例として、Arduino初心者がDHT11を使って温湿度を計測しようとした際、配線・コードともに一見問題なさそうに見えたにもかかわらず、シリアルモニタに値が表示されずnanが返り続けたという経験談がある。Arduino 温度湿度センサーを使ってみる(失敗編)(渋谷ほととぎす通信)では、配線を行いシンプルなサンプルコードを実行したにもかかわらず、いくらやってもNaNとなってしまったという結果が報告されている。

編集部見解:DHT11・DHT22は数百円で入手できる手軽なセンサーである一方、1本の信号線で通信するプロトコルの特性上、配線・タイミング・センサー種別の指定のいずれかが少しでもズレるとnanという分かりにくいエラーだけが返ってくる。トラブル時の切り分け方を事前に知っておく価値が大きいセンサーだと考えられる。
― YOFUKASI AI編集部

本記事では、DHT11・DHT22の基本的な違いから、配線とコードの基礎、そしてnan表示が出た際のトラブルシューティングまでを、初心者から中級者を対象に体系的に解説する。なお、素材画像の提供がなかったため、配線は図ではなく手順化されたテキストで示す。



Chapter 02 — Background

02Arduinoにおける温湿度センサーの基礎知識

DHT11DHT22は、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のコードの書き方の基礎はこちらの記事で詳しく解説している

Chapter 03 — Mechanism

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への交換が根本的な解決策になる。

圧力センサーなど、他のアナログ・デジタルセンサーとの配線の考え方を比較したい場合は、以下の記事も参考になる。

圧センサーの配線・読み取り値の扱い方についてはこちらの記事で解説している



Chapter 04 — Comparison

04温湿度センサーの選択肢の比較

用途によって、選ぶべきセンサーは変わる。以下に3つの選択肢を整理する。

項目 A. DHT11 B. DHT22 C. 高精度センサー(SHT31等)
向いている用途 室内の簡易確認・学習用途 屋外・気温変化の大きい環境 研究・業務レベルの精度が必要な用途
コスト 低い 中程度 やや高い
通信方式 1-wire(独自プロトコル) 1-wire(独自プロトコル) I2Cが主流
入手性・情報量 非常に多い(定番) 多い DHT系列よりやや少ない

※各センサーの適用範囲の目安は編集部見解を含む。

趣味の電子工作や学習目的であれば、まずはDHT11で全体の動作を確認し、屋外利用や氷点下計測が必要になった段階でDHT22に切り替える、という順序で十分なことが多い。

Chapter 05 — Practice

05実践:DHT11・DHT22で温湿度をシリアル表示する5ステップ

ここでは「DHT11(またはDHT22)で温度と湿度を測定し、2秒おきにシリアルモニタへ表示する」という編集部想定シナリオを題材に、配線からコード作成までの具体的な手順を示す。

  1. STEP1. センサーを配線する

    VCC・GND・データ線の3本(または4本)を接続する。

    配線手順(テキスト版)

    1. センサーのVCCピンを、Arduinoの5Vピンに接続する
    2. センサーのGNDピンを、ArduinoのGNDピンに接続する
    3. センサーのデータピンを、Arduinoのデジタルピン2番に接続する
    4. 4ピンのむき出しタイプを使う場合、データピンとVCCの間に4.7kΩ〜10kΩのプルアップ抵抗を追加する
    実例:データピンをデジタルピン2番に接続した。3ピンのモジュール版を使用したため、追加のプルアップ抵抗は不要だった。
  2. STEP2. DHTライブラリをインストールし、インクルードする

    Arduino IDEのライブラリマネージャーから「DHT sensor library」を検索してインストールし、スケッチの冒頭でインクルードする。

    実例:#include <DHT.h>を追加した。
  3. STEP3. DHTPINとDHTTYPEを定義する

    データピンの番号と、使用するセンサーの種類を定義する。実際のセンサーの型番と一致させることが重要である。

    実例:#define DHTPIN 2#define DHTTYPE DHT11を定義した。DHT22を使う場合はDHT22に書き換えるだけでよい。
  4. STEP4. setup()でセンサーを初期化する

    DHT dht(DHTPIN, DHTTYPE);でオブジェクトを作成し、setup()内でdht.begin()を呼び出す。

    実例:DHT dht(DHTPIN, DHTTYPE); void setup() { Serial.begin(9600); dht.begin(); }を記述した。
  5. 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が表示されたが、データピンの接続を確認したところ配線がずれていたことが原因で、正しく挿し直すと正常な値が表示された(編集部想定シナリオ)。

ブレッドボード上での配線の基礎をもう一度確認したい場合は、以下の記事も参考になる。

電子工作ブレッドボード完全攻略ガイドはこちらの記事で詳しく解説している

Chapter 06 — Pitfalls

06注意点・よくある誤解

!誤解1. DHT11とDHT22は同じコードで完全に互換して使える

配線とライブラリの使い方はほぼ同じだが、コード上のDHTTYPE定義を実際のセンサーの型番と一致させる必要がある。DHT11用のコードでDHTTYPEをDHT22のままにしていると、値が正しく取得できない原因になる。

!誤解2. nanが表示されたら配線ミスが原因に決まっている

nan(読み取り失敗)の原因は配線ミスだけとは限らない。DHTPINの番号とコードの指定のズレ、DHTTYPEの誤指定、プルアップ抵抗の不足、読み取り間隔が短すぎること、電源の不安定さなど、複数の原因が考えられる。ひとつずつ切り分けて確認する必要がある。

!誤解3. できるだけ短い間隔で読み取った方が正確なデータが取れる

DHT11・DHT22には、正常に動作するための最低限のサンプリング間隔がある(目安としてDHT11で約1秒、DHT22で約2秒)。この間隔より短いスパンで連続して読み取ろうとすると、正しい値が得られずnanや古い値が返ってくることがある。



Chapter 07 — FAQ

07FAQ

Q.DHT11とDHT22の違いは何ですか。
A.DHT11は安価で扱いやすい入門用センサーですが、測定範囲や精度に制限があります。DHT22はより高精度で、氷点下を含む広い温度範囲を測定できる一方、DHT11よりやや高価です。配線方法自体はほぼ同じで、コード上でセンサーの種類を正しく指定すれば同じライブラリで両方に対応できます。

Q.DHT11・DHT22はArduinoのどのピンに接続すればよいですか。
A.VCCをArduinoの5Vに、GNDをGNDに接続し、データ線を任意のデジタルピンに接続します。ピンが3本のモジュール版にはプルアップ抵抗が内蔵されていることが多く、追加の抵抗なしで動作します。ピンが4本のむき出しタイプを使う場合は、データ線とVCCの間に4.7kΩ〜10kΩ程度のプルアップ抵抗を追加するのが基本です。

Q.シリアルモニタにnan(またはFailed to read from DHT sensor)と表示されるのはなぜですか。
A.主な原因として、配線とコード上のピン番号の不一致、コードで指定したセンサーの種類(DHT11/DHT22)と実際のセンサーの型番の不一致、プルアップ抵抗の不足、読み取り間隔が短すぎること、電源の不安定さなどが考えられます。まずは配線とコードのピン番号・センサー種別の指定が一致しているかを確認するのが基本です。

Q.DHT11・DHT22はどのくらいの間隔で読み取ればよいですか。
A.DHT11は約1秒、DHT22は約2秒に1回程度が目安とされています。これより短い間隔で連続して読み取ろうとすると、正常な値を取得できず、読み取りエラーやnanが返ってくることがあります。

Q.屋外や氷点下の環境で使う場合、DHT11とDHT22のどちらを選ぶべきですか。
A.DHT11は測定できる温度範囲が限られており、氷点下付近や高温域を正確に測定するのには向きません。屋外や気温変化の大きい環境、あるいは氷点下を計測したい場合は、より広い測定範囲を持つDHT22を選ぶことが推奨されます。

Q.DHT11・DHT22よりも高精度なセンサーが必要な場合、どうすればよいですか。
A.研究用途や業務利用など、より高い精度や再現性が求められる場合は、DHT系列よりも精度仕様の高いセンサー(SHT31など)への切り替えを検討する余地があります。趣味の電子工作やプロトタイピングの範囲であれば、DHT11・DHT22で十分なことがほとんどです(編集部見解)。

参考文献

関連記事(内部リンク)


関連記事

特集記事

コメント

この記事へのコメントはありません。

TOP
CLOSE