はじめての電気とIoT (6) 1-Wireで温度測定 

新しくノードを追加するためにツールnpmをインストール

 2016年11月の時点では、Node-REDのノード・パレットには各種センサを搭載したSense HATしかありません。国内では高価です。ラズパイにエミュレータが入っているのですが、本物のセンサをつなぎたいところです。

 2016年11月時点Node-REDは0.15.2です。GUI上の設定メニューManage paletteでノードを追加できます。最初に起動したとき、メニューにManage paletteの項目は存在しません。ターミナルを起動し、次のツールnpmをインストールすると、右肩の設定メニューに現れます。

sudo apt-get install npm

 Node-REDを起動したときに、コンソールに次の命令も実行するように表示がでます。

sudo npm i -g npm@2.x

 これら二つを実行してからNode-REDを立ち上げ、フロー・エディタをPCから実行します。

http:// ラズパイのIPアドレス:1880/

 右肩の設定メニューにManage paletteがでます。

1-Wireの温度センサを追加

 左のノード・パレットにマキシム(旧ダラス・セミコンダクタ)のDS18B20を追加します。

 右肩の設定アイコンをクリックします。メニューにあるManage paletteを押すと、画面の左に「Nodes」と「Install」のタブが見えます。Installのタブを押し、検索のところに「DS18」と入れます。四つ見つかりました。

 その中で一番日付けの新しい「node-red-contrib-ds18b20-sensor」の横にあるinstallのボタンを押しました。インストールができたというメッセージが画面上部に出ました。Nodesのタブを見ると確認できました。

 Doneを押してManage paletteを終了します。画面左のノード・パレットにrpi-ds18b20ノードが追加されています。温度センサを利用する準備が整いました。

1-Wire温度センサDS18B20の仕様

 1-Wireは、名前のとおり、1本の信号線にセンサをつないでいきます。複数つないでいっても固有のアドレスを持っているので、それぞれのセンサを判別できます。

 DS18B20はディジタル・サーモ・メータと呼ばれ、電子工作に十分な仕様です。

  • 温度測定範囲:-55~+125℃
  • 精度:±0.5℃(-10~+85℃)
  • 設定可能な分解能:9~12ビット

 デフォルトの分解能は12ビットです。ビット数によって変換時間が異なり、12ビットでは750ms、9ビットでは約94msかかります。温度データは摂氏で読みだされます。トランジスタの外形をしたパッケージのピン配置は、表示面を上にしてGND、DQ、Vddです。

 電源の供給には2通りあります。二番目の方法はうまく動作しませんでした。

  • VddとGND間に3から5.5Vの電源をつなぐ
  • Vdd-GNDをショートしてグラウンドに、DQバスがHighの間に内部キャパシタに充電して動作する

 読みだした固有のコードは64ビットで構成されています。下8ビットは0x28というファミリ・コードで固定です。最上位の8ビットはCRCです。

DS18B20で温度測定

 温度センサDS18B20をラズパイのGPIOとを次のようにつなぎます。GPIO4を1-Wireの機能する端子として使うには、I2CやSPIの機能を使えるようにしたのと同様に、メニューからRaspberry Pi Configurationを立ち上げ、Interfacesのタブで、1-Wireの項目でEnableにチェックをしてリブートしておくことが必要です。

 ラズパイに電源を入れ、メニューからNode-REDを起動します。

 ノード・パレットからrpi-ds18b20ノードをワーク・スペースにドラッグ&ドロップします。

 設定するところは「Array」のチェック・ボックスだけです。センサが複数になったときにチェックします。

 injectノードをドラッグ&ドロップし、ダブルクリックで設定画面を出します。intervalを選び1秒間隔にします。

 debugノードもドラッグ&ドロップし、ダブルクリックで設定画面を出します。情報の表示を「complete msg object」にします。

  ノード名     用途

    inject  



1秒ごとに繰り返しを指示

    rpi-ds18b20  

1-wireセンサDS18B20

    debug  

センサ・データの加工結果の確認

 各ノードをつなぎ、Deployボタンを押します。右のdebugに温度が表示されます。表示されている文字は、msg.payloadと呼ばれるもので、ノード間を渡されてきます。

 DS18B20を並列にもう1個つなぎます。rpi-ds18b20の設定画面でArrayにチェックを入れます。Deployボタンを押します。

それぞれのデータを取り出す

 DS18B20が1個のとき、右のデバッグ画面に表示されたmsg.payloadの内容はつぎのとおりです。

{ "topic": "398A24070000", "payload": 21.187, "_msgid": "9ae6c166.65194", "family": "28", "file": "28-000007248a39" }

 "payload": 21.187 の「21.187」が温度です。debugノードの設定を次のように値だけ出力するように変更します。

 functionノードを途中に入れます。デフォルトのreturn msg;だけです。 そうすると、右のdebugエリアに温度データだけが表示されます。

 DS18B20が2個のとき、rpi-ds18b20ノードでArrayにチェックを入れます。 

 debugノードで、すべての情報を表示するに変更します。

 画面右のdebugエリアの状態です。

 右のデバッグ画面には、msg.payloadの内容はつぎのとおりです。インデントと改行を入れて整形しました。

{ "topic": "", "payload":
[
{
        "family": "28",
        "id": "398A24070000",
        "file": "28-000007248a39",
        "temp": 21.125
}, {
        "family": "28",
        "id": "046524070000",
        "file": "28-000007246504",
        "temp": 21.25
}
],
"_msgid": "7c7500f5.838b" }

 [ ] の中に二組のデータ・セットがあります。tempというキーワードがそれぞれにあります。最初の温度を取り出すには次のようにします。

msg.payload[0].temp

 配列の次のデータを取り出します。

msg.payload[1].temp

 具体的には、functionノードをもう一つ追加して、次の内容に変更します。どちらのセンサの処理かがわかるようにNameの欄にtemp0、temp1と入れました。

msg.payload = ("  0番="+msg.payload[0].temp+"℃");
return msg;

msg.payload = ("  1番="+msg.payload[1].temp+"℃");
return msg;

出力先をWebに

 複数の1-wireセンサの出力を取り出す方法がわかったので、Webブラウザに出力を表示するように変更します。

 ノード・パレットのinputからhttpノードをドラッグ&ドロップして、ダブルクリックで設定画面をだします。/ondoというディレクトリを作ります。rpi-ds18b20ノードの入力につなげます。この指定により、温度の表示がされるURLになります。

 ノード・パレットからfunctionノードを追加して、javascriptを次のように変更します。<br />はHTMLの改行指示のタグです。Name欄には「Web-temp」と入れました。

msg.payload = "温度計1:"+ msg.payload[0].temp+"℃<br />"+"温度計2:"+ msg.payload[1].temp+"℃";
return msg;

 ノード・パレットのoutputからhttp responseノードを追加します。内容は変更しません。

 rpi-ds18b20ノードの出力を新しく作ったfunctionノードへつなぎ、その出力をhttp responseノードへつなぎます。Deployします。

 Webを見ます。URLは「http://ラズパイのIPアドレス:1880/ondo」です。画面をリロードすると、新しい温度が表示されます。