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 | 300~1100 | ±0.6 | ±0.12 | 温度、湿度、空気の汚れ |
●AdafruitのStemma QT/Qwiicボード
Stemma QT/Qwiic(JST SH 4ピン)コネクタは2か所に装着されていて、どちらにつないでもかまいません。このコネクタを使ってI2Cで制御する場合、特に、ジャンパ線をつなぐなどは不要です。
コネクタは、表と裏のどちらも差し込めそうですが、ピンが内部の上部に並んでいるので、差し込める方向は一意です。ロック機構はないですが、すぐに抜けるということはありません。
●気圧センサ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接続用のピンヘッダが用意されているので、はんだ付けをすれば接続できます。コンパイルはエラーなく終了するので、修正をせずに動くかもしれません。