\ 新生活応援セール 対象のSurfaceが特別価格! /

Arduino 入門 Lesson 11 【温湿度センサ編】

Arduino-lesson11-00Arduino入門編
スポンサーリンク
子供と一緒に始める マイコンプログラム
Arduino 入門
Lesson 11
【温湿度センサ編】

「Arduino」を使ったマイコンプログラミングを子供と一緒に学習するブログ。

少しずつ、子供と一緒に楽しみながら気長にアップしてく予定です。

本日はLesson 11 温湿度センサ編です。
※名前の通り、温度と湿度を測定するセンサです。

 

Arduino入門編の解説にて使用しているArduinoは互換品です。

互換品とは言え、Arduinoはオープンソースであり複製して販売するのもライセンス的に問題なし。

そのため互換品の品質も悪くなく、それでいて値段は安いです。

正規品本体の値段程度で豊富な部品が多数ついています。

 

正規品の本体単品がほしい方はこちらとなります。

 

スポンサーリンク

はじめに

「温度センサ」、「湿度センサ」は、名前の通り気温、湿度の状態を取得できる電子部品です。

例えば、温度センサ、湿度センサで室内の温度、湿度を測定して扇風機や除湿器、加湿器を自動的に動かすといったことができます。

センサには、温度、湿度を個別に計測するものもあれば、温度と湿度を同時に測定できるものもあります。

また、センサの種類によって計測できる範囲が決まっています。

例えば、室温を計測する用途であれば、それほど範囲はいらないですよね?

しかし、加熱機器のそば、極寒地などの場合は計測範囲が広くないとだめですよね。

また、通信方式も様々で、「アナログ」、「I2C」、「SPI」など色々です。

種類、用途によって値段も異なりますので自分が使いたい用途に合わせて購入するのが良いと考えます。

今回は安価な温湿度センサを利用します。

精度は良くありませんが、値段も安価でLessonにはちょうど良いと考えます。

使用するのはこちら。※DHT11を基板に取り付けモジュール化したもの。

 

温度と湿度を「こう正」済みの状態で出荷されるセンサーです。

デジタル信号で制御が可能です。

※測定範囲、精度の高いDHT22もあります。

 

Lesson 11 目標

「温湿度センサモジュール」の制御方法を理解します。

また、部屋と外の温度、湿度を測定しシリアルモニタに表示します。

できれば、1602 LCD ディスプレイモジュールと組み合わせてパソコンではなく、LCDに表示させパソコンを使用しない形にしたいのですがLCDの制御方法はまだ説明していません。

LCDのLessonのところで組み合わせて使うようにしようかと考えています。

 

今回は、温湿度センサを利用するためにライブラリを使用することにします。

省くといっても、温湿度センサの仕様書に書かれているTiming図(温湿度センサを制御するための動作)の部分をライブラリにまかせるということです。

使いやすいライブラリが提供されています。

例えば「DHTライブラリ」などです。

ライブラリを使用したい方は、Lesson 01を参考に「DHT」ライブラリを使える状態にしてください。

今回利用する、<DHT.h>を利用する方法は2つ。

1.「ツール」⇒「ライブラリを管理…」からインストールする。
  ※下記2つインストール必要です。
1.タイプで「推奨」を選択、「DHT sensor library」でフィルタリング
2.タイプで「推奨」を選択「Adafruit Unified Sensor」でフィルタリング
2.ダウンロードしてzip形式でインストール
  ※下記2つインストール必要です。
1.DHTライブラリ ダウンロードサイト
2.Adafruit_Sensor ダウンロードサイト

Lesson 01にライブラリについて詳細が記載されています。

ライブラリを使用した方が、スケッチも煩雑にならず、なおかつ直観的にわかりやすいスケッチになります。

 

最後に、本Lessonも、遊ぶというところが一番大事なところです。

 

ライブラリを使用せずに動作を理解したいので、追記情報としてライブラリを使用しない場合のスケッチも時間を見つけてアップしたいと考えます。

 

準備

ではLessonの準備に取り掛かりましょう。

今回も部品は多くないので、すぐに実践に移ることができます。

 

必要なもの

 

使用部品説明

新たに登場した部品について説明していきます。

本Lessonで新しく登場するのは、温湿度センサ(DHT11)のみです。

 

温湿度センサモジュール 実物写真

下の写真が、温湿度センサモジュール(DHT11)です。

Arduino-lesson11-01

Arduino-lesson11-02

 

私が購入したELEGOO UNO キットには合わせて梱包されています。

