Edited at

mrubyで気圧を測ってみた

蟹さんでI2Cが使えるようになったので、手元にあったFreescale社製のMPL115A2を試してみました。MPL115A2は以前秋月電子で購入しましたが、現在は販売されていないようです。SPIの方はまだ取り扱っているようです。

I-04596.JPG

ネットを検索するとMPL115A2のページはたいていfloatで計算していますが、蟹さんはmrubyをMRB_WITHOUT_FLOATでビルドしてlibmをリンクしていないのでfloatが使えません。

いろいろ調べてみたところ、アプリケーションノート How to Implement the Freescale MPL115A Digital Barometer AN3785(Rev 6, 6/2012)の最後の方にfloatを使わないCコードがありました。これをmrubyにポートしてみました。

流れはこんな感じです。Cのコードではshortからintの変換で係数値の符号を移しているのですが、16ビットの半分越えてたらマイナスにするコードを入れてあります。

def calculatePCompShort(padc, tadc, a0, b1, b2, c12)

if a0 >= 0x8000 then
a0 = a0 - 0x10000
end
if b1 >= 0x8000 then
b1 = b1 - 0x10000
end
if b2 >= 0x8000 then
b2 = b2 - 0x10000
end
if c12 >= 0x8000 then
c12 = c12 - 0x10000
end
padc = padc >> 6
tadc = tadc >> 6
c12x2 = (c12 * tadc) >> 11
a1 = b1 + c12x2;
a1x1 = a1 * padc
y1 = (a0 << 10) + a1x1
a2x2 = (b2 * tadc) >> 1
pcomp = (y1 + a2x2) >> 9
return pcomp
end

a0 = rtl.i2cread(MPLADDR, 0x04) << 8 | rtl.i2cread(MPLADDR, 0x05)
b1 = rtl.i2cread(MPLADDR, 0x06) << 8 | rtl.i2cread(MPLADDR, 0x07)
b2 = rtl.i2cread(MPLADDR, 0x08) << 8 | rtl.i2cread(MPLADDR, 0x09)
c12 = rtl.i2cread(MPLADDR, 0x0a) << 8 | rtl.i2cread(MPLADDR, 0x0b)

rtl.i2cwrite(MPLADDR, 0x12, 0x00)

padc = rtl.i2cread(MPLADDR, 0x00) << 8 | rtl.i2cread(MPLADDR, 0x01)
tadc = rtl.i2cread(MPLADDR, 0x02) << 8 | rtl.i2cread(MPLADDR, 0x03)

pcomp = calculatePCompShort(padc, tadc, a0, b1, b2, c12)
pressure = ((pcomp * 1041) >> 14) + 800

kpa = (pressure >> 4).to_s + "." + (((pressure & 0xf) * 1000) / 16).to_s

hPaではなくてkPaなんでちょっと分かりにくいですが、float無しに処理できます。

ThingSpeakに投げるようにしてみました。実際のコードはmpl115a2.rbというファイルでrtlbm-mrubyのsamplesの下に入れてあります。

https(TSL)では証明書の有効期間をチェックするために現在の時間が必要で、上のスクリプトではrtl.sntp(ntpaddr)とntpサーバに問い合わせてローカルの時間を合わせています。

スクリーンショット(2018-04-18 15.50.32).png

MATLAB Visualizationsでグラフ化してみたところいくつか異常値がはいっていておそらくI2Cの読み取りエラーと思われます。とりあえずMATLABで異常値を省いてグラフ化してみました。

スクリーンショット(2018-04-19 11.22.37).png

同じ時間帯の気象庁のデータをMjoGraphでグラフ化してみました。

graph.png

気象庁のデーターは海面気圧で、蟹さんが拾ってるのは実測値なので、数値は違いますが、傾向は一致しているようなので、大きく間違えている事はないと思われます。

自分のところのMPL115A2は電源投入後すぐは、ちょっと低めの数字になってしまうような傾向があるようです。1時間くらいすれば安定するようです。

気温は以下の式で求められるようです。

temp=25-((tadc-472)*100)/535;