Arduino 入門
Lesson 11
【温湿度センサ編】
「Arduino」を使ったマイコンプログラミングを学習するブログ。
少しずつ気長にアップしてく予定です。
本日はLesson 11 温湿度センサ編です。
※名前の通り、温度と湿度を測定するセンサです。
Arduino入門編の解説にて使用しているArduinoは互換品です。
互換品とは言え、Arduinoはオープンソースであり複製して販売するのもライセンス的に問題なし。
そのため互換品の品質も悪くなく、それでいて値段は安いです。
正規品本体の値段程度で豊富な部品が多数ついています。
正規品(Arduino UNO R3)の本体単品がほしい方はこちらとなります。
Arduino入門編2では「Arduino UNO R4 Minima」「Arduino UNO R4 WIFI」にて遊ぶため今のところは正規品を使用。(まだ互換品が・・・ほぼない)
はじめに
「温度センサ」、「湿度センサ」は、名前の通り気温、湿度の状態を取得できる電子部品です。
例えば、温度センサ、湿度センサで室内の温度、湿度を測定して扇風機や除湿器、加湿器を自動的に動かすといったことができます。
センサには、温度、湿度を個別に計測するものもあれば、温度と湿度を同時に測定できるものもあります。
また、センサの種類によって計測できる範囲が決まっています。
例えば、室温を計測する用途であれば、それほど範囲はいらないですよね?
しかし、加熱機器のそば、極寒地などの場合は計測範囲が広くないとだめですよね。
また、通信方式も様々で、「アナログ」、「I2C」、「SPI」など色々です。
種類、用途によって値段も異なりますので自分が使いたい用途に合わせて購入するのが良いと考えます。
今回は安価な温湿度センサを利用します。
精度は良くありませんが、値段も安価でLessonにはちょうど良いと考えます。
使用するのはこちら。※DHT11を基板に取り付けモジュール化したもの。
温度と湿度を「こう正」済みの状態で出荷されるセンサーです。
デジタル信号で制御が可能です。
※測定範囲、精度の高いDHT22もあります。
Lesson 11 目標
「温湿度センサモジュール」の制御方法を理解します。
また、部屋と外の温度、湿度を測定しシリアルモニタに表示します。
できれば、1602 LCD ディスプレイモジュールと組み合わせてパソコンではなく、LCDに表示させパソコンを使用しない形にしたいのですがLCDの制御方法はまだ説明していません。
LCDのLessonのところで組み合わせて使うようにしようかと考えています。
今回は、温湿度センサを利用するためにライブラリを使用することにします。
省くといっても、温湿度センサの仕様書に書かれているTiming図(温湿度センサを制御するための動作)の部分をライブラリにまかせるということです。
使いやすいライブラリが提供されています。
例えば「DHTライブラリ」などです。
ライブラリを使用したい方は、Lesson 01を参考に「DHT」ライブラリを使える状態にしてください。
今回利用する、<DHT.h>を利用する方法は2つ。
※Lesson 01にライブラリについて詳細が記載されています。
ライブラリを使用した方が、スケッチも煩雑にならず、なおかつ直観的にわかりやすいスケッチになります。
最後に、本Lessonも、遊ぶというところが一番大事なところです。
準備
ではLessonの準備に取り掛かりましょう。
今回も部品は多くないので、すぐに実践に移ることができます。
必要なもの
- USB接続用のPC(IDE統合環境がインストールされたPC)
→管理人が勝手に比較したBTOメーカーを紹介しています。 - UNO R3(以下UNO)、おすすめUNO互換品(ELEGOO)
- PCとUNOを接続するUSBケーブル
- ブレッドボード安価(大)、ブレッドボード安価(中)
※おすすめブレッドボード(大)、おすすめブレッドボード(中) - 温湿度センサ(DHT11)
- M-M Jumper wire(UNOと部品をつなぐための配線)
使用部品説明
新たに登場した部品について説明していきます。
本Lessonで新しく登場するのは、温湿度センサ(DHT11)のみです。
温湿度センサモジュール 実物写真
下の写真が、温湿度センサモジュール(DHT11)です。
私が購入したELEGOO UNO キットには合わせて梱包されています。
注意点が1つあります。
こちらの温湿度センサはDHT11に基板を取り付けモジュール化したものということです。
本来、DHT11単体の場合端子が4つあります。
左から、VDD、DATA、NC、GNDとなっています。
基板に取り付けて、DATAピンはプルアップ付き、NCは外にでてこないようにしています。
基板からでているのは、左からDATA(プルアップ付き)、VDD、GNDの3本となります。
DHT11を単体で用いるより、基板付きを利用した方がプルアップの手間が省けるので良いと考えます。
UNOのデジタルピンには、プルアップ機能がありますがDHT11の仕様とあいません・・・。
DHT11のプルアップ仕様は20m(max)で5.1kΩプルアップすることとなっています。
一般的には4.7kΩ~10kΩ程度を使用るようです。
ちなみにUNOのプルアップ仕様は20kΩ~50kΩです。
※UNOのPINについてはこちら⇒Arduino 入門 番外編 02 外観とピン配置
手持ちがない方は以下からどうぞ。
温湿度センサモジュール DHT11仕様
温湿度センサモジュール、DHT11の仕様は以下のようになっています。
項目 | 内容 |
---|---|
動作電圧 | DC 3.3V~5.5V |
待機時消費電流 | >60μA |
測定時消費電流 | <1mA |
サンプリング間隔 | >2秒 |
分解能 | 16bit |
湿度センサ | |
項目 | 内容 |
センサ | 有機ポリマー |
精度 | ±5% RH(@25℃) ※RH(Wikipedia) |
繰り返し精度 | ±1% RH |
レスポンス時間 | <6s |
温度センサ | |
項目 | 内容 |
センサ | NTCサーミスタ |
精度 | ±2℃(@25℃) |
繰り返し精度 | ±0.2℃ |
レスポンス時間 | <10s |
シリアル通信部 | |
項目 | 内容 |
形式 | 単線バス、シリアル40bit |
出力データ | 湿度:8bit(分解能:1%RH) 温度:8bit(分解能:1℃) |
出力 | オープンドレイン(Wikipedia) |
通信距離 | <20m |
温度 湿度 検出のしくみ
温湿度センサからデータを取得するためにTiming図に従って信号を送る必要があります。
※Lesson 10の超音波センサからデータを取得する方法と似ています。
それでは、送信方法はどうするのか?
1.UNOから温湿度センサへの開始信号送信
- UNOからLow信号を送る
- Lowの状態を18[ms]以上維持
- UNOからHigh信号を送る
2.温湿度センサからUNOへの開始信号
- 温湿度センサがLowを送信
- 温湿度センサがLowを80[μs]維持
- 温湿度センサがHighを送信
- 温湿度センサがHighを80[μs]維持
- 温湿度センサがデータを送信開始(データサイズ40bit)
3.データ送信開始
湿度センサからUNOに送られてくるビットデータは40bitです。
40bitのデータは、「0」、「1」のいずれかによって下記となります。
ビットデータが0の場合
- 温湿度センサがLow送信
- 温湿度センサがLowの状態を50[μs]維持
- 温湿度センサがHighを送信
- 温湿度センサがHighの状態を26~28[μs]維持
ビットデータが1の場合
- 温湿度センサがLowを送信
- 温湿度センサがLowの状態を50[μs]維持
- 温湿度センサがHighを送信
- 温湿度センサがHighの状態を70[μs]維持
4.温湿度センサからUNOへ終了信号
- 温湿度センサがLowを送信
- 温湿度センサがLowの状態を50[μs]維持
- 温湿度センサがHighを送信
40bitのデータについて
40ビットは以下に示すデータとなります。
上位から湿度の整数、湿度の小数、温度の整数、温度の小数、パリティビットとなっています。
受信データ | 内容 |
---|---|
xxxx xxxx | 湿度 整数部 |
0000 0000 | 湿度 小数部※DHT11は0 |
xxxx xxxx | 温度 整数部 |
0000 0000 | 温度 小数部※DHT11は0 |
xxxx xxxx | パリティビット ※湿度、温度を加算した値 |
実践 回路作成とコード作成
最初に回路図を確認してください。
次に、回路図に合わせて部品を接続します。
最後にコードを書いて、温湿度センサモジュールを動かしていきましょう。
どんなふうに動くのか楽しみです。
Arduinoのピン配置を確認したい方は番外編02を参照してください。
回路図
回路図がこちら。
こちらがブレッドボード図。
※M-M jumper wireのみで結線できます。
回路図は「fritzing」を利用しています。
「fritzing」の使い方は下記を参照してください。
接続
下図に示すように、用意した部品を使用して接続しましょう。
部品は温湿度センサモジュールのみです。
ブレッドボードを使用していますが、F-M Wireを利用すればブレッドボードなしでも接続できます。
M-M jumper wireを使用してUNOと接続しましょう。
使用するポートは、Digital IOの「8」、電源の「5V」、「GND」です。
穴に挿入しづらいときは、ラジオペンチなどを使用してください。
コードの書き込み
接続が終わったら、USBケーブルを使用してUNOにプログラムを書き込んで行きましょう。
本記事のコードを参考に書いてみてください。
実際書いてみた方が慣れるのに良いです。
コードを書き終えたら、いつでも利用できるように「ファイル」⇒「名前を付けて保存」で保存しておきましょう。
コマンド説明
新しく出てきたコマンドの説明をしていきます。
※復習も兼ねて、一部以前に説明したコマンドもあるかもしれません。
コマンド | 説明 |
---|---|
float | 浮動小数点を持つ数値のためのデータ型。 ※小数が扱えます。 整数よりも分解能が高いアナログ的な値が必要なときに使用。 使用可能な値の範囲:3.4028235E+38~-3.4028235E+38 ※32ビット(4バイト)のサイズ 例 TrigPin変数を不動小数点のデータ型にする。 float TrigPin; |
bool boolean ※どちらでも良い |
true、falseのどちらか一方の値を持つための型。 例 isFahrenheitにtrueを設定 bool isFahrenheit = true; |
Serial.begin(speed) | シリアル通信のデータ転送レートをbpsで指定。 ※bpsはビット/秒 speed:転送レート(int) |
if(isnan(xxx)){ } |
isnanはxxxがnanであるかどうかを判定します。 値が電子機器から取得できない場合nanとなると考えてください。 nanである場合、if文内の構文を実行するということです。 |
サンプルコード
サンプルコードを下記に示します。
今回、Timing図の部分は<DHT.h>ライブラリにまかせます。
サンプリング周期は1秒のため、データの要求は1秒以上の間隔を開ける必要があります。
//Lesson 11 温湿度センサモジュール //温度、湿度を測定するスケッチ //https://omoroya.com/ #include "DHT.h" //ライブラリインクルード #define DHT_Pin 8 //DHT11のDATAピンを定義 #define DHT_Type DHT11 //センサの型番定義 DHT11,DHT22など DHT dht(DHT_Pin, DHT_Type); //センサ初期化 /* 計測値設定 */ float humidity = 0.0f; //湿度 float tempC = 0.0f; //摂氏温度 float tempF = 0.0f; //華氏温度 float discomfortIndex = 0.0f; //不快指数 bool isFahrenheit = true; //華氏読み出し引数にtrueを設定 void setup() { Serial.begin(9600); //シリアル通信のデータ転送レートを9600bpsで指定。bpsはビット/秒。 Serial.println("DHT11 Lesson11"); //画面に表示 dht.begin(); //温湿度センサー開始 } void loop() { delay(2000); //2秒待つ データの読み出し周期1秒以上必要。 humidity = dht.readHumidity(); //湿度の読み出し tempC = dht.readTemperature(); //温度の読み出し 摂氏 tempF = dht.readTemperature( isFahrenheit ); //温度の読み出し 華氏 /* 読み取れたかどうかのチェック */ if (isnan(humidity) || isnan(tempC) || isnan(tempF)) { Serial.println("Read failure!"); return; } /* おまけ 不快指数計算 */ discomfortIndex = 0.81f * tempC + 0.01f * humidity * (0.99f * tempC - 14.3f) + 46.3f; /* 以下読み取り値の表示 */ Serial.print("湿度: "); Serial.print(humidity); Serial.println("[%]"); Serial.print("温度: "); Serial.print(tempC); Serial.println("[℃]"); Serial.print("華氏: "); Serial.print(tempF); Serial.println("[F]"); Serial.print("不快指数: "); Serial.println(discomfortIndex); }
おまけで摂氏と華氏の両方表示と不快指数も計算させてみました。
動作確認
では、さっそく動作を確認していきます。
部屋の湿度、温度と不快指数、外の湿度、温度と不快指数を測定してみます。
結果はこちら。
※IDEの「ツール」⇒「シリアルモニタ」を開いて確認してください。
測定環境 | 測定値 |
---|---|
部屋 | ![]() |
外 | ![]() |
Lessonとしては部屋の中と外で違いが出ているので成功ではないでしょうか。
まとめ
今回は以下の内容について理解してもらいました。
今回も項目3の遊ぶことが一番の目標でした。
2.部屋と外の温度、湿度を測定しシリアルモニタに表示する。
3.楽しんで遊ぶ。
いかがだったでしょうか。
Lesson 11 温湿度センサ編はここまで。
ぜひ、みなさんも子供と一緒にやられてみることをお勧めします。
温度と湿度いろんな場所を測って遊んでみましょう!
疑問点、質問などありましたら気軽にコメントください。
次回、Lesson12は「ポテンショメータ編」です。
説明していなかったanalogRead関数を理解して電圧を測定しましょう!

