テスト治具に温度計のファームウェアを組み込んでみました。センサは1-wireI/Fを持つDS18B20を使います。DS18B20による温度測定の具体例は検索すると山のように出てきますがだいたいがArduinoとかRaspberry Piのような市販CPUボードをホストとしてドライバも提供されたライブラリをそのまま使うお気楽な作例です。
ここではPICの1本のピンを入力/出力に切り替えながら 1-wireをドライブしたりレベルを読取る処理を手作りしました。なんやかんやあって測定された摂氏温度の直読値を取込み処理まで記述できました。出力フォーマットは2バイトで以下のような形式であるとマニュアルに書いてあります。
ところがレジスタ値を読み込んでみると室温でLSBYTEが0x2C~0x2D、MSBYTEが常に0でこれを小数点以下の4ビット分右シフトして温度に変換すると2℃になってしまい、いやそんな極寒の部屋にいるわけではないのですが・・・
1-wireという特殊なI/F、しかも手作りのドライバなので、タイミングや電圧レベルを徹底的に調べたのですが特に問題なし。そもそも温度レジスタ以外のスクラッチパッドは正常に読み書きできています。
しばらく悩んでふと、今回使った手持ちの部品が入っていた袋を見てみるとDS18S20、とあります。型番違うじゃん?
いやでも同じDS1820でサフィックスが違うだけだから許容誤差や変換速度が違うだけだろう・・と思ったのですが念のためDS18S20のデータシートを見てみると9ビット固定右詰で出力フォーマットが全く違います
これは一杯食わされました。0x2Cは右1ビットシフトで22℃ですからまぁ快適環境です。直読できるのは9ビットですが内部的には12ビット相当のA/D変換をしているようで残渣ビットから計算で分解能を上げられるとマニュアルにあるので0.1℃単位でLEDに表示するようにしました。
湯呑みの温度を測ってます。
ここでちょっと問題発生。温度測定ルーチンが数百msかかるのでLEDのダイナミックドライブと同じループ内に組み込むと表示がチラついたり桁ごとの輝度にバラつきが出てしまいます。ここではダイナミックドライブを1000回まわし、全桁ブランキングして温度変換、またダイナミックドライブに戻るという処理にしました。これで温度表示の時は全桁1秒周期くらいでブリンクしますが「温度を表示している」ことがわかりやすくなって良しとします