はじめての電気と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」です。画面をリロードすると、新しい温度が表示されます。