1wireデバイスDS18B20の紹介と水温測定デモ@中編

Arduino

前回の続き

こんにちは!くろべこです。

今回は実際にArduinoに書き込んでいきたいと思います。と言っても接続は2線のみでスケッチもOneWireライブラリのサンプルを参考にしていきます。

■前編

1wireデバイスDS18B20の紹介と水温測定デモ@前編
珍しい1WireデバイスDS18B20で水温計を作る前編です。前編では仕様、レジスタ構成、回路接続例などDS18B20についてがっつり掘り下げていきたいと思います。中編、後編では実装を行い、その応用と続きたいと思います。

うわー手抜き、、、と思うかもしれませんが、スケッチの解説はできるだけ丁寧に行っていきますね。

配線

今回はデモなのでArduino_unoを使っていきます。

また、冒頭でも述べましたが今回は通信線での電源供給で接続するために2線のみを使用してVCC線はGNDに落とします。

スケッチ

スケッチ全体

OneWireのサンプルコードそのままですね。単純に温度だけ計りたいよって方はこのこのコードを使用すればいいと思います。バスラインに複数並列に接続すれば自動的にシリアルNoを検索してくれて値を表示してくれます。

ちょっと解説

これ以降はスケッチの解説になります。

①通信線の定義

カッコ内にArduinoのIOピンNoを入れるだけです。それ以上でもそれ以下でもありません。

②バスラインに接続されているDS18B20のサーチ

ds.search(addr)はバスラインに接続されているスレーブをサーチする。デバイスが存在する場合は1を返す。ここのスケッチではデバイスが存在する場合はaddrにROMデータを書き込む。0(デバイスが存在しない)の場合は「デバイスがないよ」と教えてくれて以下の処理を実行しないで戻す動作をします。

③ROMデータを16進数でシリアル表示する

④ROM読み取りのCRCチェック

ROMメモリの上位8ビットに格納されているCRC(ROMコードの56bit分より計算される)とCRC生成式より算出した値を比較しROMの読み取りに誤りがないか確認を行う(ライブラリが行ってくれてます感謝!)

ROMメモリ0byte目に格納されているファミリーコードで使用チップの種類を判断する。

⑥温度変換処理

ROMコマンドF0(サーチROM)を行ったので処理シーケンスは一旦リセットされるのでまず初期化を行い、その後ライブラリのコマンドds.select(addr)を行っている。これはROMコマンドMATCH ROM(55h)に該当し特定のスレーブとの通信を可能とする。そしてファンクションコマンド44hを書き込むことで温度変換を行っている。44hに続く1の意味はROM書き込み中の電源供給だと思う。通信線による電源供給をしている場合にROM書き込み時は通信線をプルアップし続けなくてはいけないが、外部電源を使用している場合は不要と思う。たぶん。末尾のディレイは変換時間を考慮したものだと思う。このスケッチはデフォルトの分解能12bitを使用しているので750ms最大変換時間がかかる。もし9bitの分解能であればここはdelay(100)でも多分OK。

⑦データメモリの読み込み

まず処理シーケンス通りに初期化⇒ROMコマンド(55h)を行っている。その後、データメモリ読み取り(BEh)の書き込みを1byteずつ行って0byte~9byteのデータをdata配列に格納しているだけ。

⑧データ読み取りのCRCチェック

ROM読み取りと同様にデータメモリ8byte目に格納されているCRCと算出CRCを比較して読み取りの誤りを確認している。

⑨摂氏・華氏変換

温度の上下byteを16bitのintに統合してチップごとの処理や分解能の処理を行って華氏・摂氏の変換処理を行っています。詳細の説明は以下のPDFにまとめました。

摂氏・華氏温度変換説明

実装

と言っても上記のスケッチを確認してシリアルモニタで確認するのみです。

個人的にですがbit表示の方がわかりやすいのでデータメモリはbit表示にしています。

また、分解能は10bit(0.25℃)にしています。分解能の変更方法やアラーム温度の設定は後編で説明したいと思います。

おわりに

いかがだったでしょうか?今回はDS18B20を使用した水温検知を行いました。次の応用編ではデータメモリへの設定の書き込みや分解能毎の温度変換スピードの変更、バスラインに複数のDS18B20を接続したりしてみたいと思います。

ではでは~

コメント

タイトルとURLをコピーしました