13,270 views
この記事は最終更新から 2347日 が経過しています。
1. やりたいこと
「はじめてのラズパイ!」をメモして行きたい。この連載の最終目標は、
ラズパイで周期温度報告端末装置(WiFi経由)を作る
こと。
(91) 【連載1-1】初ラズパイ: 選定&入手編 では、ラズパイを入手した。
(92) 【連載1-2】初ラズパイ: WiFiで繋ぐ では、ラズパイに WiFi経由でSSH接続した。
今回は、ラズパイに温度センサーを接続し、温度値を読み取れるようにする。
2. センサーを選定
いろいろとネット上で情報収集した結果、以下の2点に絞られた。
1)DHT11
・温度に加えて湿度も計測できる。
・測定範囲は不明… (0℃ ~ 40℃ ?)
・精度は 25℃で ±2度
・センサーは 10℃ ~ 40℃ の範囲内に置けと…
参考情報
2)DS18B20+
・測定範囲は -55℃ ~ 125℃
・精度は -10℃~85℃の範囲で ±0.5℃、この範囲外は ±2℃
参考情報
そもそもの目的が
水道管凍結対策のための温度監視
なので、動作環境 10℃ ~ 40℃を謳っている上記1)はダメだ…
よって…
今回は、上記2)を購入することになる。
周辺デバイスを簡単に付け替えられるのも Raspberry Piの魅力なので、今後もし気になったデバイスが現れたらそれに交換してみよう。
3. センサー&パーツを調達
この手の物の購入は秋月さんと私の中では決まっている。
20年近く前に AKI-H8 を購入して以来、秋葉に寄っては模型のギアなどの小物をいろいろと買わせていただいている。
今回は以下の 4点を購入した。送料込みで 1,900円ほどのお買い物。
1) 温度センサー
2) ブレッドボード(45mm x 35mm, プルアップ抵抗を挟むために簡単な回路を実装)
3) ジャンパー線
4) 抵抗
4. やってみる
(1) 全部つなぐ。
Raspberry Pi Zeroの GPIOのピン配置は下図の通り。
https://www.raspberrypi.org/documentation/usage/gpio/README.md
使用する温度センサーデバイスのピン配置は下図の通り。
https://datasheets.maximintegrated.com/en/ds/DS18B20.pdf
参考 m(_ _)m
上図は BOTTOM VIEW (=デバイスを下側から眺めた図)であることに注意!
平たい面を正面から見たとき、左下の足が Pin#1である。
ピン番号を間違えないように!
今回はラズパイと温度センサーの間で以下の 3本の線を接続する。
1) RaspPi GPIO Pin#1 ~ DS18B20 Pin#3 VDD
2) RaspPi GPIO Pin#6 ~ DS18B20 Pin#1 GND
3) RaspPi GPIO Pin#7 ~ DS18B20 Pin#2 DQ
また、上記の温度センサーのデータシートでは「DQ端子は High-Z」すなわち ACTIVE LOW な信号線 と書かれているので、電源ラインから 4.7kΩのプルアップ抵抗を繋いで DQ信号線アイドル時の HIGH状態を維持する。このためブレッドボード上に簡単な回路を組んでラズパイと繋げた。
https://datasheets.maximintegrated.com/en/ds/DS18B20.pdf
実物はこんな感じで繋げた。
(2) ラズパイで 1-Wireを有効化する。
1-Wire とは、GNDと信号線 1本の合計 2本の線でデバイスを制御するプロトコル仕様だそうな。
Raspberry Piはこのバスプロトコルをサポートしているのだそうな。
1) /etc/modules を書き換える。
sudo vi /etc/modules
システム起動時に 1-Wireデバイス用のモジュールを読み込ませるため、以下を追加する。
w1-gpio w1-therm
2) /boot/config.txt を書き換える。
sudo vi /boot/config.txt
GPIO#4に対してラズパイ内蔵のプルアップ抵抗を有効にするため、以下を追加する。
dtoverlay=w1-gpio-pullup,gpiopin=4
3) ラズパイを再起動する。
sudo reboot
(3) 温度を参照する。
ラズパイによって 1-Wireデバイスが認識されると、システムディレクトリにその情報が出力される。
出力された温度情報を見てみる。
cat /sys/bus/w1/devices/28-0000086e3f47/w1_slave
こんな感じで出力される。
センサーが取得した温度値は 0.001℃単位で出力される。
上図の最終行の 20812 は 20.8℃と読めばよい。
実際にセンサーの近くに温度計を置いてみると…
だいたい同じ温度を示している。
水道管凍結監視目的であれば問題の無い精度だろう。(と期待している)
実際に外気温が氷点下になった頃に精度チェックをしてみよう。
(4) 温度値を整形する。
生データが 20812 であれば 20.8 と表示させたい。
Pythonで書くほどのものではないので、Shell Scriptで書いてみる。
#!/bin/sh TEMPFILE=/sys/bus/w1/devices/28-0000086e3f47/w1_slave TEMPRAW=`cat $TEMPFILE | grep -e "t=" | awk -F "t=" '{print $NF}'` TEMPDEG=`echo $TEMPRAW | awk '{printf("%.1f", $1 / 1000)}'` echo $TEMPDEG #end
℃で表示できた。
5. 所感
少々拍子抜けしてしまった…
・温度センサーデバイスを初期化し、
・ポーリング or 割り込みで温度値を取得し、
等々、I/O制御するいわゆる制御系プログラミングを想定していたのだが、1-Wireなるバス規格のおかげで楽々実装できてしまった。というかほぼ何もしていない…
組み込みプログラミングの楽しみは、別デバイスで遊ぶ時まで取っておこう。
次回 (94) 【連載1-4】初ラズパイ: 温度データをFTPで周期送信 へ続く…
6. 謝辞
こちらのページを参考にさせていただきました。
先人の出し惜しみない情報に感謝感謝です。ありがとうございます。 m(_ _)m
http://blog.livedoor.jp/victory7com/archives/33399310.html
https://qiita.com/masato/items/2d07d4bc8e66bf4e5ec1
http://deviceplus.jp/hobby/raspberrypi_entry_018/
http://denpa-shinbun.com/entry/raspberrypi-ds18b20
http://www.denshi.club/pc/raspi/5raspberry-pi-zeroiot161.html
https://qiita.com/MagurosanTeam/items/f76a65f7eb4e27d44b5f