Arduinoで温度湿度センサDHT11の使い方

 

こんなことやります

  • Arduinoで温度湿度センサDHT11を使う
  • DHT11ライブラリのインストール
  • M5StickC PLUSとDHT11の自作HAT化への発展

Arduinoで温度湿度センサDHT11の使い方
Arduinoで温度湿度センサDHT11の使い方

つかうもの

温度湿度センサDHT11

DHT11とは、空気中の温度と湿度を同時に測定することができるデジタルセンサです。通信方法はSPIやI2Cでもなく、1-wireで行う独自の通信になってます。ArduinoのDHT11ライブラリを使えば誰でもカンタンに扱えますので、ご安心ください。

このセンサは超低価格ですので、Arduinoをはじめたばかりの方はDHT11で遊んでみると良いかもしれません。私もはじめてのセンサは、DHT11でした。選んだ理由は、色がカワイイからでした。笑

DHT22もあるよ

DHT11とほぼ同じ形で白色をした、DHT22というセンサがあるの、ご存知でしたか?AM2302というチップが使われているそうです。

DHT11 vs DHT22

DHT22のほうが、DHT11よりも高めですが、その分スペックも高いです。

項目DHT11DHT22
電源3V~5V3V~5V
湿度20~80%(5%)0~100%(2.5%)
温度0~50℃(±2℃)-40~80℃(±0.5℃)
測定レート 毎秒1回毎秒2回

ご覧の通り、DHT11よりDHT22のほうが、測定範囲が広く、測定精度も良いです。DHT22の扱い方も、DHT11とほとんど変わりありません。

Arduino

Arduino Uno Rev3を使用しました。

もちろん、他のお好きなArduinoでもかまいません。もしArduinoをお持ちでないようでしたらオススメArduinoどれを選べばいい?Arduinoで電子工作をはじめる方へをご参考になさってみてください。

その他の電子部品

4.7kΩの固定抵抗を使いますので、あわせて用意しておいてください。

ブレッドボードやジャンプワイヤをお持ちでない方は、そろえておくとよいでしょう。

開発環境

項目バージョン
Arduino IDE1.8.10
パソコンmacOS Big Sur 11.0.1

準備

ArduinoでDHT11を使えるように準備します。

Arduino IDEにDHT11ライブラリをインストール

Arduino IDEでDHT11ライブラリをインストールします。次の手順にしたがって、AdafruitのDHT sensor libraryAdafruit Unified Sensorをインストールします。

Arduino IDESketchInclude Library へ進み「dht」および「Adafruit Unified Sensor」で検索してライブラリをインストール。

DHT sensor libraryのインストール
DHT sensor libraryのインストール

Adafruit Unified Sensorのインストール
Adafruit Unified Sensorのインストール

Adafruitのライブラリの詳細はこちら。

Visual Studio Codeをお使いの場合

Visual Studio Codeを使ってArduino開発を行なっている方は、直接ファイルをGitHubからダウンロードしても良いかもしれません。

下記のGitHubページへアクセスし、「Code」ボタンから「Download ZIP」でダウンロードします。必要なファイルは DHT.hDHT.cpp のみなので、それらを.inoファイルのあるディレクトリへ移動すればインストール完了です。

Visual Studio CodeでArduino開発するメリット

Visual Studio Codeで開発するメリットは、ひとことでいえば「つかいやすい」です。ファイル管理が圧倒的にラクです。

Visual Studio Codeを使うと、ライブラリへのアクセスが簡単になるので、プロの書いたプログラムを見る機会が増えて勉強になります。Visual Studio CodeでArduino開発したい方は、Visual Studio CodeでArduino開発をはじめようをご覧ください。

DHT11のピン端子役割

DHT11のピン端子役割
DHT11のピン端子役割

DHT11から湿度や温度を読み取るには、DATAピンでデータのやりとりを行います。VDDは3V〜5Vの範囲で使用できます。また、NCピンは使いませんので何も接続しません。

DHT11のデータシートはこちら。

DHT11とArduinoの配線

DHT11とArduinoの配線の配線図です。VDDは5Vと3.3Vのどちらでも構いません。また、NCには何もつなぎません。

DHT11とArduinoの配線図
DHT11とArduinoの配線図

DHT11Arduino Uno
VDD5V
DATAD2
NC--
GNDGND

プルアップ抵抗

配線図のようにDHT11のDATAピンを、4.7kΩの抵抗を介してVDDと同じ電圧につないでください。これをプルアップと呼びます。

Arduinoで温度、湿度を測定してみよう

シリアルモニターに温度と湿度を表示させるソースコードです。

ソースコード

次のプログラムは、DHT11で湿度と温度のデータを読み取り、シリアルモニターに表示させる内容となっております。温度の単位は摂氏温度です。

#include "DHT.h"
#define DATA_PIN 2 // D2

DHT dht(DATA_PIN, DHT11);

void setup() {
    Serial.begin(9600);
    dht.begin();
}

