※記事内に商品プロモーションを含む場合があります
ストロベリー・リナックスに売っていた、放射温度計センサーを
気圧計に組み込むため、買ってきました。
【関連】赤外線温度センサ MLX90614
しかし、センサーの値段は2千円と他のセンサーに比べると高く
日本語の情報は殆ど無く、センサーに付属しているのも
英語の分厚いデータシート、なんと11枚!
一応SMBuS=I2Cで通信出来るので試してみました。
放射温度計センサMLX90614の接続方法
接続方法は1回ハマり、センサーを1つダメにしてしまいました。
このセンサーは金属ケースなのでリードに直接半田付けをすると
ショートするかもしれないので、小さく切った基板を挟むと安心です。
Arduinoならこの様に接続します。
【引用】Is it hot? Arduino + MLX90614 IR Thermometer
PICなら緑の線をSCL、青の線をSDAに接続します。
この図はセンサーを、表面(窓がある面)から見た図です。
放射温度計センサMLX90614をI2C通信してみる
まず、問題なのがスレーブアドレスが分からない点。
I2Cバスには複数のセンサーや液晶がぶら下がっているのでデバイスを選択するのに
スレーブアドレスが必須です。
ストロベリーリナックスにあるデータシートの7ページ目に
Slave Adress Factory default 5A、 0x5A との事なので、
書き込み時0x5A、読込時0x5Bでアクセスして下位バイトを液晶に表示させても
255(0xFF)と表示されれしまいます。
ちなみにI2CバスはSDA・SCL両方共プルアップされているので
デバイスが反応しない時はすべてのビットが立った状態、0xFFになります。
また、日本の方が書いた記事も無く本当の情報が無いです。
とそんな時見つけたのがこのサイト
Sensor de temperatura infrarrojo Melexis(スペイン語)
このサイトの情報を元に、
書き込み時のスレーブアドレス:0xB4、読込時:0xB5
で下位バイトを読んだら成功しました。
上のサイトには気温(℃)への変換のソースもあり、こちらも参考にしました。
センサーの出力はケルビンみたいです。
しかし、マイナス値になる冷凍庫などを測ると700度とか表示されるので
この当たりは要修正です。
このマイナス、符号反転の話は別の記事にしました。
【関連】XC8・C言語でfloat型の負の値を符号反転する方法
I2C通信はLPS331と似ていて、
スタートコンディション、スレーブアドレス0xB4を送信
0X07を送信
スタートコンディション、スレーブアドレス0xB5を送信
上位バイトを受信(ACKを返送)
下位バイトを受信(ACKを返送)
PECを受信(NACKを返送)
ストップコンディション
以上の通信で気温データの取得が出来ます。
データの変換は上のサイトを参考にして下さい。
まとめ
この放射温度計機能を付けてからPIC16F1827のプログラムメモリがやばくなってきました。
組み込んだ時点で95%とか。
表示を修正したりしたら、ついにコンパイルエラーが発生してしまい
どうもプログラムメモリをオーバーしてしまった様です。
XC8にはフリーの他に、有償のスタンダードとプロバージョンがありますが、
デジキーで見たらスタンダード版が6万円台、プロが13万円台と個人が趣味で使う
領域を超えています!
そこで、LPS331の気圧データを上中下と3回呼び出す時の処理を関数化したら
数%、プログラムメモリの削減できました。
後、ニッケル水素の充電処理と放射温度計のマイナス表示を追加をしましたが
プログラムメモリが99.7%となってしまいました。