最後に
疑問点、質問などありましたら気軽にコメントください。
この電子部品の解説をしてほしい!などなどなんでもOKです。
リンク切れ、間違いなどあればコメントいただけると助かります。
Arduino入門編、番外編、お役立ち情報などなどサイトマップで記事一覧をぜひご確認ください。
Arduino入門編、Arduino入門編2で使用しているUNOはAmazonにて購入可能です。
Arduino入門編では互換品を使用。
Arduinoはオープンソース。
複製して販売するのもライセンス的に問題なし。
そのため互換品の品質も悪くなく、それでいて値段は安いです。
正規品本体の値段程度で豊富な部品が多数ついています。
学習用、遊び用、お試し用には安価な互換品がおすすめです。
ELEGOO UNO キット レベルアップ チュートリアル付 uno mega2560 r3 nanoと互換 Arduino用
上記のものでも十分に多数の部品が入っていますが、最初からもっと多数の部品が入っているこちらもお勧めです。
Arduino入門編2では「Arduino UNO R4 Minima」「Arduino UNO R4 WIFI」にて遊ぶため今のところは正規品を使用。(まだ互換品が・・・ほぼない)
Amazonでお得に買う方法
Amazonでお得に購入するならAmazon Mastercard、Amazonギフト券がおすすめです。
時期により異なりますが、様々なキャンペーンを実施しています。
\Amazonギフト券/
Amazonギフトカード キャンペーン
\Amazon Mastercard お申込み/
Amazon Mastercard 申し込み
いずれの場合もプライム会員である方がお得!!
\Amazon Prime 30日間の無料会員を試す/
無料会員登録
コメント
古い記事ですが、omoroyaさんだからあえて・・・
DHT11用ライブラリ、氷点下の処理でミスがあります。
http://igarage.cocolog-nifty.com/blog/2022/03/post-40e88b.html
http://igarage.cocolog-nifty.com/blog/2021/12/post-0593d4.html
マイナスの「温度」を扱う時はご注意を!
居酒屋ガレージ店主さん、コメントありがとうございます。
記事拝見いたしました!!!
なるほど、そういうことですね・・・。
マイナスの温度を検証していませんでした。。。
記事、近々見直します!
Arduino の存在を知って、つい最近手に入れた物です。とても有用な記事をありがとうございます。
基本的な知識がなくて恐縮なのですが https://omoroya.com/wp-content/uploads/2019/01/Arduino-lesson11-04.jpg の図の抵抗とその線はなぜ必要なのでしょうか?(「基板に実装されてるのに」という意味ではなく、根本的に理解できていません)
DATAはD8に繋がり、5VはVDDに繋がってるというのはわかるのですが、D8とDATAの間に赤線からの繋がる理由も、間に抵抗が必要な理由もわかりません。
また、このあたりの知識を理解するためのおすすめの本などがあったら教えて頂けるととても助かります。
コメントありがとうございます。
DATAピンはオープンドレインとなっているためプルアップする必要があります。
UNOの端子にもプルアップ機能はありますが、プルアップの能力をあげる必要があるため入れてあります。
オープンドレインとは、
「信号をLowレベルにすることはできるが、Highレベルにすることができない」
回路がDATAピンに組み込まれていると思っていただいて差し支えありません。
そのため、DATAピンをHighレベルにするために抵抗を介して5Vに吊っている状態ということになります。
補足
DATAピンがLowレベル以外のの時は、
Hi-Z状態(HighでもLowでもなくドライブされていない状態)のため抵抗を介して5VにつないでおけばDATAピンは5Vになります。
※ただし、Lowレベルにするための能力よりもプルアップ抵抗を小さくしてしまうとLowにできないため、通常プルアップ抵抗は高抵抗となります。
おすすめの本ですが、初心者向けのの電気回路、電子回路の本が良いと思います。
ちょっと探してみて良いのがあれば紹介します。
入門記事とかを読んでいてプルアップとかプルダウンの説明はあったのですが、何となく通り過ぎるだけでまったく理解できていませんでした。
コメントを拝見して、このことかーと、頭の中の知識がカチッと繋がった感じです。ものすごく勉強になりました。ありがとうございます。
持っている本を改めて読み直したり、オープンドレインという単語を元に色々調べて、ようやく腹落ちしました。
DHT11は負論理というやつなんですね。つまり
・フラグが正は 0V で表現
・フラグが負の場合はなんか不定な電圧になっているので、プルアップにより吊り上げてやる必要がある
・フラグが正の場合は0Vまで落とす必要があるので、プルアップ抵抗があまり小さいと電圧が0まで落とし切れなくて、正にできなくなる
ということだったんですね。
腹落ちしたようで何よりです。
本ですが、CQ出版社の
「オームの法則から! 絵ときの電子回路 超入門(TRSP No.138) (トランジスタ技術SPECIAL)」
とかが良いかなと思います。
ただ、回路の知識が中学校の理科レベルで止まっている場合、文系出身の方の場合はこの本のレベルがあっているか?
というところは悩ましいところです。
数式とかは無視して絵を見て抽象的に理解するには役に立つかなと思います。
変な教科書的な本よりもCQ出版社の本は実用的なのでおすすめです。
教科書的な本は、「で実際どうするの?」というのがわからないことが多い!
そのため管理人はおすすめではないです。
理論よりも、作って、遊んで、色々やってみて・・・
そのあとに、教科書的な本を読んで深く学ぶことをおすすめします。
まずは色々と遊んでみましょう!
ご紹介ありがとうございます。
Amazonに在庫があったので、さっそく注文しました!
丁寧な記事をありがとうございます。
この記事とLCDの記事を合わせて測定した温湿度をLCDに表示することができました。
ありがとうございます。
データ取得の桁数について質問させてください。
温湿度の末尾(小数点2位)を消してシリアルに表示するにはどうすればいいのでしょうか?
データ取得の桁数を変更する方法があればご教示いただけますか?
よろしくお願いします。
コメントありがとうございます。
手っ取り早く、変数型をfloat型ではなくint型にしてみたらどうでしょうか。
お試しください。
お願いがありまして、[RC522 RFID Module] を使ったスケッチ、ブレットボード図を作ってくださいまさんか?(できればライブラリなしで)よろしくお願いします。
コメントありがとうございます。
てもとに、RC522 RFIDがありません。
入手できたら、検討します。
写真とブレッドボード図の違いが初心者で分りづらかったので、DHT11モジュールの3本端子で左が8、中5V、右GND。
サンプルコードをそのままコピペしてコンパイルしてみたのですが「コンパイルが終了しました。終了ステータス1DHT.h:そのようなファイルまたはディレクトリはありません」とエラーが出てしまいました。DHTのライブラリがないのでしょうか?
さっぱりわかりません。
もしお分かりであれば教えていただけないでしょうか?
コメントありがとうございます。
本Lesson記載のスケッチを利用する場合はライブラリのインストールが必要です。
「ツール」⇒「ライブラリを管理…」からインストールする。
下記2つインストール必要です。
「DHT sensor library」
「Adafruit Unified Sensor」
リンクにあるDHT11モジュールだと正常動作しません。配列が左から+、out、ーになっています。out端子を8番、+端子を5Vにつないでも、正常動作しません。
こんにちは。
正常動作しないというのは、シリアルモニタに出てくる値がおかしいということですか?
それとも、まったく動作しないということでしょうか?
手持ちのDHT11はプルアップ抵抗付きのモジュールタイプですか?
dht11センサの使い方がいまいち理解しきれず、運良くこの素敵なサイトにたどり着きました。
恥ずかしながらプログラムに不慣れなもので、ソースコードに細かくコメントが付いており理解の助けになりました。
どうもありがとうございました。
コメントありがとうございます。
スローペースですが
これからも、できる限りわかりやすい記事をアップしていきます。