M5StickCで気圧(高度)を測る ~ BMP280/BME280を使う
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も使ってみた
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 HatとBME280を使って、ENV hatもどきを作ってみました。でも、ENV Hatよりも大きいし、ピンヘッダで固定されているだけなので、グラグラして実用には耐えませんね。素直にENV II Hatを買うべきでしょう。
また、氷点下20度の日に、温度測定をしてみましたが、M5StickCのバッテリーが寒さで上がってしまい、測定ができませんでした。センサー部は切り離すなどの工夫が必要です。