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

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を作ってみるのも良いでしょう。(そのうち作りたい)