Arduino UNO R4 Minimaでセンサ・インターフェーシング ⑱ 気圧センサ BME688

 Adafruitから入手したMEMS気圧センサ BME688(ボッシュ)を利用します。

 気圧温度、湿度、そして空気のよごれが測定できます。

 ボッシュの気圧センサの一覧を次に示します。

 BME688はBME680にヒータ(動作時の電流;12mA)を追加した改良型という位置づけのようです。空気の汚れは、MOX (金属酸化物)センサで検出できます。監視対象のガスと接触するとセンサの電気抵抗が変化するので、利用する前に標準的な検体で校正しておきます。ボッシュでは、これらの応用を行うための機械学習支援を行うBME AI-Studioというツールを用意しています。

 コーヒーの銘柄を検出するという応用例などがあるようです。より精度を上げるために、温度や湿度の情報を利用するようです。したがって、気圧温度、湿度の測定をメインに利用するのは、BME2xxなどのほうが適しています。

 ベーシックな空気の情報を検出し、それを基準に同等な空気の状態を監視するような応用は、BME AI-Studioを使わなくてもできそうですが、試行錯誤の時間がかかるかもしれません。ここでは、そのようなこのセンサのメインの利用方法には触れません。

型名 電源電圧
[V]
測定範囲
[hPa]
絶対確度圧力
[hPa]
相対確度圧力
[hPa]
その他の機能
BMP280 1.71~3.6 300~1100 ±1 ±0.12 温度
BME280 1.71~3.6 300~1100 ±1 ±0.12 温度、湿度
BMP388 1.65~3.6 300~1250 ±0.40 ±0.08 温度
BMP390 1.65~3.6 300~1250 ±0.50 ±0.03 温度
BME680 1.71~3.6 300~1100 ±0.6 ±0.12 温度、湿度、空気の汚れ
BME688 1.7~3.6  3001100 ±0.6 ±0.12 温度、湿度、空気の汚れ

AdafruitのStemma QT/Qwiicボード

 BME688ボード解説のページ

 Stemma QT/Qwiic(JST SH 4ピン)コネクタは2か所に装着されていて、どちらにつないでもかまいません。このコネクタを使ってI2Cで制御する場合、特に、ジャンパ線をつなぐなどは不要です。

 コネクタは、表と裏のどちらも差し込めそうですが、ピンが内部の上部に並んでいるので、差し込める方向は一意です。ロック機構はないですが、すぐに抜けるということはありません。

気圧センサBME688のおもなスペック

 BME688のデータシート

  • 電源電圧 1.71~3.6V
  • 動作温度範囲  -40~+85℃
  • 温度測定範囲 -40~+85℃、確度;±0.5℃
  • 気圧測定範囲 300~1100hPa、確度;±0.12hPa
  • 湿度測定範囲 0~100%、確度;±3%
  • F1スコア H2S換算 0.94、スキャン速度 10.8秒/回
  • インターフェース I2C(最大3.4MHz)、SPI(最大10MHz)
  • スレーブ・アドレス 0x77。裏面のADDRをショートして0x76に設定できる

使用環境

  • Arduino UNO R4 Minima
  • Arduino IDE 2.2.1
  • Windows10 22H2

接続

 Arduino UNO R4 MinimaのI2C信号とセンサ・ボードをJSTコネクタでつなぎます(Stemma QT/Qwiicボードの写真の比率は異なる)。

スレーブ・アドレスを確認

 従来からよく使われているi2cScanner.inoを動かしてスレーブ・アドレスを確認します。電源は3.3Vです。

  0x77を見つけてきました。

 


ライブラリの用意

 BME68で検索して、見つかったAdafruit BME680ライブラリをインストールします。

 インストールを始めたとき、関連のライブラリや依存関係をインストールするかというパネルが出た場合は、全てをインストールを選びます。

サンプル・スケッチ

 メニューのファイル->スケッチ例から、Adafruit BME680からbmp680test.inoを選択し、コンパイル、実行します。

 

 SPI関連を取り除き、I2Cの記述だけ残したスケッチです。


