LCDにBMP180温度を棒グラフとして表示
LCDスクリーンに温度を棒グラフとして表示することは、特に距離がある場合でもデータを一目で読み取る実用的な方法です。数値を細めて見る代わりに、棒グラフは定義された最大値に対する現在の温度の即座の視覚的表現を提供します。このプロジェクトは、BMP180気圧および温度センサーと16x2 I2C LCDを組み合わせて、明確で比例した温度表示を作成します。温度が上昇すると棒グラフが満たされ、読み取り値が設定した最大値を超えると、表示が「Max」に切り替わり、オーバーフローを防ぎます。

このセットアップは、正確な数値よりも迅速な視覚的フィードバックが重要なさまざまなアプリケーションに最適です。
- 自宅やオフィスのための視覚的室温計を作る。
- 爬虫類の囲いや植物のテラリウム用の温度モニターを作成する。
- 3DプリンターやCNC機械の制御基板の温度を表示しています。
- 一目で温度を読み取れるシンプルな気象ステーションを作る。
- カスタムPCビルドやオーディオアンプに視覚的温度計を追加する。
このガイドでは、センサーとディスプレイの配線、提供されたコードの構成、および自分のプロジェクトに合わせてカスタマイズする方法について説明します。このチュートリアルは、BMP180センサーとI2C LCDモジュールの基本に精通していることを前提としており、これらをバーチャグラフライブラリと組み合わせることに焦点を当てています。
必要なハードウェア
- Arduino Uno(または類似のボード)
- BMP180気圧/温度センサー
- I2Cモジュール付き16x2 LCD
- ジャンパー線
- ブレッドボード(オプション)
配線ガイド
このプロジェクトは、LCDとBMP180センサーの両方にI2Cプロトコルを使用しており、配線が大幅に簡素化されています。両方のデバイスは、同じ二つのデータラインと電源レールに接続されます。配線は簡単で、下の色分けされた接続はビデオのデモに一致しています。
まず、LCDモジュールを接続します。LCDのI2Cバックパックには、4つのピンがあります:VCC、GND、SDA、SCL。
- LCD VCC(白色のワイヤー)をArduinoに5V
- LCD GNDArduinoへGND
- LCD SDA(灰色のワイヤー)をArduinoにA4(SDAピン)
- LCD SCL(ピンクのワイヤー)をArduinoに接続A5(SCLピン)
次に、BMP180センサーを接続します。このセンサーはVINピンで5Vを耐えられないため、3.3Vレールから電源を供給する必要があることに注意してください。
- BMP180 VINArduinoへの(灰色のワイヤー)3.3V(警告:5Vに接続しないでください。センサーが損傷します!)
- BMP180 GND(紫色のワイヤー)をArduinoにGND
- BMP180 SDA(緑のワイヤー)をArduinoに接続A4(SDAピン)
- BMP180 SCL(青いワイヤー)をArduinoにA5(SCLピン)
両方のデバイスが同じI2Cバスに接続されているため、それらのSDAおよびSCLピンを同じArduinoピン(それぞれA4およびA5)に接続できます。

