Raspberry Pi Zero Wで水槽の温度を測ってみた

■作成する動機

45㎝水槽から60cmに大きくするつもりでいろいろと改善したいことを積み上げていまして。
その中で水温をどのように測るかっていうところを考えていました。

今までも、水槽の中に入れてキスゴム(吸盤)で張り付けるものとか、水槽の外のガラスにくっつけて温度測定するものとかを使っていました。
室内なので温度変化は緩く、それほど気を付けなくてもよいとは思っていたのですが。
数日家を空けたり、気温の変化に従ってヒーターを購入、動作させるまでの間にちょっと遅れると体が小さい個体などはあっさりと死んでしまうので
警告機能があるといいなと思っていました。

ということで、IoT(今回は本来の意味でつかえてうれしい)の学習もかねてのRaspberry Piを購入して水温センサーをつなげ
VPSに導入済みのZabbixにつなげてみました。

■参考URL 同じことを考えている人のブログを見ながら具体的にやることを温めたり

600x450x450水槽購入 …とエンジニア的もくろみ
同様のこと…と言うか僕以上に色々考えられているブログ見つけました。
水量やPHはセンサーがあるかどうか探してみたいなと思います。
しかし、ラズパイもセンサーを取り付けるピンや電圧が限られているんじゃないかと、多機能タイプを作る不安があったので最初は単機能なものを作ってみます。


■Raspberry PiのOS的準備

まずはこちらのURLにてラズパイの準備をしてみました。
ラズパイで何かしたい!と思った人のためのまとめ!(1) Raspberry Pi 初級編

購入したのはスイッチサイエンスからで、初心者向けのスターターキットです。
HDMIのミニポート変換とか、microUSB – USB-Aへの変換、USBアダプタ、マイクロSDに入ったOSなどが入っていて、
キーボードとマウスがあればすぐにでも。(1つしかポートがないのでUSBハブがあると便利だと思います)
Raspberry Pi Zero W スターターキット(16GB版)


■温度センサーについて

次にこちらで紹介されていた「DS18B20」を使った防水式の温度センサーを購入しています。
第18回「ラズベリーパイで手作り温度計!」



赤=VCC(5v)
黒=GND
黄=GPIO4へ接続となってて、どのpinに接続したらよいか判断するのは簡単でした。

Raspberry Pi3 Model B  1-wire接続のデジタル温度センサー DS18B20を動かす(覚書

こちらにある通り、5~10kΩの抵抗をプルアップのためにVCC(赤)とGPIO(黄)の間に接続します。※今回はArduinoのスターターキットに入っていた10kΩを使用しています。
また、Raspberry Pi zero w もOSも最新だったためかmodprobeのコマンドを打つことなく、設定のダイアログだけで操作は完了しています。

もう一つ参考URL
5ドル!ラズパイ・ゼロ(Raspberry pi Zero)でIoT (16) ディジタル温度センサ1 1-Wire DS18B20 | 電子工作の環境向上
こちらも配線やライブラリについて詳細が乗っているので、「DS18B20」を利用したいという時に見ると素早く試せるのではないでしょうか。

■接続について

実際に接続した様子です。ケースは別途購入しています。(蓋は紛失していますが…)

表。ケースにいれたときにはこちらの面が出ます。見てわかる通り、かなり強引なプルアップ抵抗の付け方をしています。
Raspberry Piの基盤に直接差し込んでいるという…マネしないでもらったほうが良いかと思います。(自分に自信がない点です)


裏。はんだ付けしたところです。


電源ケーブルである、USBケーブルが足らなかったのでこんな宙づりの形です。

■温度をとるためのスクリプト

温度を取得するためにはファイルをcatで読んで2行目の=で区切られた2カラム目を取得したら事足りるようなのですが、bashだと小数点の計算をするためにbcというコマンドがあると便利だと調査したので、apt-getでbc、zabbix-agent(後述するzabbix-senderはこちらに同梱しているようでして)を入れました。

#!/bin/bash
 
scale=2
SERVER='*************'
ZBXHST='*************'
ZBXKEY='watertank_temp'
TEMP=$(tail -1 /sys/bus/w1/devices/28-0117c224f2ff/w1_slave | cut -d '=' -f 2)
TEMPC=$( echo "scale=3; ${TEMP} / 1000 " | /usr/bin/bc )
 
#echo ${TEMPC}
#exit
 
/usr/bin/zabbix_sender -z ${SERVER} -s ${ZBXHST} -k ${ZBXKEY} -o ${TEMPC}


※SERVERとホスト名は伏せてます。Zabbixトラッパーのアイテムを作ってそれに対して温度を投稿しています。


■温度のファイルを目視確認した様子。


root@raspberrypi:/home/pi# cat /sys/bus/w1/devices/28-0117c224f2ff/w1_slave 
99 01 4b 46 7f ff 0c 10 5a : crc=5a YES
99 01 4b 46 7f ff 0c 10 5a t=25562



どうも、このcrc=5aっていうところは値が正確かというパリティチェックの意味があるんじゃないかと思っています。これがNOの場合は取り込まないとかいう処理を作るべきかもしれないとは思いました。(でもやっていません)
HEXの部分をすべて無視して、t=5桁の数字っていう部分だけを取得し、1000で割った値をZabbixに入れています。

crcの計算があっているかどうかっていう判定はしていません。これも、Zabbixのほうで倍率をかければbcのインストールは不要ですし、処理量が減るので電力消費も微々たる差にはなると思いますが減少するかもしれません。

あとは下記の通り。別記事にするかもしれません。
■実際に取得できた値とグラフ
 → 25度前後だったので、手で握りしめて変化したものと、わきの下に挟んでみて、36度前後に変化した様子があります。

■DS18B20パラサイトモードについて
 → このチップを使った温度センサーには3線式の他に、2線で接続できるモードがありまして、それをパラサイトモードというのですが、おそらく検索したほうが詳細で最新の記事が出てくるかと思います。

■Zabbixのアイテムについて
 → Zabbix senderを使うにはZabbixトラッパーでアイテムを作る必要があるという点ですね。これも詳細解説しているサイトがたくさんあるので割愛しています。

■apt-getで導入したパッケージまとめ
 → 簡単に書いたものは記事の中にありますが、bcとzabbix-agentのパッケージだけでOKだったのがとても簡単で嬉しかったところです。息子に使わせてみたいなと思ったりしました。