M5StickC ENV Hat III で気圧を測る ~ 高度計を作る

今までM5StickCで高度計を作成しましたが、センサーにBME280を使い、Proto Hatに組み込んで作ったものでした。
これで機能的には問題ないのですが、Hat部分が大きくて実際に使うと邪魔な感じが拭えませんでした。そこで、正規のHatであるENV Hat IIIを購入しました。

このように、自作Hatの半分の大きさです。ENV Hat IIIをM5StickCに取り付けると

こんな感じでスッキリします。これなら、行動中でも邪魔になることは少なそうです。
さて、ENV Hat IIIですが、ENV Hat IIで使用されていたBMP280がQMP6988に変更されています。また、今まで温度と湿度はBME280から取得していましたが、これもSHT30から取得の変更になります。
これらの変更のため、ライブラリをダウンロードしました。githubにサンプルが用意されています。
srcフォルダにあるソースを、プロジェクトのあるフォルダにコピーしてください。
以下、ENV Hat IIIに対応したソースです。
#include <M5StickC.h>
#include <Wire.h>
#include "QMP6988.h"
#include "SHT3X.h"
#include "Adafruit_Sensor.h"
#include <math.h>
SHT3X sht30;
QMP6988 qmp6988;
float tmp = 0.0;
float hum = 0.0;
float pressure = 0.0;
float altitude = 0.0;
int hosei ;
int isMode ; // mode 0 : 湿度 1 : 温度 // 2 : 高度
float getAltitude(float wkTemp, float wkPress) {
float wkAltitude = 0;
float seaAltitude = (float)1013.25 ;
float PressJyou = (float)1 / (float)5.257 ;
float wkPressHi = seaAltitude / wkPress ;
float wkPress2 = powf(wkPressHi, PressJyou) ;
wkPress2 = wkPress2 - (float)1 ;
float wkTemp2 = wkTemp + 273.15 ;
wkAltitude = wkPress2 * wkTemp2 / (float)0.0065 ;
return wkAltitude ;
}
void setup() {
// put your setup code here, to run once:
isMode = 2 ; // 0:湿度 1:気温 2:高度
M5.begin();
Wire.begin(0,26);
M5.Lcd.setRotation(3);
M5.Lcd.fillScreen(BLACK);
M5.Lcd.setCursor(0, 0, 2);
M5.Lcd.println("ENV TEST");
qmp6988.init();
}
void loop() {
// put your main code here, to run repeatedly:
// 補正を行う ボタン処理は再考してください
if ( digitalRead(M5_BUTTON_HOME) == LOW ) {
// +補正
hosei += 10 ;
Serial.print("+");
} else if (digitalRead(M5_BUTTON_RST) == LOW ) {
// -補正
hosei -= 10 ;
Serial.print("-");
}
M5.Lcd.fillScreen(BLACK);
M5.Lcd.setTextColor(GREEN);
M5.Lcd.setCursor(0, 10, 7);
Serial.print("\nMode=");
Serial.print(isMode);
if (sht30.get() == 0) {
hum = sht30.humidity ;
tmp = sht30.cTemp;
} else {
hum = 0.0 ;
tmp = 0.0 ;
}
if (isMode == 0) {
M5.Lcd.printf("%3.2f", hum);
} else if (isMode == 1) {
M5.Lcd.printf("%3.2f", tmp);
} else if (isMode == 2) {
pressure = qmp6988.calcPressure() / 100 ;
altitude = getAltitude(tmp, pressure) + hosei ;
M5.Lcd.printf("%04.0f", altitude) ;
M5.Lcd.setTextColor(YELLOW);
M5.Lcd.setCursor(135, 35, 4);
M5.Lcd.printf("m") ;
Serial.print("\nPressure=");
Serial.print(pressure);
Serial.print("\nAltitude=");
Serial.print(altitude);
}
M5.Lcd.setTextColor(WHITE);
M5.Lcd.setCursor(25, 65, 1);
if (isMode == 0) {
M5.Lcd.printf("%3.1f", tmp) ;
} else if (isMode == 1) {
M5.Lcd.printf("%3.2f", hum);
} else if (isMode == 2) {
M5.Lcd.printf("%04.0f", pressure) ;
}
delay(5000);
}
ボタンA(Home)で10m高度を上げる補正をし、ボタンB(Reset)で10m高度を下げる補正をします。また、isModeを変更することで温度、湿度の表示もできますが、プログラムのが必要です。
ひとつ問題点があります。高度を計算する時に温度が必要ですが、M5StickCに隣接するセンサーは実際よりも高い温度となってしまいます。また、腕の体温の影響もあります。そのため、高度の計算に狂いが出てきます。しかし、気圧の変化の方が高度に大きく影響するので、補正をすることで十分とも言えそうです。
今回のプログラムは、5秒ごとに気圧を計測しているので、バッテリーが1時間ほどしか持たないでしょう。もし、実用的なプログラムにするのであれば、以下の記事で紹介したソースをENV Hat IIIに対応させてください。
実際に試してみたいのですが、登山を辞めたのでできません。近くのハイキングか、車での峠越えでテストしてみたいと思います。