コードの説明
コードは簡単に設定できるように設計されています。主要な設定はすべてスケッチの上部にあり、コアロジックに深入りすることなく動作を調整できます。変更できる主なパラメータは以下の通りです:
#define UNIT 'C' // unit type C for Celsius F for Fahrenheit
#define maxTemperature 40 // is the value in Celsius or Fahrenheit set in line aboveこれらの2つの線は、表示の単位とスケールを制御します。UNIT定数は大文字を受け入れます。'C'摂氏または大文字'F'対する華氏。 ThemaxTemperature値はバーグラフの上限を定義します。たとえば、これを設定した場合、50単位が摂氏であれば、25°Cは半分だけ満たされたバーとして表示され、50°Cは完全に満たされたバーとして表示されます。この値を超えると、ディスプレイにはグラフの代わりに「Max」と表示されます。(動画の05:49にて)
LiquidCrystal_I2C lcd(0x3f,lcdNumCols,lcdLine); //0x3f is address for I2Cこの行はLCDを初期化します。0x3fこれは特定のLCDモジュールのI2Cアドレスです。このアドレスはメーカーによって異なる場合があります。あなたのアドレスを見つけるには、I2Cスキャナースケッチを実行できます。これはLCDライブラリに含まれていることが多く、オンラインでも入手可能です。スキャナーをアップロードし、シリアルモニターを開くと、接続されているI2Cデバイスのアドレスが報告されます。(動画の07:13で)
LcdBarGraphRobojax robojax(&lcd, 16, 0, 0); // -- creating 16 character long bargraph starting at char 0 of line 0 (see video)この行はバーグラフ自体を設定します。最初のパラメータ(&lcd) はあなたのLCDオブジェクトへの参照を渡します。2番目のパラメータ (16) は、棒グラフの長さを文字数で示しています。第三および第四のパラメータ (0, 0) 開始位置を定義する: 最初0は列(文字位置)であり、二番目の0行です。グラフを2行目に配置するには、最後の値を変更する必要があります。1. (動画の09:24で)
カスタム関数もあります。getTemp()コード内。この関数はBMP180センサーとの通信を処理します。温度を読み取り、設定している場合は華氏に変換します。UNITへ'F'、そして値を返します。センサーが通信に失敗した場合、関数は返します。999エラーコードとして、メインループがチェックしてLCDに「エラー」メッセージを表示します。(ビデオの15:31にて)
ライブプロジェクトデモンストレーション
ビデオでは、ヒートガンを使用してプロジェクトがデモされています。ヒートガンがBMP180センサーに当てられると、LCDの温度表示が上昇します。温度が上がるにつれて、バーグラフが視覚的に比例して満たされていきます。温度が定義された最大値(デモでは50°C)を超えると、バーグラフは消え、表示には「Max」と実際の温度表示が表示されます。ヒートソースが取り除かれ、温度が最大値を下回ると、バーグラフは再び現れ、正常に機能します。これにより、グラフが温度に応じてスケーリングされる様子と、「Max」オーバーフロープロテクションがどのように機能するかが明確に示されています。(ビデオの17:34にて)
温度の単位を華氏に変更することもできます。#define UNIT 'F'そして調整しているmaxTemperatureそれに応じて。このデモは、最高100°Fのときに、選択した単位で温度と棒グラフを表示し、ディスプレイが同様に効果的に機能することを示しています。
章
- BMP180 温度を棒グラフとして表示する方法の紹介
- [00:43] 温度表示にバーグラフを使用する理由
- [02:34] LCDとBMP180センサーの配線
- コードと必要なライブラリについて説明します。
- [07:13] LCDのI2Cアドレスを見つける
- [09:24] 棒グラフの位置と長さを設定しています
- getTemp()関数の理解
- [17:34] ヒートガンを使ったライブデモンストレーション
/* Display temperature from BMP180 as bargraph on LCD
* Original Sources:
* BMP180 library from https://www.sparkfun.com/products/11824
* LCD library: https://github.com/fdebrabander/Arduino-LiquidCrystal-I2C-library
* Bargraph library from https://playground.arduino.cc/Code/LcdBarGraph/
*
*
* Written and updated by Ahmad Shamshiri on June 05, 2019
* for Robojax in Ajax, Ontario
Watch video tutorial for this code: https://youtu.be/0IojNYgDD7U
If you need the schematic diagram of this circuit, please visit http://bit.ly/rj-udemy
* Robojax Arduino Course on Udemy where you get the schematic diagram of this sketch
* and many other robotics-related lectures and codes. Purchase the course here: http://bit.ly/rj-udemy
- (GND) to GND
+ (VDD) to 3.3V
(WARNING: Do not connect + to 5V or the sensor will be damaged!)
*/
#include <SFE_BMP180.h>
#include <Wire.h>
SFE_BMP180 rjt;// creating object called "rjt" (robojax temperature)
#define UNIT 'C' // unit type C for Celsius F for Fahrenheit
#define maxTemperature 40 // is the value in Celsius or Fahrenheit set in line above
// LCD settings
#include <LiquidCrystal_I2C.h>
byte lcdNumCols = 16; // -- number of columns in the LCD
byte lcdLine = 2; // -- number of lines in the LCD
LiquidCrystal_I2C lcd(0x3f,lcdNumCols,lcdLine); //0x3f is address for I2C
// to get I2C address, run I2C Scanner.
//Link is provided (in same page as this code) at http://robojax.com/learn/arduino
// bargraph settings
#include <LcdBarGraphRobojax.h>
LcdBarGraphRobojax robojax(&lcd, 16, 0, 0); // -- creating 16 character long bargraph starting at char 0 of line 0 (see video)
void setup()
{
Serial.begin(9600);//initialize serial monitor
// -- initializing the LCD
lcd.begin();
lcd.clear();
lcd.print("Robojax");
// Initialize the sensor (it is important to get calibration values stored on the device).
if (rjt.begin())
{
lcd.setCursor (0,1); //
lcd.print("BMP180 Bargraph");
}else {
lcd.setCursor (0,1); //
lcd.print("BMP180 Failed");
while(1); // Pause forever.
}
// -- give use some time to read the text above
delay(2000);
lcd.clear();
}// setup
void loop()
{
// Robojax BMP180 Bargraph main loop
robojax.clearLine(1);// clear line 1 to display fresh temperature
float T = getTemp();// get the temperature
float Tgraph=T;
if(T !=999){
if( Tgraph > maxTemperature){
Tgraph =0;
}
robojax.drawValue( Tgraph, maxTemperature);// draw the bargraph
// Print out the measurement:
Serial.print("temperature: ");
Serial.print(T,2);
lcd.setCursor (0,1); //
if(T< maxTemperature){
lcd.print("Temp.:");
}else{
lcd.print("Max.:");
}
lcd.setCursor (7,1); //
lcd.print(T); // print
lcd.print((char)223);// prints degree symbol
if(UNIT =='C'){
lcd.print("C");//
Serial.println(" deg C");
}else{
lcd.print("F");
Serial.println(" deg F");
}
}else{
Serial.print("Status error");
lcd.setCursor (0,1); //
lcd.print("Error ");
}
delay(500);
}
/*
*
* @brief gets the temperature in Celsius or Fahrenheit
* @param unit, should be capital C or capital F, C=Celsius F=Fahrenheit
* @return temperature in Celsius or Fahrenheit
* Written by Ahmad Shamshiri for Robojax.com
* on Wednesday, June 5th, 2019 at 22:30 in Ajax, Ontario, Canada
*
*/
////////////////////////////////////////////
double getTemp(){
char status;
double Temp,newTemp;
status = rjt.startTemperature();
if (status != 0)
{
// Wait for the measurement to complete:
delay(status);
// Retrieve the completed temperature measurement:
// Note that the measurement is stored in the variable T.
// Function returns 1 if successful, 0 if failure.
status = rjt.getTemperature(Temp);
if (status != 0)
{
if (UNIT =='F')
{
newTemp = (9.0/5.0)*Temp+32.0;// convert to degrees Fahrenheit
}else{
newTemp = Temp;// keeps degree Celsius
}
}
return newTemp;
}else{
return 999;// if error, then return 999
}
}//getTemp/////////////////////////////
必要かもしれないもの
-
アマゾンAmazonでBMP180を購入するamzn.to
リソースと参考文献
-
外部BMP180 データシート (PDF)cdn-shop.adafruit.com
-
外部BMP180センサーの紹介youtube.com
-
外部SparkFun BMP180ライブラリgithub.com
-
外部メーカーからの製品詳細bosch-sensortec.com
ファイル📁
Arduinoライブラリ(zip)
-
Robojax LCDバーグラフライブラリ(ZIPファイル)
robojax-LCD-bargraph-Library.zip0.10 MB