//  Designed specifically to work with the Adafruit BME680 Breakout
//  ----> http://www.adafruit.com/products/3660
//  Written by Limor Fried & Kevin Townsend for Adafruit Industries.


#include <Wire.h>
#include <Adafruit_Sensor.h>
#include "Adafruit_BME680.h" Adafruit_BME680 bme; // I2C void setup() { Serial.begin(9600); while (!Serial); Serial.println(F("BME680 test")); if (!bme.begin()) { Serial.println("Could not find a valid BME680 sensor, check wiring!"); while (1); } // Set up oversampling and filter initialization bme.setTemperatureOversampling(BME680_OS_8X); bme.setHumidityOversampling(BME680_OS_2X); bme.setPressureOversampling(BME680_OS_4X); bme.setIIRFilterSize(BME680_FILTER_SIZE_3); bme.setGasHeater(320, 150); // 320*C for 150 ms } void loop() { if (! bme.performReading()) { Serial.println("Failed to perform reading :("); return; } Serial.print("Temperature = "); Serial.print(bme.temperature); Serial.println(" *C"); Serial.print("Pressure = "); Serial.print(bme.pressure / 100.0); Serial.println(" hPa"); Serial.print("Humidity = "); Serial.print(bme.humidity); Serial.println(" %"); Serial.print("Gas = "); Serial.print(bme.gas_resistance / 1000.0); Serial.println(" KOhms"); Serial.println(); delay(2000); }

4桁の7セグメントLED表示器をつないで測定結果を表示する

 連載の第4回目の記事を参照しながら表示器を接続します。

Arduino UNO R4 Minimaでセンサ・インターフェーシング ④ 温湿度センサSi7021の測定結果を7セグメントLEDに表示


 スケッチです。

 7セグメントLED表示器は、第12回 温湿度センサ SHTC3でスレーブ・アドレスが重なったので、デフォルトの0x70から、ジャンパのA0をショートして0x71に変更してあります。デフォルトのまま使うときは0x70で使ってください。


//  Designed specifically to work with the Adafruit BME680 Breakout
//  ----> http://www.adafruit.com/products/3660
//  Written by Limor Fried & Kevin Townsend for Adafruit Industries.

#include <Wire.h>
#include <Adafruit_GFX.h>
#include "Adafruit_LEDBackpack.h"
#include <Adafruit_Sensor.h>
#include "Adafruit_BME680.h" Adafruit_7segment matrix = Adafruit_7segment(); Adafruit_BME680 bme; // I2C void setup() { Serial.begin(9600); while (!Serial); Serial.println(F("BME680 + 7segment LED")); if (!bme.begin()) { Serial.println("Could not find a valid BME680 sensor, check wiring!"); while (1); } // Set up oversampling and filter initialization bme.setTemperatureOversampling(BME680_OS_8X); bme.setHumidityOversampling(BME680_OS_2X); bme.setPressureOversampling(BME680_OS_4X); bme.setIIRFilterSize(BME680_FILTER_SIZE_3); bme.setGasHeater(320, 150); // 320*C for 150 ms matrix.begin(0x71); matrix.setBrightness(0x05); // default 0x0E } void loop() { if (! bme.performReading()) { Serial.println("Failed to perform reading :("); return; } float tempC = bme.readTemperature(); float press = bme.readPressure() / 100.0; float humi = bme.readHumidity(); float gas = bme.gas_resistance / 1000.0; Serial.print("Temperature = "); Serial.print(tempC); Serial.println(" *C"); Serial.print("Pressure = "); Serial.print(press); Serial.println(" hPa"); Serial.print("Humidity = "); Serial.print(humi); Serial.println(" %"); Serial.print("Gas = "); Serial.print(gas); Serial.println(" KOhms"); Serial.println(); matrix.print(tempC, DEC); matrix.writeDisplay(); delay(2000); matrix.print(press, DEC); matrix.writeDisplay(); delay(2000); matrix.print(humi, DEC); matrix.writeDisplay(); delay(2000); matrix.print(gas, DEC); matrix.writeDisplay(); delay(5000); }


 実行例です。

