M5Stick-CとBME680で温湿度・気圧・ガスを測定して液晶ディスプレイに表示するスケッチ | そう備忘録

M5Stick-CとBME680で温湿度・気圧・ガスを測定して液晶ディスプレイに表示するスケッチ

BME680

BME680 は BOSCH 製のセンサーで温湿度、気圧、ガスの検知ができる。

BME680 を使ったモジュールは複数販売されているが、今回スイッチサイエンスでこちらのモジュールを購入してM5Stick-C と接続した。

この Seeed Studio Bazaar の製品はGROVE ケーブルが付属しているので I2C でM5Stick-C と簡単に接続することができる。

BME680 GROVEケーブル

尚、同じ BME680 を搭載したモジュールはアマゾンなどでも購入することができる。

スペック

今回購入した製品の主なスペックは以下の通り。

  • 動作電圧:3.3V ~ 5.0V
  • 温度 : -40 〜 +85℃(0.01℃ 単位)
  • 温度精度: ±0.5℃(25℃)、±1℃(0 ~ 65℃)
  • 湿度:0 ~ 100 %(0.008 % 単位)※1
  • 湿度精度 : ±3 %(20 ~ 80 %、25℃)
  • 気圧:300 〜 1100 hPa(18 hPa 単位)
  • 気圧精度 : ±0.6 hPa(300 ~ 1100 hPa、0 ~ 65℃)
  • インターフェイス : I2C(最大3.4 MHz)/ SPI(3線および4線、最大10 MHz)※2
  • I2Cアドレス : 0x76(デフォルト)/ 0x77(オプション)※2

※1 Seeed Studio Bazaar の動画だと湿度の範囲は10 ~ 90% と言っている。但しホームページでは 0 ~ 100%と表記されていた。BOSCH のデータシートを見ると0 ~ 100% となっていたので、こちらが正しいのだと思われる。

※2 デフォルトの I2C アドレスは 0x76 だが裏面の赤枠の向かって左側と中央の端子をショートさせると 0x77 に変更できる(デフォルトは中央と右側のショートで 0x76)

また同様にその下の端子をショートすれば I2C(デフォルト)、開放なら SPI 接続となる。

I2Cアドレスの変更

尚、VOC(揮発性有機化合物)の測定も可能だ。

0(きれい空気)~ 500(汚れた空気)の範囲で測定してIAQセンサー(室内空気質センサー)として使用可能とホームページには載っていた。

またサンプルプログラムでは単位が ppm や mg/㎥ では無く、Kohms となっていたがこの単位の意味はちょっと分からなかった。

ざっくりと部屋の空気が汚れいている(いない)等を把握する分には良いのだと思う。

下記に BOSCH のデータシートに載っていたIAQの対応表を載せておく。

数値が大きいほど空気が汚れていると判断される。

IAQ
BME680表面

M5Stick-C

以前に購入した M5Stick-C を使用した。

M5Stick-C は ESP32-PICO を搭載したスティック型の M5Stack社の製品だ。

詳細は以前の記事を参照して欲しい。

今、購入するのであれば M5Stick-C Plus になると思う。

配線図

M5Stick-C と BME680 との接続は以下の通り。

付属の GROVE ケーブルでそのまま挿せば接続できる。

M5StickCとBME680配線図

※ コメントで指摘があったがBME680モジュールに5Vを供給するとSDA、SCL信号では3.84vが計測された。

「直ぐに壊れるか?」というと微妙な電圧だが、ご指摘の通り長期間使用するのであれば良くない接続だと思う。

このモジュールは3.3Vでも動作するので(GROVE端子での接続ではなくなってしまうが)M5StickCの 3.3V から電源供給をするのが良いと思う。

ライブラリーのインストール

事前に BME680 のライブラリーを Arduino IDE にインストールする。

BME680 のライブラリーは幾つか見つかったが、今回使用したモジュールが Seeed Studio Bazaar のモジュールだったので Seeed Studio の Githubよりダウンロードした。

こちらのページにアクセスして Code ー> Download ZIP で Seeed_BME680-master.zip をダウンロードする。

ライブラリーのダウンロード

Arduino IDE を起動してスケッチ、ライブラリをインクルード、zip形式のライブラリをインストールで先程ダウンロードしたファイルを選択して BME680 のライブラリーをインストールする。

ZIP形式のライブラリーをインクルード

スケッチ

Github に載っていたサンプルプログラムをベースに簡単なスケッチを書いてみた。

ソースコード

/*
 * M5Stick-CでBME680のテスト
 * 測定結果をディスプレイに表示する
 * 
 * @author: Souichirou Kikuchi
 */

#include <M5StickC.h>
#include "seeed_bme680.h"

#define IIC_ADDR  uint8_t(0x76)

Seeed_BME680 bme680(IIC_ADDR); // IIC PROTOCOL