注意点が1つあります。

こちらの温湿度センサはDHT11に基板を取り付けモジュール化したものということです。

本来、DHT11単体の場合端子が4つあります。

左から、VDD、DATA、NC、GNDとなっています。

1.NCはnon connection ⇒ 接続しないを意味します。
2.DATAピンはオープンドレイン(Wikipedia)となっています。

 

基板に取り付けて、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単体で使用する場合、4.7kΩ~10kΩの抵抗を用意する必要があります。
本Lessonで使用するセンサ基板には10kΩが実装されています。

 

手持ちがない方は以下からどうぞ。

 

温湿度センサモジュール 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の超音波センサからデータを取得する方法と似ています。

それでは、送信方法はどうするのか?

温湿度センサモジュールのTiming図を下記に示します。

Arduino-lesson11-03

 

今回は、この部分をライブラリにまかせますが説明します。

 

1.UNOから温湿度センサへの開始信号送信
  1. UNOからLow信号を送る
  2. Lowの状態を18[ms]以上維持
  3. UNOからHigh信号を送る

 

2.温湿度センサからUNOへの開始信号
  1. 温湿度センサがLowを送信
  2. 温湿度センサがLowを80[μs]維持
  3. 温湿度センサがHighを送信
  4. 温湿度センサがHighを80[μs]維持
  5. 温湿度センサがデータを送信開始(データサイズ40bit)

 

3.データ送信開始

湿度センサからUNOに送られてくるビットデータは40bitです。

40bitのデータは、「0」、「1」のいずれかによって下記となります。

ビットデータが0の場合

  1. 温湿度センサがLow送信
  2. 温湿度センサがLowの状態を50[μs]維持
  3. 温湿度センサがHighを送信
  4. 温湿度センサがHighの状態を26~28[μs]維持

ビットデータが1の場合

  1. 温湿度センサがLowを送信
  2. 温湿度センサがLowの状態を50[μs]維持
  3. 温湿度センサがHighを送信
  4. 温湿度センサがHighの状態を70[μs]維持

 

4.温湿度センサからUNOへ終了信号
  1. 温湿度センサがLowを送信
  2. 温湿度センサがLowの状態を50[μs]維持
  3. 温湿度センサがHighを送信

 

40bitのデータについて

40ビットは以下に示すデータとなります。

上位から湿度の整数、湿度の小数、温度の整数、温度の小数、パリティビットとなっています。

受信データ内容
xxxx xxxx湿度 整数部
0000 0000湿度 小数部※DHT11は0
xxxx xxxx温度 整数部
0000 0000温度 小数部※DHT11は0
xxxx xxxxパリティビット
※湿度、温度を加算した値

 

実践 回路作成とコード作成

最初に回路図を確認してください。

次に、回路図に合わせて部品を接続します。

最後にコードを書いて、温湿度センサモジュールを動かしていきましょう。

どんなふうに動くのか楽しみです。

Arduinoのピン配置を確認したい方は番外編02を参照してください。

 

回路図

回路図がこちら。

Arduino-lesson11-04

 

こちらがブレッドボード図。
※M-M jumper wireのみで結線できます。

Arduino-lesson11-05

※基板付きのセンサモジュールを使用した場合、抵抗は基板に実装済みです。

 

回路図は「fritzing」を利用しています。

「fritzing」の使い方は下記を参照してください。

 

接続

下図に示すように、用意した部品を使用して接続しましょう。

部品は温湿度センサモジュールのみです。

ブレッドボードを使用していますが、F-M Wireを利用すればブレッドボードなしでも接続できます。

M-M jumper wireを使用してUNOと接続しましょう。

使用するポートは、Digital IOの「8」、電源の「5V」、「GND」です。

穴に挿入しづらいときは、ラジオペンチなどを使用してください。

Arduino-lesson11-07

 

コードの書き込み

接続が終わったら、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);
}

おまけで摂氏と華氏の両方表示と不快指数も計算させてみました。

不快指数(Wikipedia)

 

動作確認

では、さっそく動作を確認していきます。

部屋の湿度、温度と不快指数、外の湿度、温度と不快指数を測定してみます。

結果はこちら。
※IDEの「ツール」⇒「シリアルモニタ」を開いて確認してください。

測定環境測定値
部屋Arduino-lesson11-08
Arduino-lesson11-09

 

Lessonとしては部屋の中と外で違いが出ているので成功ではないでしょうか。

 

まとめ

今回は以下の内容について理解してもらいました。

