つづき
今回は応用編になります。
■中編
OneWireのサンプルプログラムは分解能12bit固定で温度アラームの設定は組まれていませんでした。
そこで今回はデータメモリ4byte目(設定レジスタ)に書き込みを行ってみようと思います。分解能に関しては読み取りスピードとの関係性も明らかとしていきます。アラーム設定に関しては設定後、実際に異常状態を作り出してアラームサーチを行っていきますね。
では、スタート!
設定レジスタ書き込み
書き込み方法
今回題材とするスケッチは基本的に中編でも紹介したOneWireベースのスケッチとなっており、このスケッチに機能を追加していく形を取りたいと思います。
OneWireライブラリのサンプルコードを載せた中編のリンクはこちらです ⇒ 中編
早速、設定レジスタの書き換え方法なのですがデータシートのフローチャートを参考にしていきましょう。
※該当するフローについて黄色いマーカーでハイライトにしています。
そして以下のプログラムをファミリーコード選択と温度変換コマンドの間(55行目)に入れてみて書き込んでみましょう。シリアルモニタを見ると書き換わっていることがわかると思います。設定レジスタの変更はこれだけでOKです!
1 2 3 4 5 6 |
"]ds.reset(); ds.select(addr); ds.write(0x4E); ds.write(B00011001);//上限アラームTH書き込み(25℃) ds.write(B11110110);//下限アラームTL書き込み(-10℃) ds.write(B00011111);//分解能設定(9bit) |
※紹介はしていませんがSKIP ROM [CCh]コマンドを書き込んだ上で設定レジスタ変更も可能です。
分解能と温度変換時間の考察
データシートにある様に高分解能になるほど変換時間を要することがわかりますよね。そして【実際に変換時間が足りずにROM書き込みを行ってしまった場合にどのような挙動を見せるのか】と実際に【分解能と温度変換待機時間のマトリクス】を作ってみて確認を行っていきたいと思います。
まず、温度変換待機時間が足りなかった場合です。例として12bitの分解能で100msの待機時間で試してみましょう。ここで言う温度変換待機時間というのはサンプルプログラム60行目のdelay(1000)にあたります。
結果から85℃固定となるようですね。なんでこのような結果になるかというとデータシートに答えが書いてありました。
*The power-on reset value of the temperature register is +85°C
つまり、温度レジスタのリセット値は+85℃になるという事でした。推測ですが、温度変換のコマンド44hを書き込むとまず温度レジスタがリセットされてその後に温度変換が行われレジスタに書き込まれるのではないか?そして今回は変換書き込み時間が十分に取れなかったためにリセット値(85℃)に固定されてしまったと考えます。
次の考察は分解能毎に温度変換待機時間を振ってみて正常に変換されるか否かを表にまとめていきます。
700ms | 600ms | 500ms | 400ms | 300ms | 200ms | 100ms | 90ms | 87ms | |
12bit | 〇 | ✕ | ✕ | ✕ | ✕ | ✕ | ✕ | ✕ | ✕ |
11bit | 〇 | 〇 | 〇 | 〇 | 〇 | ✕ | ✕ | ✕ | ✕ |
10bit | 〇 | 〇 | 〇 | 〇 | 〇 | 〇 | ✕ | ✕ | ✕ |
9bit | 〇 | 〇 | 〇 | 〇 | 〇 | 〇 | 〇 | 〇 | ✕ |
この結果からデータシートとほぼほぼ同じになりました。最速で温度変換を行いたい場合は9bit分解能で温度変換時間を88msですが余裕をもって使用しましょう!
アラームサーチをやってみる
先ほど設定レジスタの書き換えでアラーム上限下限温度を変更しましたね。せっかくなので、ALARM SEARCH [ECh]を使用してアラーム状態のデバイスを検出してみたいと思います。
と、言ってもかなり手探りです。この記事書きながらあーだこーだやっている状況です。
ヒントだと思ったのが、ライブラリのスクリプト中にある下記項目。これはOneWireライブラリ中のSerch関数【bool OneWire::search(uint8_t *newAddr, bool search_mode /* = true */)】の第二引数であるsearch_modeがfalseならALARM SEARCH [ECh]を実行するのではないか?という仮説。
という事でサンプルプログラムのds.serch(addr)の部分の第二引数をfalseにしてアラームサーチコマンドにしている、、、はず!
1 2 3 4 5 6 7 |
if ( !ds.search(addr, false)) {//true=F0, false=ECと推測する Serial.println("No more addresses."); Serial.println(); ds.reset_search(); delay(250); return; } |
<<検証手順>>
- バス上に2デバイスセット
- アラーム上限は25℃にセット
- デバイス2個をお湯の中に入れてアラーム検知状態にする。
- 片方を氷水に漬けてアラーム上限以下の温度にしてアラーム検知を外す。
シリアルモニターから氷水に漬けた一方のデバイスがアラーム検知から外れてサーチされなくなったのが分かりますでしょうか。一応引数をfalseにするとアラームサーチになる推測はあっていたようです。
おわりに
今回は応用編として、設定レジスタの書き換えや分解能毎の温度変換時間、アラームサーチ方法を明らかとしてきました。
とりあえずDS18B20デバイスの紹介はここまでとします。ほぼほぼ解説メインでつまんなかったと思いますので後日このデバイスを使った何かを作っていきたいと思っております。
今考えているのは、クリスマスが近いのでDS18B20を使用した水温管理によるおいしいローストビーフの作り方!なーんてどうでしょうか??
では今回はここまでで。
ではでは~
コメント