mrubyで気圧を測ってみた


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

ネットを検索すると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サーバに問い合わせてローカルの時間を合わせています。

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

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

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

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

このセンサーは温度のadcを持っていますが、気圧の係数用のもので、気温を測定することはできないようです。

12時台に直射が入り込むところに置いたところこんなグラフになりました。気温が上がって気圧の数値が狂ってしまうためと思われれます。

MPL3115という製品もあってこちらは3V仕様ですが、MPL115は5Vでも使えてちょっと珍しいのですが、BMP180などに比べると一世代前という感じがします。