レッスン96-1: 気圧、温度、およびおおよその高度センサーBMP390とArduinoの基本コード
このガイドでは、Bosch BMP390センサーとArduinoを使用して、高精度な環境モニタリングシステムを構築する方法を説明します。BMP180やBMP280のような古いセンサーとは異なり、BMP390は卓越した精度を備えており、気圧や高度のわずかな変化が重要となるプロジェクトに最適です。このチュートリアルでは、温度、気圧、おおよその高度を読み取り、このデータをシリアルモニターやLCD画面に表示し、さらにその読み取り値を使用してリレーなどの他のデバイスを制御する方法まで紹介します。
このプロジェクトは、幅広い用途に最適です。始めるためのアイデアをいくつか紹介します。
- 気象観測所: コンパクトで正確な家庭用気象観測所を構築し、気圧の傾向と局所的な温度を追跡します。
- 標高・高度ロガー: 高度の変化を測定・記録するデバイスを作成します。ハイキング、ドローンの飛行、建物のフロア確認などに役立ちます。
- スマートサーモスタットコントローラー: 温度読み取り値を使用してリレーを介してヒーターやクーラーを制御し、特定の温度範囲を維持します。
- 環境エンクロージャーモニター: サーバーラック、温室、3Dプリンターエンクロージャー内の状態を監視し、しきい値を超えたときにアラームやファンをトリガーします。
-
BMP380_pink-module-gravitiy-1
ハードウェアコンポーネント
このプロジェクトに沿って進めるには、以下のコンポーネントが必要です。センサーが主役ですが、ディスプレイとリレーのオプションにより、機能を拡張できます。
- Arduino Uno(または同等のボード)
- BMP390気圧センサーモジュール
- I2Cインターフェース付きLCD1602(16x2)またはLCD2004(20x4)
- リレーモジュール(制御デモ用)
- ジャンパーワイヤー
- ブレッドボード(オプション、簡単な接続用)
BMP390センサーについて
BMP390は、Bosch製の非常に小型で高精度なセンサーです。その小さなサイズ(2.0 x 2.0 x 0.75 mm)は、その印象的な能力を裏切るものです。300 hPaから1250 hPaの圧力を、絶対精度±0.5 hPaで測定できます。これは、わずか±0.25メートルの信じられないほどの相対高度精度に相当し、前世代モデルからの大幅なアップグレードとなります。購入するモジュールには通常、電圧レギュレーターとロジックレベルコンバーターが含まれており、3.3Vと5Vの両方のロジックと電源で安全に使用できるため、配線が簡素化されます。I2CまたはSPIで通信し、このプロジェクトではより簡単なI2Cプロトコルを使用します。
配線ガイド
BMP390の接続は簡単です。このガイドでは、わずか4本のワイヤーしか必要としないI2Cインターフェースを使用します。以下の配線図は、Arduino Unoへの接続を示しています。
BMP390モジュールの接続表は次のとおりです。
| BMP390モジュール | Arduino Uno |
|---|---|
| VIN(またはVCC) | 5V(または3.3V) |
| GND | GND |
| SDA | A4(SDA) |
| SCL | A5(SCL) |
LCDプロジェクトに関する重要な注意事項: LCDディスプレイも使用する場合、センサーにArduinoのデジタルピンから電源を供給できます。ビデオでは、ピン12がセンサーの電源ピンとして定義されており、セットアップでHIGHに設定されて5Vを供給しています。これは、ブレッドボードなしで電源を管理する賢い方法です。LCDのSDAとSCLもそれぞれA4とA5に接続されています。
コードの説明
このプロジェクトのコードは、モジュール式で適応しやすいように設計されています。以下は、ユーザーが設定できる主要なセクションです。完全なプログラムは、記事の下からダウンロードできます。
1. ライブラリとオブジェクトの初期化
まず、I2C通信用とセンサー自体用の必要なライブラリを含める必要があります。次に、センサー用のオブジェクトを作成します。
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include "Adafruit_BMP3XX.h"
Adafruit_BMP3XX bmp; // 'bmp'という名前のオブジェクトを作成
オブジェクトの名前はbmpから好きなものに変更できますが、コード内のすべての参照を更新する必要があります。Wire.hライブラリはI2C通信に不可欠です。
2. 海面気圧の校正
この定数は、正確な高度測定に不可欠です。センサーは、現在の気圧をこの基準気圧と比較して高度を計算します。最も正確な結果を得るには、この値を現在の場所の海面気圧に更新する必要があります。
#define SEALEVELPRESSURE_HPA (1013.25)
3. LCD設定
LCDを使用する場合は、そのI2Cアドレスと寸法を設定する必要があります。コードはLiquidCrystal_I2Cライブラリを使用します。ビデオで示されているように、I2Cスキャナースケッチを使用してLCDのアドレスを見つけることができます。
LiquidCrystal_I2C lcd(0x3F, 16, 2); // アドレス 0x3F、16文字、2行
20x4 LCDを使用する場合は、16, 2を20, 4に変更してください。I2Cアドレス0x3Fは一般的ですが、異なる場合があります。ディスプレイが動作しない場合は、I2Cスキャナーを実行して正しいアドレスを見つけてください。
4. 制御ロジック(リレーの例)
このセクションでは、センサーデータを使用してアクションを実行する方法を示します。コードは、温度がしきい値を超えたかどうかを確認し、ピン10に接続されたリレーをオンにします。しきい値とピン番号は、ニーズに合わせて変更できます。
if(temperatureC >38.0)
{
digitalWrite(10, HIGH); // リレーをオンにする
}else{
digitalWrite(10, LOW); // リレーをオフにする
}
5. カスタム関数: readValues()
このカスタム関数は、センサーを読み取り、値をグローバル変数に格納するために使用されます。メインループを簡素化し、コードをよりクリーンにします。摂氏で温度を読み取り、華氏とケルビンも計算します。
void readValues()
{
temperatureC = bmp.temperature; // 摂氏で温度を読み取る
temperatureF = bmp.temperature * 9/5 + 32; // 華氏に変換
temperatureK = bmp.temperature + 273.15; // ケルビンに変換
altitude = bmp.readAltitude(SEALEVELPRESSURE_HPA); // メートル単位で高度を読み取る
pressure = bmp.pressure / 100.0F; // hPa単位で気圧を読み取る
}
ライブプロジェクトデモンストレーション
ビデオでは、Robojaxがセンサーのいくつかの実世界テストをデモンストレーションしています。まず、ヒートガンでセンサーに熱を加え、シリアルモニターの温度表示が室温から60°C以上に上昇し、その後ゆっくりと冷える様子を示しています。これにより、センサーの応答性が確認されます。
次に、16x2と20x4の両方のLCDにデータが表示され、摂氏と華氏の温度、hPa単位の気圧、およびおおよその高度が循環表示されることを示しています。その後、リレー制御アプリケーションをデモンストレーションし、開始温度を30°C、停止温度を45°Cに設定します。センサーに熱を加えると、温度が45°Cを超えるとリレーがオフになり、温度が30°C未満に下がると再びオンになります。
最後に、印象的な高度テストを実行します。まず、地上レベル(アイススケートリンク)で高度を測定し、約-15メートルと表示されます。次に、近くの建物の25階に移動して別の測定を行います。センサーは約57.2メートルの高度を報告します。2つの測定値の差は約72メートルで、25階建ての建物の予想される高さとよく一致しています。これは、センサーがおおよその高度変化を測定する実用的な能力を示しています。
チャプター
- [00:00] はじめにとプロジェクト概要
- [01:19] BMP390センサーとその機能の紹介
- [03:43] メーカーによるセンサー仕様
- [05:45] Arduino Unoを使用したBMP390の配線図
- [07:48] LCDディスプレイを使用したBMP390の配線図
- [09:46] SPI通信の配線
- [10:29] 必要なライブラリのインストール
- [11:38] 基本コードの説明
- [15:46] 制御ロジックの追加(例:リレーのオン)
- [17:30] LCDディスプレイのコード説明
- [25:09] 20x4 LCDとSPI通信のコード
- [26:22] ライブデモンストレーション:センサーの加熱
- [28:05] LCDディスプレイを使用したデモンストレーション
- [29:42] 20x4 LCDを使用したデモンストレーション
- [30:07] ヒートガンを使用したリレー制御デモンストレーション
- [32:12] 25階建ての建物での実世界の高度テスト
++
/*
* Lesson 96: Using Precision BMP390 Barometric Pressure and Temperature Sensor
* with Arduino
Download and resource page https://robojax.com/RJT454
* Watch video instruction on YouTube: https://youtu.be/XevQYG_A5xA
*
* Code updated by Ahmad Shamshiri for Robojax.com
* on Jan 13, 2022 at 17:10 in Ajax, Ontario, Canada
This video is part of Arduino Step by Step Course which starts here: https://youtu.be/-6qSrDUA5a8
This is a library for the BMP390 temperature & pressure sensor
Designed specifically to work with the Adafruit BMP388 Breakout
----> http://www.adafruit.com/products/3966
These sensors use I2C or SPI to communicate, 2 or 4 pins are required
to interface.
Adafruit invests time and resources providing this open source code,
please support Adafruit and open-source hardware by purchasing products
from Adafruit!
Written by Limor Fried & Kevin Townsend for Adafruit Industries.
BSD license, all text above must be included in any redistribution
**************************************************************************
*/
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include "Adafruit_BMP3XX.h"
#define SEALEVELPRESSURE_HPA (1013.25)
float temperatureC, temperatureK, temperatureF, pressure, altitude;
Adafruit_BMP3XX bmp;
void setup() {
Serial.begin(9600);
while (!Serial);
Serial.println("Adafruit BMP388 / BMP390 test");
if (!bmp.begin_I2C()) { // hardware I2C mode, can pass in address & alt Wire
Serial.println("Could not find a valid BMP3 sensor, check wiring!");
while (1);
}
// Set up oversampling and filter initialization
bmp.setTemperatureOversampling(BMP3_OVERSAMPLING_8X);
bmp.setPressureOversampling(BMP3_OVERSAMPLING_4X);
bmp.setIIRFilterCoeff(BMP3_IIR_FILTER_COEFF_3);
bmp.setOutputDataRate(BMP3_ODR_50_HZ);
}
void loop() {
if (! bmp.performReading()) {
Serial.println("Failed to perform reading :(");
return;
}
readValues();
Serial.print("Temperature C: ");
Serial.print(temperatureC);
printDegree();
Serial.println(" C");
Serial.print("Pressure: ");
Serial.print(pressure);
Serial.println(" hPa");
Serial.print("Approximate Altitude: ");
Serial.print(altitude);
Serial.println(" m");
Serial.println();
if(temperatureC >38.0)
{
digitalWrite(10, HIGH);
}else{
digitalWrite(10, LOW);
}
delay(2000);
}
/*
* readValues()
* @brief reads the temperature based on the TEMPERATURE_UNIT
* @param average temperature
* @return returns one of the values above
* Written by Ahmad Shamshiri for robojax.com
* on Jan 15, 2022 at 08:02 in Ajax, Ontario, Canada
*/
void readValues()
{
//Robojax.com BMP390
temperatureC = bmp.temperature;// return Celsius
temperatureF = bmp.temperature *9/5 + 32;//convert to Fahrenheit
temperatureK = bmp.temperature + 273.15;//convert to Kelvin
altitude = bmp.readAltitude(SEALEVELPRESSURE_HPA);// read altitude
pressure = bmp.pressure / 100.0F; // get pressure in hecto pascal
}// readValues()
/*
* @brief prints degree symbol on serial monitor
* @param none
* @return returns nothing
* Written by Ahmad Shamshiri on July 13, 2019
* for Robojax Tutorial Robojax.com
*/
void printDegree()
{
Serial.print("\\xC2");
Serial.print("\\xB0");
}
必要かもしれないもの
-
アリエクスプレスAliExpressで購入してください。s.click.aliexpress.com
-
アリエクスプレスBMP388 High Precision Digital Atmospheric Pressure on AliExpresss.click.aliexpress.com
-
バングッドBanggoodから購入してください。banggood.com
リソースと参考文献
-
外部AliExpressで購入してください。s.click.aliexpress.com
-
外部Banggoodから購入してください。banggood.com
-
外部BMP390 ボッシュ公式製品ページbosch-sensortec.com
-
外部アメリカのアマゾンで購入してください。amzn.to
-
外部カナダのアマゾンで購入してください。amzn.to
-
外部他のすべてのAmazonサイトから購入してください。amzn.to