今回も項目3の遊ぶことが一番の目標でした。

1.「温湿度センサモジュール」の制御方法を理解する。
2.部屋と外の温度、湿度を測定しシリアルモニタに表示する。
3.楽しんで遊ぶ。

 

いかがだったでしょうか。

Lesson 11 温湿度センサ編はここまで。

ぜひ、みなさんも子供と一緒にやられてみることをお勧めします。

温度と湿度いろんな場所を測って遊んでみましょう!

疑問点、質問などありましたら気軽にコメントください。

 

次回、Lesson12は「ポテンショメータ編」です。

説明していなかったanalogRead関数を理解して電圧を測定しましょう!

Arduino 入門 Lesson 12 【ポテンショメータ編】
「Arduino」を使ったマイコンプログラミングを子供と一緒に学習するブログ。本日はLesson 12 ポテンショメータ編です。ポテンショメータを利用して電圧値を読み取ることでanalogRead関数について理解します。色んな電圧値を測定し…

 

最後に

疑問点、質問などありましたら気軽にコメントください。

この電子部品の解説をしてほしい!などなどなんでもOKです。

リンク切れ、間違いなどあればコメントいただけると助かります。

 

Arduino入門編、番外編、お役立ち情報などなどサイトマップで記事一覧をぜひご確認ください。

 

Arduino入門編で使用しているUNOはAmazonにて購入可能です。

互換品とは言え、Arduinoはオープンソース。

複製して販売するのもライセンス的に問題なし。

 

そのため互換品の品質も悪くなく、それでいて値段は安いです。

正規品本体の値段程度で豊富な部品が多数ついています。

 

学習用、遊び用、お試し用には安価な互換品がおすすめです。

 

 

上記のものでも十分に多数の部品が入っていますが、最初からもっと多数の部品が入っているこちらもお勧めです。

 

Amazonでお得に買う方法

Amazonでお得に購入するなら、Amazonギフト券がおすすめです。

現金でチャージするたびに、チャージ額に応じたポイントが付与されます。

最大2.5%!!!(Amazonプライム会員ならさらにお得)

チャージ額(一回分)一般プライム会員
5,000円~19,999円0.5%1.0%
2,0000円~39,999円1.0%1.5%
40,000円~89,999円1.5%2.0%
90,000円~2.0%2.5%

さらに、初回チャージで1000ポイントもらえるキャンペーンも実施中!

\Amazonギフト券 1000ポイントキャンペーン/
Amazonチャージ 初回購入で1000ポイントキャンペーン

 

補足情報
コンビニ・ATM・ネットバンクが対象
購入は1円単位で可能