グラフィック・ディスプレイに測定結果を表示

 次の記事を参考に、グラフィック・ディスプレイに測定した気圧、温度、湿度、ガス・センサの抵抗値を表示します。

  Arduino UNO R4 Minimaでセンサ・インターフェーシング ⑤ 温湿度センサSi7021の測定結果をグラフィック・ディスプレイに表示

 スケッチです。


//  Designed specifically to work with the Adafruit BME680 Breakout
//  ----> http://www.adafruit.com/products/3660
//  Written by Limor Fried & Kevin Townsend for Adafruit Industries.

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_Sensor.h>
#include "Adafruit_BME680.h" #define SCREEN_WIDTH 128 // OLED display width, in pixels #define SCREEN_HEIGHT 64 // OLED display height, in pixels #define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin) #define SCREEN_ADDRESS 0x3D ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32 Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); Adafruit_BME680 bme; // I2C void setup() { Serial.begin(9600); while (!Serial); Serial.println("BME680 + OLED SSD1306"); if (!bme.begin()) { Serial.println("Could not find a valid BME680 sensor, check wiring!"); while (1); } // Set up oversampling and filter initialization bme.setTemperatureOversampling(BME680_OS_8X); bme.setHumidityOversampling(BME680_OS_2X); bme.setPressureOversampling(BME680_OS_4X); bme.setIIRFilterSize(BME680_FILTER_SIZE_3); bme.setGasHeater(320, 150); // 320*C for 150 ms display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS); display.clearDisplay(); display.drawRect(0, 0, display.width(), display.height(), SSD1306_WHITE); display.setTextSize(1); // Normal 1:1 pixel scale display.setTextColor(SSD1306_WHITE); // Draw white text display.setCursor(3,3); display.println("Temperature:"); display.setTextSize(1); display.setTextColor(SSD1306_WHITE); display.setCursor(79,3); display.println("Humidity"); display.setTextSize(1); display.setTextColor(SSD1306_WHITE); display.setCursor(4,34); display.println("Pressure:"); display.display(); display.setTextSize(1); display.setTextColor(SSD1306_WHITE); display.setCursor(69,34); display.println("Gas:"); display.display(); delay(200); } void loop() { if (! bme.performReading()) { Serial.println("Failed to perform reading :("); return; } float tempC = bme.readTemperature(); float press = bme.readPressure() / 100.0; float humi = bme.readHumidity(); float gas = bme.gas_resistance / 1000.0; Serial.print("Temperature = "); Serial.print(tempC); Serial.println(" *C"); Serial.print("Pressure = "); Serial.print(press); Serial.println(" hPa"); Serial.print("Humidity = "); Serial.print(humi); Serial.println(" %"); Serial.print("Gas = "); Serial.print(gas); Serial.println(" KOhms"); Serial.println(); display.setTextSize(2); // Draw 2X-scale text display.setCursor(8,17); display.fillRect(8, 17, 70, 16, SSD1306_BLACK); display.println(tempC); display.setCursor(78,17); display.fillRect(78, 17, 46, 16, SSD1306_BLACK); display.println(humi,1); display.setCursor(4, 46); display.fillRect(10, 46, 100, 16, SSD1306_BLACK); display.println(int(press)); display.display(); display.setCursor(64, 46); display.fillRect(64, 46, 60, 16, SSD1306_BLACK); display.println(gas); display.display(); delay(5000); }

 実行例です。

ボッシュのライブラリ

 BME68で検索して、見つかったボッシュのBME68x Sensorライブラリをインストールします。

 サンプル・スケッチを開くと、SPIで駆動しています。ここで利用しているAafruitのAdafruitのStemma QT/Qwiicボードには、SPI接続用のピンヘッダが用意されているので、はんだ付けをすれば接続できます。コンパイルはエラーなく終了するので、修正をせずに動くかもしれません。

前へ

Arduino UNO R4 Minimaでセンサ・インターフェーシング ⑰ 気圧センサ BMP390

次へ

Arduino UNO R4 Minimaでセンサ・インターフェーシング ⑲ 気圧センサ DPS310