気圧センサー[BMP180]を使う~②LCDに表示~
気温・気圧・標高の三種の値をLCDに表示させるように変えてみました、これにより測定値を観察するためのPCが不要になり電池駆動による屋外使用も可能になります。
使用するLCDは当ブログの記事「LCDディスプレーを使う」で使用したI2CタイプのLCDです。
LCDの仕様:
- ドットマトリクスサイズ:5x8ドット(文字は5×7ドット表示)
- 表示文字数:2行x16文字
- 表示可能文字:半角英数字・半角記号
- バックライト:白色(オンオフ可能)
- インタフェース:I2C
表示させる内容は「気温」、「気圧」、「標高」です。
摂氏記号の”℃”を表示させるために外字登録も使用しています。同じく当ブログ記事「LCDディスプレーを使う「外字登録」」を参照してください。
目 次
LCDモジュールの接続
LCDモジュールの接続端子
使用するLCDモジュールのインタフェースはI2CのためArduinoとの接続信号は電源を含めて
- SDA
- SCL
- +5V
- GND
の4本で、これらをArduinoと接続します。
<LCDモジュール接続端子>
LCDモジュールとブレッドボードとの接続
前回の記事「気圧センサー[BMP180]を使う~①シリアルモニタ表示~」の配線に追加する形でLCDモジュール配線をしていきます。
回路図作成中
何度も書いているようにこのLCDモジュールはI2C接続なので他のI2Cデバイスの信号とは並列接続になります。
具体的には下の画像を参考にしてください。
スケッチの作成
ライブラリ
以下の2つのライブラリを使います。
- Adafruit_BMP085 ⇒ BMP180用のライブラリ
- LiquidCrystal_I2C ⇒ I2C LCDモジュール用のライブラリ
ライブラリーのインストール方法
ライブラリの入手経路は①ZIPファイルをインタネット経由でダウンロードする方法、②ライブラリマネージャー経由で直接入手&インストールする方法がありますが今回は後者の方法を簡単に節女します。
①ライブラリーマネージャーを起動する
ArduinoIDEのスケッチメニュー経由でライブラリマネージャーを起動します。(下図の①⇒②⇒③の順番)
②Adafruit_BMP085ライブラリのインストール
③”LiquidCrystal_I2Cライブラリのインストール
スケッチ
以下に今回作成したスケッチの全コードを以下に示す
ArduinoSketch[BMP180_disp_LCD]
#include <Wire.h> #include <Adafruit_BMP085.h> #include <LiquidCrystal_I2C.h> Adafruit_BMP085 bmp180; //オブジェクト変数bmp180の宣言 LiquidCrystal_I2C lcd(0x3f, 16, 2); //オブジェクト変数lcdの宣言、I2Cアドレス=0x3Fで定義。(注、このアドレスは個々のモジュールで異なるので要注意) void setup() { if (!bmp180.begin()) { //bmp180初期化結果をチェック lcd.home(); lcd.print("BMP180 not found"); //初期化失敗時に表示 while (1) {} } lcd.init(); lcd.backlight(); byte charData_1[8] = { //摂氏「℃」外字登録データ(5x7ビットマップ) B11000, B11000, B00111, B01000, B01000, B01000, B00111, }; lcd.createChar(1, charData_1); //0x01キャラクタコードに摂氏記号をアサイン } void loop() { const float sealevelPressure = 102750; //観測地点の海面気圧(単位Pa)、気象庁アメダス情報サイトより入手 const int digits = 1;//数値をLCD表示する時の小数点以下桁数を設定 float tempReadout = bmp180.readTemperature(); //温度データを読み出して温度データ変数[tempReadout]に代入、型は単精度浮動小数点宣言 uint32_t pressureReadout = bmp180.readPressure(); //気圧データを読み出して気圧データ変数[pressureReadout]に代入、型は整数宣言 float altitudeReadout = bmp180.readAltitude(sealevelPressure); //標高データを読み出して標高データ変数[altitudeReadout]に代入、型は単精度浮動小数点宣言 lcd.setCursor(0, 0); lcd.print("T="); lcd.print(tempReadout, digits); //気温データをLCDに表示、小数点以下1桁 lcd.write(1); lcd.print("/"); lcd.print("P="); lcd.print(pressureReadout); //気圧データをLCDに表示、整数表示 lcd.setCursor(0, 1); lcd.print("Alt="); lcd.print(altitudeReadout, digits); //標高データをLCDに表示、小数点以下1桁 lcd.print("m"); delay(500); }
表示例
BMP85ライブラリ補足説明
BMP180からのデータ読み出しにはAdafruits社リリースのBMP180/85共通ライブラリを使用してます、注意点も含めて補足説明を書きます。
①readTemperature()関数
オブジェクト変数と組み合わせて使用しているので上記ソースコード中では”bmp180.readTeperature()”と記述されてますがセンサーから読みだした生温度データに対し補正係数で補正した値になって読みだしてます。
②readPressure()関数
同様にソースコード中では”bmp180.readPressure()”と記述、こちらもセンサー読み出しの圧力データに対し補正(温度補正含む)を掛けた値になってます。
③readAltitude()関数
同様にソースコード中では”bmp180.readAltitude(sealevelPressure)”と記述、引数のsealevelPressureは観測地点の平均海面気圧を指定します。引数省略時は標準海面気圧の101325Paが使用されます。(単位はPa(パスカル)
平均海面気圧は気象庁のアメダスサイトから入手可能です。観測地点から最も近い地点データを使用すると良いと思われます。
この海面気圧は気象条件で時事刻々と変化するためプログラム上は定数扱いでなく変数扱いにして外部入力(シリアルモニタ、キーボード等)可能とするのが操作性が良いのですが今回は取り急ぎ定数扱いでプログラミングしてあります。
LCDライブラリ補足説明
I2Cアドレスに関して注意が必要です、ネットの情報では個々のモジュールでI2Cアドレスが異なるケースがあるようです。今回は0x3fを使用しましたが中には0x27というのもあるようです、しかも同一メーカー内でも製造ロットで異なるという事例もあるようです。
もし、LCD表示に失敗するようでしたらi2Cアドレスのチェックをするスケッチがあるのでそれで確認することをお勧めします。→ここです
次回の予定は・・・・
今回はここで終了です、次回以降で現在地の既知の標高値を入力して標高較正する機能の追加、それと海面気圧入力機能の追加も考えたいと思います。
こんにちは
私もこのスケッチを使わせて頂いてます。
一つお尋ねします。
スケッチの頭で
#include とされています。
このスケッチでは、気圧センサーとLcdで2つのスレーブを使っていますが
setup()、loop() 内に Wire.begin ()の記述が有りません。
私の所でも、Wire.begin()の記述が無くとも問題は生じていません。
Wire.begin()の記述は、必要ないのですか?
「問題が生じていない」って事は、不要ってことでしょうか。
I2Cを使うなら、必ず、記述するもの と 思ってました(根拠ないですが)。
こんにちは、確かにI2Cを使う時はWireライブラリを使いますがブログ記事内のSketch内でincludeしている2つのライブラリー”Adafruit_BMP85.h”と”LiquidCrystal_I2C.h”の中でwireライブラリーをincludeしているのでスケッチ本体にはwireは不要になります。