子供と一緒に始める マイコンプログラム Arduino 入門 温湿度センサ編 Lesson 11

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

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

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

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

 

本Lesson解説で使用しているのはArduino互換品です。

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

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

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

 

スポンサーリンク

はじめに

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 

Lesson 11目標

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

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

できれば、液晶ディスプレイ(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秒以上の間隔を開ける必要があります。

//温湿度センサモジュールを使って温度、湿度を測定するスケッチ
#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関数について理解します。色んな電圧値を測定して、さっそく遊んでみましょう!

 

本Lessonで使用しているUNOはAmazonにて購入可能です。

Amazon ベストセラーNo.1
ELEGOO UNO キット レベルアップ  チュートリアル付 uno mega2560 r3 nanoと互換 Arduino用

 

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

ELEGOO Arduino用UNO R3 最終版スタータキット UNOチュートリアル付 (63 Items)

コメント

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