検索コード

レッスン96-1: 気圧、温度、およびおおよその高度センサーBMP390とArduinoの基本コード

レッスン96-1: 気圧、温度、およびおおよその高度センサーBMP390とArduinoの基本コード

このガイドでは、Bosch BMP390センサーとArduinoを使用して、高精度な環境モニタリングシステムを構築する方法を説明します。BMP180やBMP280のような古いセンサーとは異なり、BMP390は卓越した精度を備えており、気圧や高度のわずかな変化が重要となるプロジェクトに最適です。このチュートリアルでは、温度、気圧、おおよその高度を読み取り、このデータをシリアルモニターやLCD画面に表示し、さらにその読み取り値を使用してリレーなどの他のデバイスを制御する方法まで紹介します。

BMP380_pink-module-1

このプロジェクトは、幅広い用途に最適です。始めるためのアイデアをいくつか紹介します。

  • 気象観測所: コンパクトで正確な家庭用気象観測所を構築し、気圧の傾向と局所的な温度を追跡します。
  • 標高・高度ロガー: 高度の変化を測定・記録するデバイスを作成します。ハイキング、ドローンの飛行、建物のフロア確認などに役立ちます。
  • スマートサーモスタットコントローラー: 温度読み取り値を使用してリレーを介してヒーターやクーラーを制御し、特定の温度範囲を維持します。
  • 環境エンクロージャーモニター: サーバーラック、温室、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_arduino_wiring_2-gravity-module-sda-scl-pins
BMP390_arduino_wiring_2-gravity-module
BMP390_arduino_wiring_pink-1-from-sda-scl-pins
BMP390_arduino_wiring_pink-2
BMP380_pink-module-4

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, 220, 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階建ての建物での実世界の高度テスト

画像

BMP380_pink-module-4
BMP380_pink-module-4
BMP380_pink-module-3-size
BMP380_pink-module-3-size
BMP380_pink-module-2
BMP380_pink-module-2
BMP380_pink-module-1
BMP380_pink-module-1
BMP380_pink-module-gravitiy-1
BMP380_pink-module-gravitiy-1
BMP390_arduino_wiring_2-gravity-module-sda-scl-pins
BMP390_arduino_wiring_2-gravity-module-sda-scl-pins
BMP390_arduino_wiring_2-gravity-module
BMP390_arduino_wiring_2-gravity-module
BMP390_arduino_wiring_pink-1-from-sda-scl-pins
BMP390_arduino_wiring_pink-1-from-sda-scl-pins
BMP390_arduino_wiring_pink-2
BMP390_arduino_wiring_pink-2
434-Lesson 96-1: Basic code for BMP390
言語: C++
++
/*
 * 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");  
}

必要かもしれないもの

ファイル📁

データシート(pdf)