Arduino 入門 Lesson 19 【LCDと温湿度センサ編】

Arduino-lesson19-00 Arduino入門編
記事に広告(アフィリエイト広告)が含まれています。
スポンサーリンク
子供と一緒に始める マイコンプログラム
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)で取得した値を液晶に表示させることが目標です。

これで、ちょっとした「温湿度計」の完成です。

Lesson17Lesson18同様に、電池でArduinoの電源を確保すればパソコン不要となります。

そのため、本Lessonも電池を使います。

 

電源の確保方法詳細については番外編で解説しています。

こちらもあわせて確認ください。

 

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

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

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

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

 

スポンサーリンク

はじめに

本Lessonで使用するメインの電子部品は以下となります。

初めての方は、それぞれのLessonにて始める前に内容を確認しておくことをお勧めします。

すでに、実践されたかたは思い出す意味でコード部分に目を通してみてください。

 

Lesson11で使用した温湿度センサ(DHT11)

 

Lesson16で使用した1602 LCD ディスプレイモジュール

 

この2つを組み合わせることで簡単な「温湿度計」を作ります。

 

Lesson 19 目標

液晶ディスプレイと温湿度センサの使い方を思い出しましょう。

また、液晶ディスプレイと温湿度センサを組み合わせることで「温湿度計」を作成します。

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

 

今回、Lesson11Lesson16のコードを組み合わせることで簡易的な「温湿度計」を作成します。

Lesson10Lesson16を学習しておくことでスムーズに取り組むことができます!

 

準備

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

今回はこれまでに使ったことがある電子部品ばかりです。

 

必要なもの

 

Jumper wire、抵抗は今後も頻繁に利用します。

Jumper wireはできれば、「オス-メス オス-オス メス –メス」の3種類を揃えておくことをお勧めします。

短めが使いやすい場合も。

 

抵抗も単品で揃えるよりはセットをおすすめします。

 

抵抗、LEDなどを個別でセット品を購入しても、そんなに使わない!

という方は、「電子工作基本部品セット」が使い勝手が良い。

 

使用部品説明

主要な電子部品である下記3つの部品については各Lessonを参照ください。

本Lessonでも簡単に電源を確保するために、電池スナップDCプラグアダプタを使用します。

電池とArduinoをつなぐためのアダプタです。

 

温湿度センサ(DHT11)仕様

温湿度センサモジュール(DHT11)についてはLesson 11の解説をご覧ください。

 

■表面

Arduino-lesson11-01

 

■裏面

Arduino-lesson11-02

 

1602 LCD モジュール仕様

1602 LCD モジュールについてはLesson 16の解説をご覧ください。

 

■表面

Arduino-lesson16-02

 

■裏面

Arduino-lesson16-03

 

ポテンショメータ仕様

ポテンショメータについてはLesson 12の解説をご覧ください。

Arduino-lesson09-03

 

電池スナップDCプラグアダプタ

本Lessonでも、Arduinoの電源を電池とします。

Lesson17、18同様に、電池スナップDCプラグアダプタを使用してます。

これはArduinoの外形5.5mm、内径2.1mmのDCプラグに接続するためのものです。

Arudino側としては7V~12Vの範囲の電圧入力が必要となります。

電源の取り方としては、手軽な方法です。

 

部品は以下のものとなります。

Arduino-lesson17-01

 

Arduinoの接続箇所は下記となります。

Arduino-lesson17-02

 

安い物から、複数個、ハードケースなどがあります。

好みで選択してください。

 

ハードケースを希望の場合。

 

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

ではさっそく動かしていきましょう。

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

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

最後にコードを書いて、測定した距離をディスプレイに表示しましょう。

 

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

 

回路図

回路図がこちら。

部品は「温湿度センサモジュール」「1602 LCD モジュール」と「ポテンショメータ」です。

電源は「9Vの電池」です。

今回も、Lesson 16同様に4bitモードとして動作させるためDB0~DB3は使用しません。

Arduino-lesson19-01

 

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

 

こちらがブレッドボード図。

Arduino-lesson19-02

 

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

 

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

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

 

接続

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

部品は「温湿度センサモジュール」「1602 LCD モジュール」「ポテンショメータ」です。

電源は9Vの電池をアダプタで接続しています。

「ポテンショメータ」がないかたはVOを直接VDDにつないでいただいてもかまいません。

コントラストの調整ができないだけです。

ただし、明るすぎて見えない場合は数kΩ程度の抵抗をつけて調整してください。

Arduino-lesson19-03

 

使用するポートは、デジタル入力ピンの「2,7,8,9,10,11,12」。

電源ポートは、「5V」と「GND」。

電源の外部入力電源端子です。

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

 

コードの書き込み

接続が終わったら、USBケーブルを使用してUNOにプログラムを書き込んで行きましょう。

 

今回は、Lesson 11Lesson 16で作成したコードを組み合わせることで作成します。

 

標準ライブラリ設定

温湿度センサ、LCDのコードはLesson 11Lesson 16にてライブラリを使いましたので以下の設定をお願いします。

すでに、Lesson 11Lesson 16を学習したかたは飛ばしてください。

 

DHT.h」、「LiquidCrystal.h」の2つを下記のいずれかで使えるようにしてください。

 

DHT.h」を使えるようにする方法

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

 

LiquidCrystal.h」を使えるようにする方法

このライブラリを使うことで、HD44780とその互換チップセットを搭載したLCDを制御できるようになります。

4bit、8bit両方のモードをサポートしているライブラリです。

 

標準ライブラリのため、基本は初めから実装されているはずです。

ない場合は、下記を実施ください。

IDEの統合環境から
1.Zip形式のライブラリをインクルード
2.ライブラリの管理
どちらでも可能です。

 

