■今作っているデバイスは、室内環境モニターに気温、室温、気圧センサを乗せる。湿度センサはDHT111、気圧センサはMPL1151A1。前回の湿度センサはTDKのアナログセンサで感度は良いようなのだけど、高い。DHT111は中国製でデジタルで、価格はTDKの10分の1。いわゆる1-wireのセンサで安いのだけど、温度と湿度のセンシングが今ひとつな感じ。温度センサはまた別に載せるとして、気圧センサはまた比較的安いフリースケールのMPL1151A1を使ってみた。
SPIインターフェースでI2Cに比べるとシンプルなのが好感なのだけど、使ってみて解ったことは、このセンサ、計測値を規定の単位系で返してくれるのではなくて、プロセッサ側で計算しなければならないのだった。
しかも計算が結構面倒。
アナログの温度と湿度の値を、センサに内臓あれた補正値を使って計算して気圧(hPa)に変換するのだけど、補正用パラメータが4つあり、2進の少数点を扱わなければならず、その手の計算ライブラリをそろえていないので面倒なことになった。
厄介だったのは4つある補正値の桁が揃っていないことだった。補正値はa0, b1, b2, c12で、それぞれ、符号付15(3)、符号付15(13)、符号付15(14)、符号付13(13)。またc12についてはビット数も他に比べて2つ少なく、かつ、小数点以下10位(ただし2の累乗で)にオフセットされている。
それらを使って加減乗除しなければならないというのはちょっと悪夢めいていた。
桁がずれたままだと計算処理が面倒になるので、singed longで読み込んだ後に桁をそろえた。小数点以下が最も大きいのはc12なので、これに小数点を合わせると、小数点以下22桁(2の累乗で)、整数部12桁(2の累乗で)で、符号付の固定小数点変数が揃うことになる。
固定小数点にするとfloatやdoubleなどを使わずとも計算できるのが有利なのだけど、ただし、a0の桁が(2進で)35となり、longでは収まらず、long long型になる。floatやdoubleに比べると格納ビット数の面で有利なのだけど、面倒なことは面倒だった。
とりあえず計算部と、計算結果の10進変換表示部はできあがったのだけど、どうにもやっつけで、整理しないと使いまわしができない。そのあたりのモジュールは整理したあと、ライブラリにするつもりです。