void loop() {

    delay(3000);

    float humid = dht.readHumidity();
    float temp = dht.readTemperature();

    if (isnan(humid) || isnan(temp)) {
        Serial.println("Failed...");
        return;
    }
//    Serial.println(humid);
//    Serial.println(temp);


    char humidFloatString[10];
    char tempFloatString[10];
    
    dtostrf(humid,4,2,humidFloatString);
    dtostrf(temp,4,2,tempFloatString);


    char bufHumid[20];
    char bufTemp[20];

    sprintf(bufHumid, "Humidity: %s", humidFloatString);
    sprintf(bufTemp, "Temperature: %s", tempFloatString);

    Serial.println(bufHumid);
    Serial.println(bufTemp);
}

ソースコードの解説:DHT

DHT22を使用する場合は、DHT dht(DATA_PIN, DHT22)へ書き換えれば動作するはずです。DHT11は毎秒1回の速度でしかデータを取得できません。一方で、DHT22は毎秒2回となります。用途によって使い分けてみてください。

ソースコードの解説:floatを文字列に変換する

Arduinoでは、floatを文字列へ変換するには一筋縄ではいきませdtostrf関数を使って、floatから文字列へ変換し、sprintf関数でchar配列へ格納しています。

float pi = 3.14159265;
char floatString[10];
dtostrf(pi,4,2,floatString);
char buf[20];
sprintf(buf, "pi is %s", floatString);
Serial.println(buf);

dtostrfは、小数点を含む数値を文字列に変換します。

dtostrf(変換する値, 小数点や符号を含んだ変換後の文字数, 小数点以下の桁数, 変換後の文字列を格納する変数)

ここら辺は、OLEDなどで文字表示するときに役立ちます。

発展:M5StickC PLUSとDHT11の自作HAT化

DHT11センサを自作のHAT化して、M5StickC PLUSで使ってみました。

M5StickC PLUSとDHT11センサ
M5StickC PLUSとDHT11センサ

用意するもの

M5StickC PLUS

M5StickC PLUSは、ESP32 PICOをベースとした、バッテリーや液晶ディスプレイが内蔵されたArduino互換機です。

M5StickC PLUSの使い方はM5StickC PLUSでArduinoをはじめよう!をご参考になさってみてください。

HAT基板

M5StickC PLUSでセンサを扱いやすくするため、エッチングで基板製作してセンサをHAT化しました。もちろんユニバーサル基板でも作れますし、スイッチサイエンスさんから出ているユニバーサル基板内蔵のHATモジュールを使ってもよさそうです。

M5StickC PLUSとDHT11の配線

M5StickC PLUSとDHT11の配線は図の通りです。4.7kΩの抵抗をデジタルピンにつなげ、5V電源にプルアップします。

M5StickC PLUSとDHT11の配線図
M5StickC PLUSとDHT11の配線図

NC端子には何もつなぎません。VDDは3.3Vまたは5Vのどちらでも構いません。今回は5Vにつなぎました。

ソースコード

湿度と温度を、M5StickC PLUSのLCDに表示するソースコードです。

#include <M5StickCPlus.h>
#include "DHT.h"

#define DATA_PIN 0 // G0

DHT dht(DATA_PIN, DHT11);

void setup() {
    M5.begin();
    M5.Axp.ScreenBreath(9);
    M5.Lcd.setTextColor(BLACK);

    Serial.begin(9600);
    dht.begin();
}

void loop() {

    delay(3000);
    M5.Lcd.fillScreen(WHITE);

    float h = dht.readHumidity();
    float t = dht.readTemperature();

    if (isnan(h) || isnan(t)) {
        Serial.println("Failed...");
        return;
    }

    M5.Lcd.setCursor(5, 10);
    M5.Lcd.setTextSize(2);
    M5.Lcd.println("Humid");

    M5.Lcd.setCursor(5, 33);
    M5.Lcd.setTextSize(4);
    M5.Lcd.printf("%.1f\n", h);

    M5.Lcd.setCursor(5, 80);
    M5.Lcd.setTextSize(2);
    M5.Lcd.println("Temp");

    M5.Lcd.setCursor(5, 103);
    M5.Lcd.setTextSize(4);
    M5.Lcd.printf("%.1f\n", t);
    
}

感想

プログラムを実行すると、冒頭の写真のように湿度と温度が同時に表示されます。HATだといろいろなセンサを付け替えられるので便利ですね。

課題

今後は、いちいちプログラムを毎回書き直さなくても、モジュールを付け替えられるようにしていきたいです。また、基板むき出しのままだと使いずらいので、そのうちケースも考えたいところです。

DHT11のHATモジュール
DHT11のHATモジュール

記事に関するご質問などがあればTwitterへお返事ください。
この記事で紹介した商品
人気のArduino互換機
Arduinoで人気の周辺パーツ
Arduinoのオススメ参考書

▼ Arduino初心者向きの内容となっています。ほかのArduino書籍と比べて図や説明がとてもていねいで、読みやすかったです。Arduinoで一通りのセンサーが扱えるようになります。

▼ 外国人が書いた本を翻訳したものです。この手の書籍は、目からうろこな発見をすることが多いです。

▼ Arduinoの入門書を既に読んでいる方で、次のステップを目指したい人向きの本です。C言語のプログラミングの内容が中心です。ESP32だけでなく、ふつうのArduinoにも役立つ内容でした。

関連記事