M5StickCで気圧(高度)を測る ~ BMP280/BME280を使う

2020年10月15日

M5StickC気圧を測るのなら、拡張モジュールである「ENV II Hat」を使います。その「ENV II Hat」は、気圧だけでなく、温度や湿度、磁界を計測することができます。

私も「ENV II Hat」を使ってみようかなと考えていたのですが、「ENV II Hat」に搭載されているセンサーがBMP280であることで、手持ちのBMP280でいいんじゃないかと思いました。

そこで、とりあえず、「ENV II Hat」の購入前にBMP280で気圧を計測してみることにしました。

1.M5StickCとBMP280を接続する

M5StickCのPINとBMP280を以下のように接続します。M5StickCのPINは8つしかないので、ブレッドボードも利用します。
(左がBMP280で右がM5StickC)

VCC -> 3.3V
GND -> GND
SCL -> GPIO26
SDA -> GPIO0
CSB -> 3.3V
SDO -> GND

3.3VとGNDをブレッドボードで介しています。

2. BMP280ライブラリをインストールする

BMP280センサーのライブラリをインストールします。メニューで、「スケッチ」「ライブラリをインクルード」「ライブラリの管理」を選んで、表示されたダイアログに「bmp280 adafruit」を入力して検索します。

結果で出たライブラリをインストールしてください。

3.プログラム

プログラムを以下に示します。

#include <M5StickC.h>
#include <Wire.h>
#include "Adafruit_Sensor.h"
#include <Adafruit_BMP280.h>
#include <math.h>

Adafruit_BMP280 bmp;

int hosei = 0 ;

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:
  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");

  if (!bmp.begin(0x76)){  
      Serial.println("Could not find a valid BMP280 sensor, check wiring!");
      while (1);
  }
}

void loop() {
  // put your main code here, to run repeatedly:
    float temp, altitude, pressure;

    // 補正を行う ボタン処理は再考してください
    if ( digitalRead(M5_BUTTON_HOME) == LOW ) {
      // +補正
      hosei += 5 ;
    } else if (digitalRead(M5_BUTTON_RST) == LOW ) {
      // -補正
      hosei -= 5 ;
    }
    
    temp = (float)bmp.readTemperature();
    pressure = (float)bmp.readPressure() / 100;

    M5.Lcd.fillScreen(BLACK);
    M5.Lcd.setCursor(0, 0, 2);
    // M5.Lcd.printf("temp: %2.2f", temp);
    M5.Lcd.printf(" pressure: %4.0f hPa\r\n", pressure);

    altitude = getAltitude(temp, pressure) + hosei ; 
    M5.Lcd.printf(" altitude: %4.1f m\r\n", altitude);
    
    delay(1000);
}

気圧と高度を表示します。高度は、気圧から計算により取得しています。

また、現地の気圧が日によって違いますから、HOMEボタンとリセットボタンで補正できるようにしています。HOMEを押すと5m足され、リセットを押すと5m引かれます。ボタン処理は最低限のロジックで動かしているので、適度に修正してください。

4.動作結果

一番最初の画像のように、問題なく気圧を取得できて高度も表示できました。BMP280は「ENV II Hat」よりも安いので、気圧と温度を測るだけなら良い選択枝でしょう。

しかし「ENV II Hat」は磁気と湿度も測れますし、M5StickCの外装にピッタリと追加されますから、わざわざ自分で作るよりは買った方が良いと思います。

ちなみに、HATのサンプルのプログラムで動くのではとやってみましたが、動きませんでした。

また、BMP280のセンサーが転がっているという人もいらっしゃると思うので、「Proto Hat」を使って自作の環境HATを作ってみるのも良いでしょう。(そのうち作りたい)

5.BME280も使ってみた

4ピンの製品です

BME280センサーでもテストしてみました。プログラムでのBMP280との違いは、ライブラリに「Adafruit_BME280.h」を使っているところくらいです。BME280は湿度も測定できるので、表示できるようにしました。

#include <M5StickC.h>
#include <Wire.h>
#include "Adafruit_Sensor.h"
#include <Adafruit_BME280.h>
#include <math.h>

Adafruit_BME280 bme;

int hosei = 0 ;

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:
	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");

	if (!bme.begin(0x76)){  
		Serial.println("Could not find a valid BME280 sensor, check wiring!");
		while (1);
	}
}

void loop() {
	// put your main code here, to run repeatedly:
	float temp, altitude, pressure, humid;

	// 補正を行う ボタン処理は再考してください
	if ( digitalRead(M5_BUTTON_HOME) == LOW ) {
		// +補正
		hosei += 5 ;
	} else if (digitalRead(M5_BUTTON_RST) == LOW ) {
		// -補正
		hosei -= 5 ;
    }
    
	temp = (float)bme.readTemperature();
	pressure = (float)bme.readPressure() / 100;

	M5.Lcd.fillScreen(BLACK);
	M5.Lcd.setCursor(0, 0, 2);
	M5.Lcd.printf(" pressure: %4.0f hPa\r\n", pressure);

	altitude = getAltitude(temp, pressure) + hosei ; 
	M5.Lcd.printf(" altitude: %4.1f m\r\n", altitude);

	humid = (float)bme.readHumidity() ;
	M5.Lcd.printf(" humid: %3.2f \r\n", humid);
	    
	M5.Lcd.printf(" temp: %2.2f \r\n", temp);
	    
	delay(1000);
}

今のご時世に湿度は役に立つと思います。

ENV Hatもどきを作ってみた

Proto HatBME280を使って、ENV hatもどきを作ってみました。でも、ENV Hatよりも大きいし、ピンヘッダで固定されているだけなので、グラグラして実用には耐えませんね。素直にENV II Hatを買うべきでしょう。

また、氷点下20度の日に、温度測定をしてみましたが、M5StickCのバッテリーが寒さで上がってしまい、測定ができませんでした。センサー部は切り離すなどの工夫が必要です。

M5StickC ENV Hat III (SHT30/QMP6988)
スイッチサイエンス