Arduino 入門
Lesson 19
【LCDと温湿度センサ編】
「Arduino」を使ったマイコンプログラミングを子供と一緒に学習するブログ。
少しずつ、子供と一緒に楽しみながら気長にアップしてく予定です。
本日は「Lesson 19 LCDと温湿度センサ編」です。
Lesson16にて液晶ディスプレイの使い方を学習しました。
Lesson17にて液晶ディスプレイ+超音波センサの使い方を学習しました。
Lesson18にて液晶ディスプレイ+サーミスタの使い方を学習しました。
今回は、液晶ディスプレイに慣れるための最後のLessonです。
Lesson19は、液晶ディスプレイ+温湿度センサ(DHT11)です。
前回は、手元にサーミスタがあったため、あえてサーミスタで「簡易温度計」を作りました。
本来は、簡単に温度や湿度を測定できる電子部品を使った方がArduinoの負荷は軽くて済みます。
そのため、今回は温湿度センサ(DHT11)を使って「温湿度計」を作ります。
本Lessonも、液晶ディスプレイ+電子部品ということになります。
電子部品から得た情報を液晶ディスプレイに表示する。
ディスプレイLesson入門編の最後、LCDモジュール編3となります。
LCDを使いこなすことができれば、色んな測定結果をPCなしで確認ができます。
PCを使わずに、Arduinoと電子部品だけで何かをするための第一歩の練習です。
ちょっとした、測定などの表示には便利だと考えます。
最終的には、スマホなどにデータを送信して表示させたいと考えています。
入門編の解説が終わったら、応用編を作りたいと考えています。
応用編では、無線に挑戦したいと考えています。
今回は温湿度センサ(DHT11)で取得した値を液晶に表示させることが目標です。
これで、ちょっとした「温湿度計」の完成です。
Lesson17、Lesson18同様に、電池でArduinoの電源を確保すればパソコン不要となります。
そのため、本Lessonも電池を使います。
電源の確保方法詳細については番外編で解説しています。
こちらもあわせて確認ください。
本Lesson解説で使用しているのはArduino互換品です。
互換品とは言え、Arduinoはオープンソースであり複製して販売するのもライセンス的に問題なし。
そのため互換品の品質も悪くなく、それでいて値段は安いです。
正規品本体の値段程度で豊富な部品が多数ついています。
はじめに
本Lessonで使用するメインの電子部品は以下となります。
初めての方は、それぞれのLessonにて始める前に内容を確認しておくことをお勧めします。
すでに、実践されたかたは思い出す意味でコード部分に目を通してみてください。
Lesson11で使用した温湿度センサ(DHT11)
Lesson16で使用した1602 LCD ディスプレイモジュール
この2つを組み合わせることで簡単な「温湿度計」を作ります。
Lesson 19 目標
液晶ディスプレイと温湿度センサの使い方を思い出しましょう。
また、液晶ディスプレイと温湿度センサを組み合わせることで「温湿度計」を作成します。
最後に、本Lessonも、「遊ぶというところが一番大事」なところです。
今回、Lesson11とLesson16のコードを組み合わせることで簡易的な「温湿度計」を作成します。
Lesson10とLesson16を学習しておくことでスムーズに取り組むことができます!
準備
ではLessonの準備に取り掛かりましょう。
今回はこれまでに使ったことがある電子部品ばかりです。
必要なもの
- USB接続用のPC(IDE統合環境がインストールされたPC)
→管理人が勝手に比較したBTOメーカーを紹介しています。 - UNO R3(以下UNO)、おすすめUNO互換品(ELEGOO)
- PCとUNOを接続するUSBケーブル
- ブレッドボード安価(大)、ブレッドボード安価(中)
※おすすめブレッドボード(大)、おすすめブレッドボード(中) - 1602 LCD ディスプレイモジュール → Lesson 16で解説しています。
- ポテンショメータ(可変抵抗器) → Lesson 12で解説しています。
- 温湿度センサ(DHT11) → Lesson 11で解説しています。
- 電池スナップDCプラグアダプタ(電池接続のためのアダプタ)
※ハードケース版 - 乾電池9V(電源用)、おすすめは充電式
- M-M Jumper wire(UNOと部品をつなぐための配線)
Jumper wire、抵抗は今後も頻繁に利用します。
Jumper wireはできれば、「オス-メス オス-オス メス –メス」の3種類を揃えておくことをお勧めします。
短めが使いやすい場合も。
抵抗も単品で揃えるよりはセットをおすすめします。
抵抗、LEDなどを個別でセット品を購入しても、そんなに使わない!
という方は、「電子工作基本部品セット」が使い勝手が良い。
使用部品説明
主要な電子部品である下記3つの部品については各Lessonを参照ください。
本Lessonでも簡単に電源を確保するために、「電池スナップDCプラグアダプタ」を使用します。
電池とArduinoをつなぐためのアダプタです。
温湿度センサ(DHT11)仕様
温湿度センサモジュール(DHT11)についてはLesson 11の解説をご覧ください。
■表面
■裏面
1602 LCD モジュール仕様
1602 LCD モジュールについてはLesson 16の解説をご覧ください。
■表面
■裏面
ポテンショメータ仕様
ポテンショメータについてはLesson 12の解説をご覧ください。
電池スナップDCプラグアダプタ
本Lessonでも、Arduinoの電源を電池とします。
Lesson17、18同様に、「電池スナップDCプラグアダプタ」を使用してます。
これはArduinoの外形5.5mm、内径2.1mmのDCプラグに接続するためのものです。
Arudino側としては7V~12Vの範囲の電圧入力が必要となります。
電源の取り方としては、手軽な方法です。
部品は以下のものとなります。
Arduinoの接続箇所は下記となります。
安い物から、複数個、ハードケースなどがあります。
好みで選択してください。
ハードケースを希望の場合。
実践 回路作成とコード作成
ではさっそく動かしていきましょう。
最初に回路図を確認してください。
次に、回路図に合わせて部品を接続します。
最後にコードを書いて、測定した距離をディスプレイに表示しましょう。
Arduinoのピン配置を確認したい方は番外編02を参照してください。
回路図
回路図がこちら。
部品は「温湿度センサモジュール」「1602 LCD モジュール」と「ポテンショメータ」です。
電源は「9Vの電池」です。
今回も、Lesson 16同様に4bitモードとして動作させるためDB0~DB3は使用しません。
こちらがブレッドボード図。
回路図は「fritzing」を利用しています。
「fritzing」の使い方は下記を参照してください。
接続
下図に示すように、用意した部品を使用して接続しましょう。
部品は「温湿度センサモジュール」「1602 LCD モジュール」と「ポテンショメータ」です。
電源は9Vの電池をアダプタで接続しています。
「ポテンショメータ」がないかたはVOを直接VDDにつないでいただいてもかまいません。
コントラストの調整ができないだけです。
ただし、明るすぎて見えない場合は数kΩ程度の抵抗をつけて調整してください。
使用するポートは、デジタル入力ピンの「2,7,8,9,10,11,12」。
電源ポートは、「5V」と「GND」。
電源の外部入力電源端子です。
穴に挿入しづらいときは、ラジオペンチなどを使用してください。
コードの書き込み
接続が終わったら、USBケーブルを使用してUNOにプログラムを書き込んで行きましょう。
今回は、Lesson 11、Lesson 16で作成したコードを組み合わせることで作成します。
標準ライブラリ設定
温湿度センサ、LCDのコードはLesson 11、Lesson 16にてライブラリを使いましたので以下の設定をお願いします。
すでに、Lesson 11、Lesson 16を学習したかたは飛ばしてください。
「DHT.h」、「LiquidCrystal.h」の2つを下記のいずれかで使えるようにしてください。
「DHT.h」を使えるようにする方法
「LiquidCrystal.h」を使えるようにする方法
このライブラリを使うことで、HD44780とその互換チップセットを搭載したLCDを制御できるようになります。
4bit、8bit両方のモードをサポートしているライブラリです。
標準ライブラリのため、基本は初めから実装されているはずです。
ない場合は、下記を実施ください。
タイプArduinoを選択して「LiquidCrystal」で検索。
LiquidCrystalをインストール
ライブラリの追加方法の詳細に関しては以下を参照ください。
コマンド説明
復習を兼ねて、Lesson 11、Lesson 16で使用したコマンドを記載します。
下記はLesson 11で学習したコマンドです、もう一度意味を確認しましょう。
コマンド | 説明 |
---|---|
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文内の構文を実行するということです。 |
しつこいですが、標準ライブラリである「LiquidCrystal.h」のコマンドも再度記載しておきます。
コマンド | 説明 |
---|---|
LiquidCrystal(引数) 引数 rs,rw,enable, d0,d1,d2,d3,d4,d5,d6,d7 |
LiquidCrystal型の変数を生成。 rs:LCDのRSピンに接続するArduino側のピン番号 rw:LCDのRWピンに接続するArduino側のピン番号 enable:LCDのenableピンに接続するArduino側のピン番号 d0~d7:LCDのdataピンに接続するArduino側のピン番号 RWピンをGNDに接続すれば引数を省略できます。 |
begin(cols, rows) | LCDの初期化。 ディスプレイの桁数と行数の指定。 cols:桁数(横方向の字数) rows:行数 |
clear() | LCDの表示を消し、カーソルを左上隅に配置。 |
home() | LCDの左上隅にカーソルを配置。 |
setCursor(col, row) | LCDのカーソルの位置を指定。 |
write(data) | 文字をLCDに表示。 |
print(data) | テキストをLCDに表示。 |
cursor() | LCDのカーソルを表示する。 カーソルはアンダーラインで、その位置に次の文字が表示される。 |
noCursor() | LCDのカーソルを表示しない。 |
blink() | LCDのカーソルを点滅させる。 |
noBlink() | LCDのカーソルを点滅を停止。 |
display() | noDisplay()で消したディスプレイを元に戻す。 表示されていた文字やカーソルもリストアされる。 |
noDisplay() | ディスプレイを消す。 表示中の文字は保持される。 |
scrollDisplayLeft() | LCDに表示中の文字とカーソルを1文字分左へずらします。 |
scrollDisplayRight() | LCDに表示中の文字とカーソルを1文字分右へずらします。 |
autoscroll() | LCDの自動スクロールを開始。 |
noAutoscroll() | LCDの自動スクロールを停止。 |
leftToRight() | LCDの文字列の表示方向をデフォルトの「左から右」に設定。 |
rightToLeft() | LCDの文字列の表示方向を「右から左」に設定。 |
createChar(num, data) | ユーザ定義の文字を作成。 最大8文字まで登録可能。 |
いまいち、「使い方がわからない」というかたはLesson 11、Lesson 16を見直してみてください。
サンプルコード
サンプルコードを下記に示します。
「Lesson 11」と「Lesson 16」を組み合わせたコードです。
本Lessonもこれまで学習したことの組み合わせです。
入門編で学習したことを組み合わせることで色んなことができます。
他にもいろんなことができます。
まずは、色んな電子部品で遊んでみることが大切かなと考えます。
サンプルコード
下記が「Lesson 11」と「Lesson 16」を組み合わせたコードです。
温度、湿度、不快指数を表示できるようにしてみました。
湿度と不快指数は2.5秒おきに交互に表示されるしくみです。
読み取れなかった場合の表示もプログラムしています。
わざと、デジタル入力ピンの2番ピンをはずすと、「Read failure!」と表示されるのを確認できます。
参考までに、不快指数の体感としての状態は下記となっているようです。
不快指数 | 体感 |
---|---|
〜55 | 寒い |
55〜60 | 肌寒い |
60〜65 | 何も感じない |
65〜70 | 快い |
70〜75 | 暑くない |
75〜80 | やや暑い |
80〜85 | 暑くて汗が出る |
85〜 | 暑くてたまらない |
//https://omoroya.com/ //Lesson19 LCDと温湿度センサで簡易温湿度計 #include <LiquidCrystal.h>//ライブラリインクルード #include <DHT.h> //ライブラリインクルード #define DHT_Pin 2 //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を設定 // 液晶のPIN割り当て // rs:7 en:8 d4:9 d5:10 d6:11 d7:12 に対応 LiquidCrystal lcd(7, 8, 9, 10, 11, 12); void setup() { lcd.begin(16, 2); // LCDの行と列を設定 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)) { lcd.clear(); //LCDの表示を消し、カーソルを左上隅に配置。 lcd.setCursor(0, 0); //1列目1行目に表示 lcd.print("Read failure!"); //ディスプレイ表示 return; } /* 不快指数計算 */ discomfortIndex = 0.81f * tempC + 0.01f * humidity * (0.99f * tempC - 14.3f) + 46.3f; /* Display 表示 */ lcd.setCursor(0, 0); //1列目1行目に表示 lcd.print("Temp. C "); //ディスプレイ表示 lcd.setCursor(8, 0); //8列目1行目に表示 lcd.print(tempC); //測定した摂氏温度をディスプレイに表示 lcd.setCursor(0, 1); //1列目2行目に表 lcd.print("Humid. % "); //ディスプレイ表示 lcd.setCursor(8, 2); //8列目2行目に表示 lcd.print(humidity); //測定した湿度をディスプレイに表示 delay(2500); //湿度と不快指数を2.5秒おきに表示するための遅延 lcd.setCursor(0, 1); //1列目2行目に表 lcd.print("Discom. "); //ディスプレイ表示 lcd.setCursor(8, 2); //8列目2行目に表示 lcd.print(discomfortIndex); //計算した不快指数をディスプレイに表示 delay(500); //500ms遅延 }
動作確認
では、さっそく動作を確認していきます。
ディスプレイのコントラストはポテンショメータを動かし調整してください。
まずは、部屋の温度、湿度、不快指数を計測してみました。
最初に
「Temp. 26.80 C」← 温度
「Humid. 59.00 %」← 湿度
と表示されました。
2.5秒後の表示がこちら
「Temp. 26.90 C」←温度
「Discom. 75.22」←不快指数
と表示されました。
2.5秒おきに湿度と不快指数は交互に表示されます。
デジタル入力の2番ピンをわざとはずした場合の表示がこちら。
「Read failure!」
と表示されます。
読み取れなかった場合のコードもしっかりと動いているのがわかります。
温度と湿度であれば、市販品の温湿度計を買ってきた方が手っ取り早いって話ですが・・・。
計測データを無線通信などで取り込むようにできれば、温度、湿度を管理して何かをさせるということができます。
本来は、そういう使い方をしたいところです。
応用編で挑戦してみたいことの1つです。
本LessonはLCDディスプレイ入門のための学習と考えてください・・・。
まとめ
今回は以下の内容について理解してもらいました。
今回も項目3の遊ぶことが一番の目標でした。
2.液晶ディスプレイと温湿度センサを組み合わせることで「簡易温湿度計」を作る。
3.楽しんで遊ぶ。
最後に、本Lessonも、「遊ぶというところが一番大事」なところです。
いかがだったでしょうか。
Lesson 19 簡易温湿度計編はここまで。
ぜひ、みなさんも子供と一緒にやられてみることをお勧めします。
ちなみに子供の反応はというと・・・
サーミスタとおなじで・・・。
「つまらないーーーー!」
の一言です。
ただの温湿度計ですからね・・・。
液晶表示のLessonも続いていますし・・・。
LCD+電子部品のLessonの中では
超音波センサで色んな所を計測するのが一番おもしろかったようです。
次回Lesson 20はICを使うことによって、1つのデジタル出力ピンでLEDを複数個制御することを学習します。
Arudinoのデジタルピンを節約できるってことですね。
直接、全てのLEDをArudinoのデジタルピンに接続することでも可能です。
しかし、スイッチを設けたり他の部品を付けたりするとピン不足になってしまいます。
ピン不足の解消にも役立つというわけです。
最後に
疑問点、質問などありましたら気軽にコメントください。
この電子部品の解説をしてほしい!などなどなんでも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日間の無料会員を試す/
無料会員登録
コメント
終始
Read failure!
と表示される場足はどのような原因が考えられるでしょうか。
この記事を参考に全く同じ回路を組んだつもりなのですが、、、
ご返答お待ちしております。
コメントありがとうございます。
Read failure!と表示されるということは
LCDの接続はただしく、スケッチも動作しているものと思われます。
温度センサは基板に実装された抵抗付きのDHT11でしょうか?
温湿度センサのデータが読み取れない状態ですので
温湿度センサの接続がおかしい、もしくは温湿度センサが壊れているなどが考えられます。
まずは、Lesson11の温湿度センサ(DHT11)単体で動くかどうか試してみてください。
定年してそろそろ古希ですが、鉄道模型に組み込みたいと思って始めました。全くの初心者ですが、貴サイトは本当に参考になります。高齢者=子供なので本当に助かります。Bluetoothで四苦八苦しています。
コメントありがとうございます。
手元に、ESP-32等々あるのでいずれは、アップする予定です。
気長にお待ちください・・・。
アルディーノのスターターキットのPDFだとイマイチ日本語がわかりにくいので、いつもこちらの記事を参照しながらアルディーノを楽しませてもらってます!
非常にわかりやすくて助かってます!
今後、応用編にて無線(Wi-Fi・Bluetoothモジュール)等の記事上がることを楽しみにしています!
コメントありがとうございます。
はい、応用編にて無線の記事をアップしたいと思っています。
なかなか、更新がはかどらない今日この頃です・・・。
ソースを入力して検証すると
exit status 1
というエラーが出てしまいました。
悲しいかな、自分の注意力ではどこにエラーが存在しているか見つかりませんでした。
宜しくお願い致します。
申し訳ありません…
別環境でコンパイルしたらエラーは出ませんでした。
ネット環境が特殊なのでライブラリインストールで問題が出たかもしれません。
こちらで検討します。