Arduinoで温度湿度センサDHT11の使い方
こんなことやります
- Arduinoで温度湿度センサDHT11をつかう
- DHT11ライブラリをつかってみる
- M5StickC PLUSで自作HAT
ラズパイでDHT11を使う場合は、ラズパイとDHT11で温度・湿度を測るをご覧ください。
つかうもの
はじめに、この記事で「つかうもの」をご紹介します。
温度湿度センサDHT11
DHT11とは、空気中の温度と湿度を同時に測定することができるデジタルセンサです。通信方法はSPIやI2Cでもなく、1-wireで行う独自の通信になってます。ArduinoのDHT11ライブラリを使えば誰でも簡単に扱えますので、ご安心ください。
このセンサは超低価格ですので、Arduinoをはじめたばかりの方はDHT11で遊んでみると良いかもしれません。私もはじめてのセンサは、DHT11でした。選んだ理由は、色がカワイイからでした。笑
DHT22もあるよ
DHT11とほぼ同じ形で白色をした、DHT22というセンサがあるの、ご存知でしたか?AM2302というチップが使われているそうです。
DHT11 vs DHT22
DHT22のほうが、DHT11よりも高めですが、その分スペックも高いです。
項目 | DHT11 | DHT22 |
---|---|---|
電源 | 3V~5V | 3V~5V |
湿度 | 20~80%(5%) | 0~100%(2.5%) |
温度 | 0~50℃(±2℃) | -40~80℃(±0.5℃) |
測定レート | 毎秒1回 | 毎秒2回 |
ご覧の通り、DHT11よりDHT22のほうが、測定範囲が広く、測定精度も良いです。DHT22の扱い方も、DHT11とほとんど変わりありません。
▼ その後、ラズパイとDHT22を使って3Dプリンタの室内環境を調べるため、温度ロガーをつくってみました。
Arduino
この記事では「Arduino Uno Rev3」を使用しました。みなさんはお好きなArduinoをお使いください。
もしもまだArduinoをお持ちでないようでしたら、こちらの記事をご参考になさってみてください。
その他の電子部品
4.7kΩの固定抵抗を使いますので、あわせて用意しておいてください。また、ブレッドボードやジャンプワイヤをお持ちでない方は、揃えておいてください。
開発環境
項目 | バージョン |
---|---|
Arduino IDE | 1.8.10 |
パソコン | macOS Big Sur 11.0.1 |
準備
ArduinoでDHT11を使えるように準備します。
Arduino IDEにDHT11ライブラリをインストール
Arduino IDEでDHT11ライブラリをインストールします。次の手順にしたがって、AdafruitのDHT sensor libraryとAdafruit Unified Sensorをインストールします。
Adafruit Unified Sensorのインストール
▼ Adafruitのライブラリの詳細はこちらから。
Visual Studio Codeをお使いの場合
Visual Studio Codeを使ってArduino開発を行なっている方は、直接ファイルをGitHubからダウンロードしても良いかもしれません。
下記のGitHubページへアクセスし、「Code」ボタンから「Download ZIP」でダウンロードします。必要なファイルは DHT.h と DHT.cpp のみなので、それらを.inoファイルのあるディレクトリへ移動すればインストール完了です。
Visual Studio CodeでArduino開発するメリット
Visual Studio Codeで開発するメリットは、ひとことでいえば「つかいやすい」です。ファイル管理が圧倒的にラクです。
Visual Studio Codeを使うと、ライブラリへのアクセスが簡単になるので、プロの書いたプログラムを見る機会が増えて勉強になります。Visual Studio CodeでArduino開発したい方は、Visual Studio CodeでArduino開発をはじめようをご覧ください。
DHT11のピン端子役割
DHT11から湿度や温度を読み取るには、DATAピンでデータのやりとりを行います。VDDは3V〜5Vの範囲で使用できます。また、NCピンは使いませんので何も接続しません。
▼ DHT11、DHT22のデータシートはこちらから。
DHT11とArduinoの配線
DHT11とArduinoの配線の配線図です。VDDは5Vと3.3Vのどちらでも構いません。また、NCには何もつなぎません。
DHT11 | Arduino Uno |
---|---|
VDD | 5V |
DATA | D2 |
NC | -- |
GND | GND |
プルアップ抵抗
配線図のように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
M5StickC PLUSは、ESP32 PICOをベースとした、バッテリーや液晶ディスプレイが内蔵されたArduino互換機です。
M5StickC PLUSの使い方はM5StickC PLUSでArduinoをはじめよう!をご参考になさってみてください。
HAT基板
M5StickC PLUSでセンサを扱いやすくするため、エッチングで基板製作してセンサをHAT化しました。もちろんユニバーサル基板でも作れますし、スイッチサイエンスさんから出ているユニバーサル基板内蔵のHATモジュールを使ってもよさそうです。
M5StickC PLUSとDHT11の配線
M5StickC PLUSとDHT11の配線は図の通りです。4.7kΩの抵抗をデジタルピンにつなげ、5V電源にプルアップします。
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だといろいろなセンサを付け替えられるので便利ですね。
課題
今後は、いちいちプログラムを毎回書き直さなくても、モジュールを付け替えられるようにしていきたいです。また、基板むき出しのままだと使いずらいので、そのうちケースも考えたいところです。
▼ Arduino初心者向きの内容となっています。ほかのArduino書籍と比べて図や説明がとてもていねいで、読みやすかったです。Arduinoで一通りのセンサーが扱えるようになります。
▼ 外国人が書いた本を翻訳したものです。この手の書籍は、目からうろこな発見をすることが多いです。
▼ Arduinoの入門書を既に読んでいる方で、次のステップを目指したい人向きの本です。C言語のプログラミングの内容が中心です。ESP32だけでなく、ふつうのArduinoにも役立つ内容でした。