MAX31865(PT100)ライブラリを作ってみた。

MAX31865と言えば互換(パクリ?)モジュールも沢山でているAdafruitが有名だ。

Adafruit PT100 RTD Temperature Sensor Amplifier – MAX31865

有名すぎてほぼ一択みたいな感じになってる感もあるが、肝心のソフトウェアがイマイチである。他にも公開されてる物がそれなりにあるが、どれもこれもなんとなくスッキリしない。

個人の感想でしかないので全否定するつもりもないし設計通りには動作するのだろうが...何がイマイチなのかは次の通り。

・無駄な処理が多すぎる。⇒恐らく実行時間の半分は無駄な時間。
・デバイスの機能をそのままライブラリ化してるだけ。⇒使いやすいとは言えない。
・浮動小数点演算を多用している。⇒非力なMPUに適さない。
・温度を取得する度に合計75msものdelay()を実行している。⇒他の処理と並行できない。
・連続変換モードに対応できていない。⇒なぜ?

Adafruitのライブラリはとりあえず動作検証はできまっせ的なレベルのものが多いように感じる。恐らく組み込み系の経験があまりないPC系メインの外注さんに作らせているのかな。組み込み系のエンジニアならああいう感じのコードは書かないと思う。という私もPC系のほうが長くて組み込み系なんて数年?程度の経験しかないのであまり人のことは言えませんが...(-_-;)

とはいえ、何もないよりはましなので感謝は忘れずに。ですね。

【仕様】
・温度センサー … PT100専用
・温度計測範囲 … 約-30~300℃

※温度計測時にフォールト検出も行う。フォールト中は温度計測は行われず、温度計測中にフォールトになった場合はフォールト解除後に温度計測が再開される。

※本ライブラリはSPIBUSライブラリ経由で動作する。Arduino標準のSPIライブラリ用に実装してある。仕様の異なる他のSPIライブラリを使いたい場合は、SPIBUSライブラリを書き換えれば良い。

※MAX31865のDRDY信号は変換完了判定に使えるのだがデータシートの説明と実際の動作に違いがあることや使うメリットがあまりなさそうように思えたため使っていない。
しかし、動作が異なる点は奇妙だ。アマゾンで購入した互換中華モジュールなので、もしかしてMAX31865自体も互換チップ?なんてことあるのかなぁ...(-_-;)

購入したのはこれ⇒PT100〜PT1000 MAX31865 RTD プラチナ抵抗温度検出器熱電対センサーアンプモジュール

【概要】

最大値と最低値をADCの値で指定する。このままだとどういう値を指定すれば良いのかわかりにくい...temperature()が返す温度を検査したほうがベターだと思う。たぶん誰も使わないだろうと思うのでこのままにしておく。(笑)

ワンショット変換を実行する。戻り値がtrueならtemperatute()で温度が取得でき、falseならstatus()でフォールトの原因を調べることが出来る。

連続変換モードを開始する。

連続(或いはワンショット)変換モードを停止する。vbiasにfalseを指定するとほんの気持ちだけ省電力化(約0.5mA程度)できる。

計測した温度を取得する。温度は16倍されていることに注意すべし。

検出したフォールト・ステータスを取得する。

連続変換モードを処理する。戻り値は次の通り。
MAX31865_STATUS_IDLE … 停止中。
MAX31865_STATUS_BUSY … 計測中
MAX31865_STATUS_READY … 計測完了。temperature()で温度を取得できる。
MAX31865_STATUS_FAULT … フォールト発生。status()でフォールト・ステータスを取得できる。

【サンプル・スケッチ】

【ライブラリ】

【参照ライブラリ】
PT100(白金RTD)の抵抗値から温度へ変換するライブラリ