M5StackCore2にENVII(環境センサユニット)を繋ぐ


はじめに

この記事を書くきっかけは、M5StackCore2に環境センサ(ENVIIスイッチサイエンスさんのLink)を繋いで使っていたのですが、突如コンパイルでエラーが出て書き込みも出来なくなってしまいました!。そこで、切り分けで色々試したので、結果を記載します。

現象

コンパイル時に、「ボードM5Stack-Core2に対するコンパイル時にエラーが発生しました。」というもので、複数のライブラリが見つかったなどというエラーを吐いて停止してしまいました。それと、M5Core2.h周りでエラーが出る様な表記が見られました。

環境
OS : Windows10
IDE : Arduino 1.8.15(Windows)
ソースコード:
ベースになったコードは製品のLinkをたどってをCore2にヘッダを変更したもの。
m5stack/M5-ProductExampleCodes
この中の、#include <M5Stack.h> を<M5Core2.h>にしただけで動作してました。

原因と対応

エラーに出るコンパイル時のエラーは、どうも問題のある部分の周辺で出ていて、問題は別の原因の可能性もあるという記事も散見されるので、切り分けを実施しました。(色々な要因をコメントアウトして、原点(Hallow world的なもの)から付け足していきました。)
結果的には、Adafruitで呼び出しているBMP280関連が問題である事が判りました。
元々、温湿度センサのコードは、SHT3X関連のコードは、ENVII.inoのあるディレクトリにありますから、変化していませんので、Adafuritのライブラリに変化があったのに気づかずにアップデートしたのが原因だったのかも知れません。

場所が分かれば、このコードに関連した内容を見直していく訳ですが、Adafuritに関係するものは、
Adafruit_Sensor.hと、Adafruit_BMP280.hの2つです。
元になったコードでは、Adafruit_Sensor.hはENVIIのカレントディレクトリにありますが、
IDEのツール-ライブラリを管理で上記の両方を最新版にし、なおかつ<Adafruit_Sensor.h>と、ENVIIのカレントのものを使わない事としました所、コンパイルが通る様になりました。 めでたしめでたし!。

ただ、Adafruit_Sensorを入れようとした際に、警告が出るのですが、これは私のFull HD画面だと画面の下の外側にinstallのボタンが出てしまって、一瞬どうやて入れるのか?分からない事態に陥りましたが、若干外面をずらして、installしました。(^^;
・・・皆さん良い環境で作業してらっしゃるのね・・・。

修正コード

/*Please install the < Adafruit BMP280 Library > https://github.com/adafruit/Adafruit_BMP280_Library
 * from the library manager before use. 
 *This code will display the temperature, humidity and air pressure information on the screen*/

#include <M5Core2.h>
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP280.h>
#include "SHT3X.h"
SHT3X sht30;
Adafruit_BMP280 bmp;

float tmp = 0.0;
float hum = 0.0;
float pressure = 0.0;

void setup() {
  M5.begin();
  Wire.begin();
  M5.Lcd.setBrightness(10);
  M5.Lcd.setTextSize(3);
  Serial.println(F("ENV Unit(SHT30 and BMP280) test..."));

  while (!bmp.begin(0x76)){  
    Serial.println("Could not find a valid BMP280 sensor, check wiring!");
    M5.Lcd.println("Could not find a valid BMP280 sensor, check wiring!");
  }
  M5.Lcd.clear(BLACK);
  M5.Lcd.println("ENV Unit test...");
  delay(100);
  M5.Lcd.fillRect(0, 0, 340, 30, BLACK);
}

void loop() {
  pressure = bmp.readPressure() / 100.0;
  if(sht30.get()==0){
    tmp = sht30.cTemp;
    hum = sht30.humidity;
  }
  Serial.printf("Temperatura: %2.2f*C  Humedad: %0.2f%%  Pressure: %0.2fhPa\r\n", tmp, hum, pressure);
  M5.Lcd.setCursor(0, 0);
  M5.Lcd.setTextColor(WHITE, BLACK);

  M5.Lcd.printf("Temp: %2.1f  \r\nHumi: %2.1f%%  \r\nPressure:%2.1fPa\r\n", tmp, hum, pressure);

  delay(100);

}

オリジナルから変更した点は、
・「Adafruit_Sensor.h」をENVIIのカレントディレクトリから通常のライブラリ呼び出しとした点
・湿度の小数点以下を表示させた(精度的には小数点以下は切りたい?)のと、気圧をPaからhPa(何となく気象っぽい)にしました。
 気に入らない場合は、修正下さい。
・BMP280の宣言で、「Adafruit_BMP280 bme;」としている所はbmeは何となく気持ちが悪いのでbmpとしました。(別に動作には関係無し)
  元は、BMP280で使ったものを修正した?のかも知れませんね。

本検討で使ったAdafuritのライブラリのバージョンは、
  Adafruit BMP280 Library : 2.1.2
  Adafruit Sensor Lab : 0.4.2 -- その他関連で必要なものも同時にInatall

余談

BoshのBMP280を使えば、センサ単体で温度・湿度・気圧が測れますが、ENVIIでそうしなかったのは、BME280の温度センサは気圧などの温度補正用に使われるものらしい事、電流を流しっぱなしだと、他のセンサより温度が高めに出るらしい事から、別にしたのかも知れませんね。
他の方のライブラリを使うのは、短期間で立ち上げる際にはショートカットが出来て助かりますが、いざ、問題が出ると、Black boxになってしまって、原因を探るのに苦労する事があります。 ・・・結局は色々な経験をしてその辺も身につけてねねという事なのかも知れませんけど。