今回は温湿度センサー(DHT11)をArduinoに接続しそのセンサー情報をシリアルモニタやLCDディスプレイに表示させてみたいと思います。
これまでArduino(こちらではArduino Unoでご説明していきます)のデジタル入出力ピンやアナログ入力ピンなどGPIOピンからサーボモーターを動かしたりスイッチのON/OFF判定、ジョイスティックや可変抵抗器などアナログ値の入力などで使ってきました。
Arduinoの基本的なGPIOピンの使い方が理解できてきたところで今回は温湿度センサーを使ってみたいと思います。
Arduinoで使えるセンサーはいろいろとありますが、これまでArduinoスターターキット(後でご紹介します)に同封されている超音波センサー(HC-SR04)や光センサー(Cdsセル)を使った作例をご紹介しました。
今回使用する温湿度センサーDHT11もArduinoスターターキットに入っているものとなり、Arduinoではよく使われるセンサーの1つとなります。
デジタル信号でのデータのやり取りで使えるセンサーとなり、デジタル入出力ピンに接続し面倒なデータのやり取りのタイミングなどは専用ライブラリを使うことにより比較的簡単にセンサーからの温湿度情報を取得することができます。
センサー情報の取得が出来れば、シリアルモニタやLCDディスプレイを使い温度や湿度を表示させることが出来ます。
目次
【Arduino】温湿度センサーDHT11を制御し温度&湿度を計測する
今回の目的
温湿度センサー(DHT11)からのセンサー情報を専用ライブラリ「DHTライブラリ」を使い取得し、シリアルモニタやLCDディスプレイに表示させてみたいと思います。
センサー情報の取得には少し面倒なタイミングチャートがありますが、この部分は全てライブラリが担当してくれるのであまり意識することなく比較的簡単に行えます。
今回はライブラリを使いDHT11からの情報を取得し、これまでやってきたシリアルモニタやLCDディスプレイに取得した値(温度や湿度)を表示させるまでを今回の目的としたいと思います。
温湿度センサー(DHT11)
Arduinoで使えるセンサーはいろいろとありますが、今回は温湿度センサーを使ってみたいと思います。
Arduinoで使える温度や湿度を検知するセンサーには、DHT22やSHT-71、AM2302などいろいろとあります。
温度センサーは室温を計測しエアコンをON/OFFさせたり、湿度センサーは湿度を計測し加湿器の制御を自動で行ったりといった用途で使えます。
またセンサーには、温度と湿度を個別に計測するものや同時に計測できるタイプの温湿度センサーなどがあります。
通信方式(Arduinoとのデータのやり取り)も様々で、I2C通信で使えるものやアナログタイプのものなどもあります。
今回はArduinoでよく使われるDHT11という温湿度センサーを使ってみたいと思います。
温度と湿度を同時に計測できるタイプのセンサーとなり、デジタル信号でのデータのやり取りを行いArduinoのデジタル入出力端子を使って制御(データの取得)を行います。
DHT11はサーミスタなどとは異なり、温度と湿度を校正(キャリブレーション)済みの状態で出荷されるセンサーとなります。
専用ライブラリを使うことによりデータのやり取りで行われる面倒なタイミングチャートの部分は全てライブラリが代わりにやってくれるので概要が分かれば比較的簡単にデータの取得が出来ます。
モジュール化されたDHT11
温湿度センサー(DHT11)は下写真の青いボックス部分がセンサー本体となっており接続端子は4本あります。
DHT11センサーはデジタルセンサーとなっており、センサー本体に付いている4ピンの端子配列は左からVDD・DATA・NC・GNDとなっています。
またVDDへの電力の供給は3.3Vから5.5Vの範囲となります。
接続はこのようになります。
VDDとGNDはArduinoの5V・GND端子に接続し、DATA端子はArduinoのデジタルピンに接続する形となります。
ここでDATAピンはプルアップして使います。
プルアップ抵抗はワイヤーが20m以下の場合は5kΩ程度が推奨されているようで、一般的には4.7kΩから10kΩの抵抗が使われるようです。
しかしこの内部プルアップ抵抗は20kΩとなるので、今回使うDHT11センサーでは値が違い使えないため外部にプルアップ抵抗を接続する必要があります。
プルアップ抵抗に関してはこちらの記事を参考にして下さい!
温湿度センサーDHT11を単体で使う場合は上記回路のようにDATAピンにプルアップ抵抗を接続して使う形となりますが、今回はモジュール化されたものを使います。
下写真のようにモジュール化されたDHT11では、VDD・DATA・GNDの3ピン端子となっています。
そしてDATAピンには10kΩの抵抗が接続されプルアップされた状態となっています。
プルアップ抵抗が内蔵され接続されているのでArduinoとの接続は、DATAピンは直接Arduinoのデジタル入出力ピンに接続するだけです。
また電源となるVDDとGNDもArduinoの5V端子とGND端子に接続すれば完了です。(上記回路図のプルアップ抵抗は不要となります)
DHT11 | Arduino |
VDD | 5V端子 |
GND | GND端子 |
DATA | デジタル入出力ピン(D0~D13) |
データのやり取りはシングルバス・データフォーマットとなり少し面倒なタイミングでのやり取りが必要ですが、実際にはライブラリを使ってこの部分の処理を行うのであまり意識することなく比較的簡単に行なえます。(DHTライブラリを使用)
そしてDHT11は低コストな温湿度センサーとなり、2秒に1回しかデータを取得することが出来ない仕様となっているようです。
そのためライブラリを使ってセンサー情報を読み取る場合は、ソフトウェア側でdelayを取りその間隔を2秒以上空ける必要があります。
制御で使われるタイミングチャートなどをご覧になりたい方は、秋月さんのサイトにデータシートがあったのでこちらを参考にして下さい。
参考 DHT11データシート秋月電子通商また、DHT11と互換性があり精度の高いDHT22もあります。
温湿度センサーDHT11の接続
それでは温湿度センサーDHT11をArduinoと接続します。
電源供給端子VDDとGNDはArduinoの5V端子とGND端子に直接繋げます。
そしてDATAピンは本来10kΩの抵抗でプルアップして使う必要があるのでこのように接続します。
モジュール化されたDHT11ではプルアップ抵抗が内蔵されているので上記回路の外部プルアップ抵抗は接続する必要がなく、Arduinoのデジタル入出力ピンに直接接続して使えます。
モジュール化されたDHT11のピン配列は、左からSignal(DATA)・VDD・GNDとなっているのでそれに対応させ接続して下さい。
今回デジタル入出力ピンはD7ピンを使いました。
接続は非常に簡単ですね!
DHTライブラリのインストール
温湿度センサーDHT11を使うには専用ライブラリをインストールする必要があります。
DHT11からの温度と湿度情報を取得するためのライブラリとなります。
Arduino IDEから[スケッチ]→[ライブラリをインクルード]→[ライブラリを管理]へと進みます。
[dht]で検索すると[DHT sensor library]が出てくるのでこれをインストールします。これでライブラリが使える状態になりDHT11を制御することが出来るようになります。
このライブラリでは今回使っている温湿度センサーDHT11以外にもDHT22やDHT21なども使用することが出来ます。
またGithubからZIP形式のファイルをダウンロードしてライブラリをインストールすることも出来ます。
参考 DHT sensor libraryGithubシリアルモニタにセンサー情報を表示してみる
温湿度センサーDHT11から取得した情報をシリアルモニタに表示させてみたいと思います。
このようなスケッチを作ってみました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | // Arduino入門編㉑ 温湿度センサーの情報をシリアルモニタに表示 // https://burariweb.info #include <DHT.h> // ライブラリのインクルード #define DHT_PIN 7 // DHT11のDATAピンをデジタルピン7に定義 #define DHT_MODEL DHT11 // 接続するセンサの型番を定義する(DHT11やDHT22など) DHT dht(DHT_PIN, DHT_MODEL); // センサーの初期化 void setup() { Serial.begin(9600); // シリアル通信の開始 dht.begin(); // センサーの動作開始 } void loop(){ delay(2000); // センサーの読み取りを2秒間隔に float Humidity = dht.readHumidity(); // 湿度の読み取り float Temperature = dht.readTemperature(); // 温度の読み取り(摂氏) if (isnan(Humidity) || isnan(Temperature)) { // 読み取りのチェック Serial.println("ERROR"); return; } // シリアルモニタに温度&湿度を表示 Serial.print("温度: "); Serial.print(Temperature); Serial.print("[℃]"); Serial.print(" 湿度: "); Serial.print(Humidity); Serial.println("[%]"); } |
このようにセンサー情報をリアルタイムに取得し(2秒おきですが)シリアルモニタに温度と湿度が表示されます。
シリアルモニタの使い方はこちらを参考にして下さい。
スケッチ解説
DHTライブラリを使った一連の流れはこのようになります。
DHT dht(DHT_PIN, DHT_MODEL);でセンサーを繋ぐデジタルピン番号およびセンサーの型番(今回はDHT11を使用)を指定します。
4 5 6 7 8 9 | #include <DHT.h> // ライブラリのインクルード #define DHT_PIN 7 // DHT11のDATAピンをデジタルピン7に定義 #define DHT_MODEL DHT11 // 接続するセンサの型番を定義する(DHT11やDHT22など) DHT dht(DHT_PIN, DHT_MODEL); // センサーの初期化 |
13 14 15 16 17 18 19 | void setup() { Serial.begin(9600); // シリアル通信の開始 dht.begin(); // センサーの動作開始 } |
24 | delay(2000); // センサーの読み取りを2秒間隔に |
floatで浮動小数点を持つ数値として扱っています。
26 27 | float Humidity = dht.readHumidity(); // 湿度の読み取り float Temperature = dht.readTemperature(); // 温度の読み取り(摂氏) |
34 35 36 37 38 39 40 41 | // シリアルモニタに温度&湿度を表示 Serial.print("温度: "); Serial.print(Temperature); Serial.print("[℃]"); Serial.print(" 湿度: "); Serial.print(Humidity); Serial.println("[%]"); |
DHTライブラリを使った流れ
- ライブラリのインクルード&センサーの初期化
- センサーの動作開始
- データ取得のタイミング(2秒以上の間隔を空ける)
- センサー情報の取得
- シリアルモニタやLCDに表示させる
LCDディスプレイに表示してみる
それでは最後にI2C通信を使いLCDモジュールに表示させてみたいと思います。
先程の回路にI2C通信に対応したLCDモジュールを接続します。
モジュール化したセンサーを使う場合、同様にプルアップ抵抗は省略出来ます!
LCDモジュールの表示方法はこちらを参考にして下さい。
先程のスケッチにLCD表示部分を追加しました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | // Arduino入門編㉑ 温湿度センサーの情報をLCDに表示 // https://burariweb.info #include <LiquidCrystal_I2C.h> // ライブラリのインクルード #include <DHT.h> LiquidCrystal_I2C lcd(0x27, 16 , 2); // 0x27のアドレス,16列2行のLCDを使用 #define DHT_PIN 7 // DHT11のDATAピンをデジタルピン7に定義 #define DHT_MODEL DHT11 // 接続するセンサの型番を定義する(DHT11やDHT22など) DHT dht(DHT_PIN, DHT_MODEL); // センサーの初期化 void setup() { Serial.begin(9600); // シリアル通信の開始 dht.begin(); // センサーの動作開始 lcd.init(); // LCDの初期化 lcd.backlight(); // LCDバックライトの点灯 lcd.setCursor(0, 0); // カーソルの位置を指定 lcd.print("Humid "); // 文字の表示 lcd.print("Temp "); } void loop(){ delay(2000); // センサーの読み取りを2秒間隔に float Humidity = dht.readHumidity(); // 湿度の読み取り float Temperature = dht.readTemperature(); // 温度の読み取り(摂氏) if (isnan(Humidity) || isnan(Temperature)) { // 読み取りのチェック Serial.println("ERROR"); lcd.setCursor(0, 1); lcd.print(" ERROR "); return; } // シリアルモニタに温度&湿度を表示 Serial.print("温度: "); Serial.print(Temperature); Serial.print("[℃]"); Serial.print(" 湿度: "); Serial.print(Humidity); Serial.println("[%]"); // LCDに温度&湿度を表示 lcd.setCursor(0, 1); lcd.print(Humidity); lcd.print("% "); lcd.print(Temperature); lcd.print("C"); } |
LCDモジュールに表示させることが出来ました。
試しにセンサー部分に息を吹きかけてみるとリアルタイムで数値が変化するのが確認できると思います。
これで今回の目標は達成です!
【追記】Mini Weather Stationを作ってみました!
Wemos D1 Mini(ESP8266開発ボード)を使ったミニサイズのウェザーステーションを作ってみました。
DHT22(DHT11)を使い室内のリアルタイム温湿度も表示出来るようにしています。
こちらの記事も参考になればと思います。
今回使ったアイテム
温湿度センサー(DHT11)
今回使った温湿度センサー(DHT11)はモジュール化されプルアップ抵抗が内蔵されたこちらのものを使用しました。
またセンサー単体でも販売されています。
1602 LCDモジュール
Arduinoでよく使われるポピュラーなLCDモジュール(16×2)となります。
I2Cシリアルインターフェースボードモジュールが付属したこちらを使用しました。
Arduino UNO
Arduinoはオープンソースのハードウェアなので正規品以外にも互換品が多数メーカーから販売されています。
互換品でも正規品と比べて特に問題なく使用でき数百円程度で購入が可能なのでArduino学習用としていいですね!
Arduino スターターキット
これからArduino学習を進めていくにあたりArduino UNO(互換品)やブレッドボード、ジャンパーピンなどがセットになったスターターキットが販売されています。
私はGeekcreit製のスターターキットを使っていますが、ELEGOO製のものは国内Amazonなどでも購入可能で人気があるようです。(セット内容はほぼ同じです!)
そしてELEGOOのサイトからスターターキット用サンプルスケッチのダウンロードも可能です。(Geekcreitのキットでも使えます)
参考 チュートリアルダウンロードELEGOO基本的にこれからこのセットで出来るものから紹介していこうと考えていますが、かなり多くのことが出来ます。
電子工作を始めるにはまずブレッドボードやジャンパーピン、メインとなるArduino UNOやサーボ、LEDなどの基本的なパーツがないと実際に動かすことが出来ませんが、個々にパーツを購入して回路を組んでとなるとかなりの手間がかかります。
スターターキットがあればArduinoの初歩的なことはかなりの数こなすことが出来るのでオススメです!
そこからスキルアップに伴い個別でセンサーなど必要なものを増やしていくのがいいと思います。
ELEGOO製のスターターキットには今回使用した温湿度センサー(DHT11)は付属しています。
最後に!
今回、温湿度センサーの情報をArduinoで取得して表示させてみました。
Arduinoにはライブラリという便利なものが用意されており、難しい処理の部分はライブラリが担当してくれるので概要さえ掴めれば比較的簡単にセンサー情報を取得することが出来ました。
Arduinoを使っていろいろと出来るようになってくると電子工作の幅も広がり楽しいものですね!
それでは今回はこの辺で・・・!
DHT11用ライブラリ、氷点下の処理でミスがあります。
http://igarage.cocolog-nifty.com/blog/2022/03/post-40e88b.html
http://igarage.cocolog-nifty.com/blog/2021/12/post-0593d4.html
おおー、完全にライブラリを信じきっていましたがそんな事があるんですね!
なかなか氷点下で使うことは私の用途では無いですが・・・
コメント&検証等、ありがとうございます!
全く別件なんですが、DHT11やDHT22はちょっと古いセンサー(昔からある)なので、I2Cに対応したAHT10やSHT20なんかはもっと精度がいいよなんていうコメントをSNSで最近頂いたばかりだったので、なかなか興味深い内容です。
ありがとうございますm(__)m
[…] 値を読み取るだけではなくて、特殊な接続だった。物理的な接続に関しては”S”と”-“しか書かれておらず、その場合はSがデータで、-がグラウンド、残りが5Vっぽい。参考 […]