先日、取引先の方から「室温を測って記録したいという相談を受けたんだけど...」と、ちょっとした相談を受けました。
当然ながらRaspberry Piで測れるだろうなと思い、ちょっと調べてみたら、温度センサーはとても安価に手に入ることを知りました。
また、温度センサーをRaspberry Piに接続するという記事も山程出てきます。
これは面白そうだということで、パーツを買って組んでみました。
ネット上の情報を見る限りでは、温度センサーは、MAXIM社のDS18B20が良さそうです。
このデバイスは1-Wireという仕様で作られていて、信号線と給電を同じラインで行えるというものだそうです(通信していない間にデバイスないのコンデンサに蓄電する仕組みらしいです)。
Amazonでは、様々な業者から、このデバイスをプローブに組み込んだものが売られています。価格も数百円レベルです(業者によってかなりバラツキがあります)。一つだけ買うのもなんだし、といって十本単位で買うのもなんなので、3本セットを買いました。それでも千円しませんが...。
工作ですが、とりあえずRaspberry Pi用のユニバーサル基板を買い、これに端子台を取り付けて配線することにしました。
パーツは、気持ちばかりのパスコンと、信号線のプルアップ抵抗だけです。
プローブの信号戦は、GPIOの4番、5番、6番に配線しました。
OSはRaspbian Stretch with desktopを使います。
デスクトップ環境はなくても良いと思うのですが、初めて触る箇所もあって、ちょっと不安もあったので、最悪GUIでなんとかできるdesktop版を使用します。
色々調べると、RaspbianでGPIOの入出力を使用するには、
/boot/config.txt
に、GPIOに1-wireデバイスを接続したことを定義するだけのようです。
ということで、以下を追加しました。
dtoverlay=w1-gpio,gpiopin=4
dtoverlay=w1-gpio,gpiopin=5
dtoverlay=w1-gpio,gpiopin=6
そして、
sudo modprobe w1-gpio
sudo modprobe w1-therm
を実行します。
詳しく調べていませんが、OSレベルで1-Wireデバイスと通信するドライバーがLoadされるということでしょう。
なんと楽ちんなことでしょう。。
OSを再起動すると、
/sys/bus/w1/devices/
に、検出されたデバイスが並んでいます。
DS18B20は、28-xxxxxxxというディレクトリして表示されています。
xxxxxxxはデバイスIDだそうです。試しにプローブを接続する端子を変更しても、デバイスIDは変わりませんでした。
検出した温度は、
/sys/bus/w1/devices/28-xxxxxxxxxx/w1_slave
というファイルに入っています。
bb 00 4b 46 7f ff 0c 10 49 : crc=49 YES
bb 00 4b 46 7f ff 0c 10 49 t=11687
t=の後が温度です。
ということで、次のステップは、読み取った温度をデータベースに記録していきます。
ここはかっこよくPythonでプログラミング…というところなのでしょうが、Pythonはまったく知りません。
また、Webで履歴を表示する仕組みが作りたかったので、CakePHPでひっくりめて作ることにします。
温度測定の部分は、cronでCakePHPのShellコマンドを実行します。
温度データはデータベースに保存するのですが、一旦テンポラリファイルに書き出して、その後DBに書き込み、成功したらテンポラリファイルを削除するようにしました。
温度は、センサーの出力をそのまま書き込むようにして、Entityのgetterで摂氏温度に変換するようにします。
こんな感じです。
protected function _getTemperature( ) { // 小数点以下は一桁のみ $ret = intval( ($this->_properties['temperature'] / 100 ) + 0.5 ) / 10; return $ret; }
プローブは、PCサーバーの排気口、PCラックの下、ルータ(RTX810)の横に設置して、cronを使って10分間隔で温度を測り続け、結果をDB(MySQL)に保存し続けて、それをchart.jsでグラフ化してみたのが以下の図です。
PCサーバーの排気口の温度変化を見ると、僕の活動時間がよくわかります。
お昼頃に黒のラインが上昇していますが、これは窓から日差しが差し込んだためと思います。
次は人感センサーを設置してみます。
HC-SR501という赤外線センサー(人体赤外線感応モジュール)が数百円で売られています。こちらも、GPIOに接続するだけで使えるようです。
先日のユニバーサル基板にセンサーを接続しました。
こちらは、温度センサーのようにシリアル通信でデータを送出するとかではなく、検出の有無をHighレベルまたはLowレベルで返すだけです。そのため、専用のドライバーモジュールなどを読み込むことはしません。単にGPIOポートの読み込みを行うだけです。
echo 27 > /sys/class/gpio/export
echo "in" > /sys/class/gpio/gpio27/direction
上記のようにして、ポート27の使用を宣言して、入出力の方向を指定すればよいようです。
この設定は、OSを再起動するとクリアされるようなので、OSの起動時に上記を実行しなければならないようです。
ということで、上記の処理を
/etc/rc.local
に追記しました。
人感センサーは、パソコンのそばに設置して、パソコンの前に人がいるかを検出するようにしました。温度検出と同じく10分間隔で検出します。
上記のように、無事検出できました。
この手の工作は随分と久しぶりですが、なかなか楽しいです。Raspberry Pi工作にはまっている人が多いのがちょっとわかった実験でした。