コメント

  1. hykw より:

    Arduino の存在を知って、つい最近手に入れた物です。とても有用な記事をありがとうございます。

    基本的な知識がなくて恐縮なのですが https://omoroya.com/wp-content/uploads/2019/01/Arduino-lesson11-04.jpg の図の抵抗とその線はなぜ必要なのでしょうか?(「基板に実装されてるのに」という意味ではなく、根本的に理解できていません)

    DATAはD8に繋がり、5VはVDDに繋がってるというのはわかるのですが、D8とDATAの間に赤線からの繋がる理由も、間に抵抗が必要な理由もわかりません。

    また、このあたりの知識を理解するためのおすすめの本などがあったら教えて頂けるととても助かります。

    • omoroyaomoroya より:

      コメントありがとうございます。
      DATAピンはオープンドレインとなっているためプルアップする必要があります。
      UNOの端子にもプルアップ機能はありますが、プルアップの能力をあげる必要があるため入れてあります。

      オープンドレインとは、
      「信号をLowレベルにすることはできるが、Highレベルにすることができない」
      回路がDATAピンに組み込まれていると思っていただいて差し支えありません。
      そのため、DATAピンをHighレベルにするために抵抗を介して5Vに吊っている状態ということになります。

      補足
      DATAピンがLowレベル以外のの時は、
      Hi-Z状態(HighでもLowでもなくドライブされていない状態)のため抵抗を介して5VにつないでおけばDATAピンは5Vになります。
      ※ただし、Lowレベルにするための能力よりもプルアップ抵抗を小さくしてしまうとLowにできないため、通常プルアップ抵抗は高抵抗となります。

      おすすめの本ですが、初心者向けのの電気回路、電子回路の本が良いと思います。
      ちょっと探してみて良いのがあれば紹介します。

    • hykw より:

      入門記事とかを読んでいてプルアップとかプルダウンの説明はあったのですが、何となく通り過ぎるだけでまったく理解できていませんでした。

      コメントを拝見して、このことかーと、頭の中の知識がカチッと繋がった感じです。ものすごく勉強になりました。ありがとうございます。

    • hykw より:

      持っている本を改めて読み直したり、オープンドレインという単語を元に色々調べて、ようやく腹落ちしました。

      DHT11は負論理というやつなんですね。つまり
      ・フラグが正は 0V で表現
      ・フラグが負の場合はなんか不定な電圧になっているので、プルアップにより吊り上げてやる必要がある
      ・フラグが正の場合は0Vまで落とす必要があるので、プルアップ抵抗があまり小さいと電圧が0まで落とし切れなくて、正にできなくなる

      ということだったんですね。

    • omoroyaomoroya より:

      腹落ちしたようで何よりです。
      本ですが、CQ出版社の
      「オームの法則から! 絵ときの電子回路 超入門(TRSP No.138) (トランジスタ技術SPECIAL)」
      とかが良いかなと思います。
      ただ、回路の知識が中学校の理科レベルで止まっている場合、文系出身の方の場合はこの本のレベルがあっているか?
      というところは悩ましいところです。
      数式とかは無視して絵を見て抽象的に理解するには役に立つかなと思います。

      変な教科書的な本よりもCQ出版社の本は実用的なのでおすすめです。

      教科書的な本は、「で実際どうするの?」というのがわからないことが多い!
      そのため管理人はおすすめではないです。
      理論よりも、作って、遊んで、色々やってみて・・・
      そのあとに、教科書的な本を読んで深く学ぶことをおすすめします。
      まずは色々と遊んでみましょう!

    • hykw より:

      ご紹介ありがとうございます。
      Amazonに在庫があったので、さっそく注文しました!

  2. kagerou より:

    丁寧な記事をありがとうございます。
    この記事とLCDの記事を合わせて測定した温湿度をLCDに表示することができました。
    ありがとうございます。

    データ取得の桁数について質問させてください。
    温湿度の末尾(小数点2位)を消してシリアルに表示するにはどうすればいいのでしょうか?
    データ取得の桁数を変更する方法があればご教示いただけますか?
    よろしくお願いします。

    • omoroyaomoroya より:

      コメントありがとうございます。
      手っ取り早く、変数型をfloat型ではなくint型にしてみたらどうでしょうか。
      お試しください。

  3. 慎太郎 より:

    お願いがありまして、[RC522 RFID Module] を使ったスケッチ、ブレットボード図を作ってくださいまさんか?(できればライブラリなしで)よろしくお願いします。

    • omoroyaomoroya より:

      コメントありがとうございます。
      てもとに、RC522 RFIDがありません。
      入手できたら、検討します。

  4. とし より:

    写真とブレッドボード図の違いが初心者で分りづらかったので、DHT11モジュールの3本端子で左が8、中5V、右GND。

  5. 高橋 より:

    サンプルコードをそのままコピペしてコンパイルしてみたのですが「コンパイルが終了しました。終了ステータス1DHT.h:そのようなファイルまたはディレクトリはありません」とエラーが出てしまいました。DHTのライブラリがないのでしょうか?
    さっぱりわかりません。
    もしお分かりであれば教えていただけないでしょうか?

    • omoroyaomoroya より:

      コメントありがとうございます。
      本Lesson記載のスケッチを利用する場合はライブラリのインストールが必要です。
      「ツール」⇒「ライブラリを管理…」からインストールする。
      下記2つインストール必要です。
      「DHT sensor library」
      「Adafruit Unified Sensor」

  6. t-rex より:

    リンクにあるDHT11モジュールだと正常動作しません。配列が左から+、out、ーになっています。out端子を8番、+端子を5Vにつないでも、正常動作しません。

    • omoroyaomoroya より:

      こんにちは。
      正常動作しないというのは、シリアルモニタに出てくる値がおかしいということですか?
      それとも、まったく動作しないということでしょうか?
      手持ちのDHT11はプルアップ抵抗付きのモジュールタイプですか?

  7. Daifuku より:

    dht11センサの使い方がいまいち理解しきれず、運良くこの素敵なサイトにたどり着きました。
    恥ずかしながらプログラムに不慣れなもので、ソースコードに細かくコメントが付いており理解の助けになりました。
    どうもありがとうございました。

    • omoroyaomoroya より:

      コメントありがとうございます。
      スローペースですが
      これからも、できる限りわかりやすい記事をアップしていきます。

タイトルとURLをコピーしました