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ライブラリを書き換えれば良い。

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

【概要】

最低温度と最大温度を16倍された温度(小数部含む)で設定する。範囲外になるとフォールトが発生する。

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

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

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

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

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

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

【サンプル・スケッチ】

【更新情報】
2020-11-15
記述ミスによりがコンパイルできなくなっていたため修正。

2020-11-12
DRDYピンを利用できるよう改良してみた。DRDYピンを使うことで無駄な待ち時間を削除できる。と言ってもそこまで変換時間に拘る必要性があるかどうかは微妙な気も...

【ライブラリ】

【参照ライブラリ】
PT100(白金RTD)の抵抗値から温度へ変換するライブラリ
Arduino用のSPI/TWI共通インターフェース・クラスを作ってみた。