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

今までM5StickC高度計を作成しましたが、センサーBME280を使い、Proto Hatに組み込んで作ったものでした。

これで機能的には問題ないのですが、Hat部分が大きくて実際に使うと邪魔な感じが拭えませんでした。そこで、正規のHatであるENV Hat IIIを購入しました。

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

created by Rinker
スイッチサイエンス
¥1,584 (2023/03/27 06:04:22時点 Amazon調べ-詳細)

こんな感じでスッキリします。これなら、行動中でも邪魔になることは少なそうです。

さて、ENV Hat IIIですが、ENV Hat IIで使用されていたBMP280QMP6988に変更されています。また、今まで温度と湿度は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に対応させてください。

実際に試してみたいのですが、登山を辞めたのでできません。近くのハイキングか、車での峠越えでテストしてみたいと思います。