1.Zip形式のライブラリをインクルードする場合
以下から「LiquidCrystal.zip」をダウンロード。
ダウンロードサイト
2.ライブラリの管理からインストールする場合。
タイプArduinoを選択して「LiquidCrystal」で検索。
LiquidCrystalをインストール

 

ライブラリの追加方法の詳細に関しては以下を参照ください。

 

コマンド説明

復習を兼ねて、Lesson 11Lesson 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 11Lesson 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 %」← 湿度

と表示されました。

Arduino-lesson19-04

 

2.5秒後の表示がこちら

Temp.     26.90 C」←温度

Discom.   75.22」←不快指数

と表示されました。

2.5秒おきに湿度と不快指数は交互に表示されます。

Arduino-lesson19-05

 

デジタル入力の2番ピンをわざとはずした場合の表示がこちら。

Read failure!

と表示されます。

読み取れなかった場合のコードもしっかりと動いているのがわかります。

Arduino-lesson19-06

 

温度と湿度であれば、市販品の温湿度計を買ってきた方が手っ取り早いって話ですが・・・。

計測データを無線通信などで取り込むようにできれば、温度、湿度を管理して何かをさせるということができます。

本来は、そういう使い方をしたいところです。

応用編で挑戦してみたいことの1つです。

 

本LessonはLCDディスプレイ入門のための学習と考えてください・・・。

 

まとめ

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

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

1.液晶ディスプレイと温湿度センサの使い方を思い出す。
2.液晶ディスプレイと温湿度センサを組み合わせることで「簡易温湿度計」を作る。
3.楽しんで遊ぶ。

 

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

 

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

Lesson 19 簡易温湿度計編はここまで。

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

 

ちなみに子供の反応はというと・・・

サーミスタとおなじで・・・。

「つまらないーーーー!」

の一言です。

ただの温湿度計ですからね・・・。

液晶表示のLessonも続いていますし・・・。

 

LCD+電子部品のLessonの中では

超音波センサで色んな所を計測するのが一番おもしろかったようです。

 

次回Lesson 20はICを使うことによって、1つのデジタル出力ピンでLEDを複数個制御することを学習します。

Arduino 入門 Lesson 20 【8bitシフトレジスタによる複数LED制御編】
本日は「Lesson 20 シフトレジスタによる複数LED制御編」です。複数のLEDを直接Arduinoに抵抗と合わせて接続して制御するということではありません。これをしてしまうと、Arduino UNOのピンが足りなくなり、センサーやボタ…

 

Arudinoのデジタルピンを節約できるってことですね。

直接、全てのLEDをArudinoのデジタルピンに接続することでも可能です。

しかし、スイッチを設けたり他の部品を付けたりするとピン不足になってしまいます。

ピン不足の解消にも役立つというわけです。

 

最後に

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

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

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

 

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

 

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

Arduino入門編では互換品を使用。

Arduinoはオープンソース。

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

 

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

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

 

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

 

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

 

Arduino入門編2では「Arduino UNO R4 Minima」「Arduino UNO R4 WIFI」にて遊ぶため今のところは正規品を使用。(まだ互換品が・・・ほぼない)

 

Amazonでお得に買う方法

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

時期により異なりますが、様々なキャンペーンを実施しています。

\Amazonギフト券/
Amazonギフトカード キャンペーン

Amazon Mastercard お申込み
Amazon Mastercard 申し込み 

 

いずれの場合もプライム会員である方がお得!!

\Amazon Prime 30日間の無料会員を試す/
無料会員登録 

 

 

コメント

  1. ショウゴン より:

    終始
    Read failure!
    と表示される場足はどのような原因が考えられるでしょうか。
    この記事を参考に全く同じ回路を組んだつもりなのですが、、、
    ご返答お待ちしております。

    • omoroya omoroya より:

      コメントありがとうございます。
      Read failure!と表示されるということは
      LCDの接続はただしく、スケッチも動作しているものと思われます。
      温度センサは基板に実装された抵抗付きのDHT11でしょうか?
      温湿度センサのデータが読み取れない状態ですので
      温湿度センサの接続がおかしい、もしくは温湿度センサが壊れているなどが考えられます。
      まずは、Lesson11の温湿度センサ(DHT11)単体で動くかどうか試してみてください。

  2. ナッシー より:

    定年してそろそろ古希ですが、鉄道模型に組み込みたいと思って始めました。全くの初心者ですが、貴サイトは本当に参考になります。高齢者=子供なので本当に助かります。Bluetoothで四苦八苦しています。

    • omoroya omoroya より:

      コメントありがとうございます。
      手元に、ESP-32等々あるのでいずれは、アップする予定です。
      気長にお待ちください・・・。

  3. まっったけ より:

    アルディーノのスターターキットのPDFだとイマイチ日本語がわかりにくいので、いつもこちらの記事を参照しながらアルディーノを楽しませてもらってます!

    非常にわかりやすくて助かってます!

    今後、応用編にて無線(Wi-Fi・Bluetoothモジュール)等の記事上がることを楽しみにしています!

    • omoroya omoroya より:

      コメントありがとうございます。
      はい、応用編にて無線の記事をアップしたいと思っています。
      なかなか、更新がはかどらない今日この頃です・・・。

  4. diyut より:

    ソースを入力して検証すると
    exit status 1
    というエラーが出てしまいました。
    悲しいかな、自分の注意力ではどこにエラーが存在しているか見つかりませんでした。
    宜しくお願い致します。

    • diyut より:

      申し訳ありません…
      別環境でコンパイルしたらエラーは出ませんでした。
      ネット環境が特殊なのでライブラリインストールで問題が出たかもしれません。
      こちらで検討します。

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