またまた錯綜している情報のまとめみたいな感じ
MS5607 (MS56xxシリーズ) には色々なライブラリがあるようで、色々検索して試してみたがどれも上手く動かなかった・・・
そんなときにライブラリのアップデート通知が来た。
「あれ?もしかしてここ(ライブラリマネージャ)で検索すれば出てくるんじゃね・・・?」
・
・
・
ビンゴ!!!
Schm1tz 様 がArduino向けに MS5xxx シリーズのライブラリ を作って下さってました。
(今思うと色々探してた時点でGitHubから直接落として確かめたりしたはずだったと思うんだけど、何がいけなかったんだろう…。)
早速 インストール&インクルード して下記のコードをテスト。
#include <Wire.h> #include <MS5xxx.h> MS5xxx sensor(&Wire); void setup() { Serial.begin(9600); if (sensor.connect() > 0) { // MS5607との接続失敗時 Serial.println("Error connecting..."); delay(500); setup(); // 接続再試行 } } void loop() { sensor.ReadProm(); // 通信 sensor.Readout(); // データ更新 float temp = sensor.GetTemp() / 100.0; float pres = sensor.GetPres() / 100.0; Serial.print("Temperature [C]: "); Serial.println(temp); Serial.print("Pressure [hPa]: "); Serial.println(pres); Serial.println("---"); delay(5000); // 5秒ごとに更新 }
おぉ、それっぽいデータが返ってくる!
このライブラリには高度を計算する関数は含まれていないようなので、こちらのサイト と 専門の方(多分)が残してくださったコメント13番 を参考に、標高を求めてみる。
#include <math.h> // pow関数を使うので一応 #include <Wire.h> #include <MS5xxx.h> MS5xxx sensor(&Wire); void setup() { Serial.begin(9600); if (sensor.connect() > 0) { Serial.println("Error connecting..."); delay(500); setup(); } } void loop() { sensor.ReadProm(); sensor.Readout(); float temp = sensor.GetTemp() / 100; float pres = sensor.GetPres() / 100; Serial.print("Temperature [C]: "); Serial.println(temp); Serial.print("Pressure [hPa]: "); Serial.println(pres); Serial.print("Height [m]: "); Serial.println(getHeight(temp, pres)); Serial.println("---"); delay(5000); } float getHeight(float temperature, float pressure) { // http://keisan.casio.jp/exec/system/1257609530 と そのコメント13 より // P0: 海面気圧, P: 気圧, T: 気温(摂氏) // h = (1013.25/P0)^(1/5.256) * ((P0/P)^(1/5.256)-1) * (T+273.15) / 0.0065 return pow(1013.25/1013.25, 1/5.256) * ( pow(1013.25/pressure, 1/5.256) - 1.0 ) * (temperature + 273.15) / 0.0065; }
シリアルモニタには 450m くらいと表示されているが、現在地の標高は大体 30m くらいなので、これはちとおかしい。
getHeight関数を見れば明らかだが、P0 = 1013.25 で計算している。
P0 =海面気圧 は毎日変わっているため、標準気圧 1013.25 では正しい標高は求められない。
現在の気圧を 気象庁のアメダス から拾ってきて修正してみる。
1時間ごとに更新されているので、なるべく新しいもので試してみる。
標高取得部に引数として盗って取ってきたデータを渡し、
Serial.print("Height [m]: "); Serial.println(getHeight(temp, pres, /* 取得したデータ */));
getHeight関数を以下のように変更する。
float getHeight(float temperature, float pressure) { return getHeight(temperature, pressure, 1013.25); } float getHeight(float temperature, float pressure, float sPressure) { return pow(1013.25/sPressure, 1/5.256) * ( pow(sPressure/pressure, 1/5.256) - 1.0 ) * (temperature + 273.15) / 0.0065; }
おぉ!正しそうなデータが返ってきた!
一応、引数の数の異なる同じ名前の関数を呼び出したときに、標準気圧のデータを出すようにしている。(単純にさっきのと比較したかっただけ)
ただ、残念ながら標高を正確に測定するツールを持ち合わせていないので、この値がデータシート通りの精度を持っているかどうかは不明。
また、数時間ごとに海面気圧を拾ってきて補正する必要があるので、Arduino と MS5607 のみで使うのはあまり現実的でないかも。
携帯して使いたいという方は、
ESP-WROOM2 とかで直接データを引っ張ってくるなり(ESP-WROOM2 と MS5607、直接通信させられるんだろうか?)、
Bluetoothモジュール でケータイと連携させるなり、
ボタンか何かで補正値を入力 できるようにするといいと思いますw(雑
(※注: MS5607モジュールは借り物だったので現在は手元にありません。誰か買って!)
余談
上昇していくエレベーターの中でこの数値が上がっていくのを見ていたら、テンションも上昇していきました()
追記:
GitHubにCRCチェック関数を含めたスケッチをアップロードしました。参考程度にご利用下さい(^^)/
https://github.com/S2KTS/Using-MS5607-with-Arduino/blob/master/Test.ino
参考:
https://github.com/Schm1tz1/arduino-ms5xxx