void setupM5StickC() {
    M5.begin();
    delay(10 * 1000); // 10秒待機
    setCpuFrequencyMhz(80); // CPU周波数80以上にしないと無線は使用できない
    M5.Axp.begin(false,false,false,false,true); // 省電力の為、DCDC3をオフ
    M5.Axp.ScreenBreath(10); // 画面の輝度を下げる
    M5.Lcd.setRotation(1); // LCDの方向を変える
    M5.Lcd.setTextSize(2); // フォントサイズを2にする
    M5.Lcd.setTextColor(WHITE, BLACK); // 文字を白、背景を黒
    M5.Lcd.setCursor(10, 10); // カーソル位置
}

void display(float temp, float humi, float pres, float gas) {
    // 温度、湿度、気圧、バッテリーの電圧をディスプレイに表示
    M5.Lcd.fillScreen(BLACK); // 一旦黒くクリア
    M5.Lcd.setCursor(0, 0); // カーソル位置
    M5.Lcd.printf("temp: %4.1f'C\r\n", temp);
    M5.Lcd.printf("humi:%4.1f%%\r\n", humi);
    M5.Lcd.printf("pres:%5.1fhPa\r\n", pres);
    M5.Lcd.printf("gas: %3.2f Kohms\r\n", gas);
}


void setup() {
    int cnt = 0; // 試行回数
    const int MAX_RETRY = 10; // 最大試行回数

    Serial.begin(115200);
    while (!Serial);
    M5.Lcd.println("Program start"); // プログラムスタート
    delay(100);
    setupM5StickC(); // M5Stick-C初期設定
    Wire.begin(); // I2Cの初期化

    while ((!bme680.init()) and (cnt < MAX_RETRY)) { // BME680の初期化
        M5.Lcd.println("BME680 init failed"); // 初期化失敗
        cnt++;
        delay(10000);
    }
    if (cnt < MAX_RETRY) { // BME680の初期化成功
        M5.Lcd.println("BME680 initialized");
    }
}

void loop() {
    float temp, humi, pres, gas;

    if (bme680.read_sensor_data()) {
        M5.Lcd.println("read error");
        return;
    }
    temp = bme680.sensor_result_value.temperature;
    humi = bme680.sensor_result_value.humidity;
    pres = bme680.sensor_result_value.pressure / 100.0; // hPaに変換
    gas = bme680.sensor_result_value.gas / 1000.0;
    display(temp, humi, pres, gas); // M5Stick-CのLCDに表示
    delay(5000);
}

コンパイル&書き込み

パソコンと M5Stick-C を USB で接続すると新たな COMポートが現れるのでツールメニューで以下の設定を行った。

  • ボード:M5Stick-C
  • Upload Speed:115200
  • シリアルポート:COM9(環境によって異なる)

Ctrl + U でコンパイルをして実行プログラムがマイコンボードに書き込まれる。

ツールの設定

動作確認

5秒間隔で温湿度、気圧、ガスを測定して M5Stick-C のモニターに表示されることが確認できた。

とりあえず部屋の中の空気の汚れは 50 以下なので Good! だった。

M5StickCとBME680

今回は M5Stick-C の LCD に測定結果を表示しただけだがネットワークを通じて AWS IoT Core に送信したい場合などは以前の記事を参照して欲しい。

以上で今回の記事は終了とする。

最後に

この記事が何処かで誰かの役に立つことを願っている。

尚、当記事中の商品へのリンクはAmazonアソシエイトへのリンクが含まれています。Amazonのアソシエイトとして、当メディアは適格販売により収入を得ていますのでご了承ください。

souichirou

やった事を忘れない為の備忘録 同じような事をやりたい人の参考になればと思ってブログにしてます。 主にレゴ、AWS(Amazon Web Services)、WordPress、Deep Learning、RaspberryPiに関するブログを書いています。 仕事では工場に協働ロボットの導入や中小企業へのAI/IoT導入のアドバイザーをやっています。 2019年7月にJDLA(一般社団法人 日本デイープラーニング協会)Deep Learning for GENERALに合格しました。 質問は記事一番下にあるコメントかメニュー上部の問い合わせからお願いします。

2件のフィードバック

  1. ななし より:

    このGroveモジュールに5vで電源供給するとM5のSCL,SDAのラインに5Vが印加されませんか?
    ESP32側には5Vトレラントは特についてなかったと思いますので,電気的にはよろしくない接続になる気がします(すぐに壊れることは無いでしょうが

    • souichirou より:

      そうですね。電圧を計測した所、3.84V出ていました。長期間接続しておくと良くないですね。
      ご指摘ありがとうございます。記事に追記しておきます。

ななし へ返信する コメントをキャンセル

名前、メール、サイト欄は任意です。
またメールアドレスは公開されません。