自宅で近くの用水路で採集した野生の黒メダカを飼っています。飼ったきっかけは子供たちが小さな魚に興味を持っていたことと、インターネットでいろいろ見ると、いろんな魚や水草を使った自宅アクアリウムを作っていることもあり、自分も少しはかじってみたいな、と思ったことがきっかけです。
いつ飼い始めたのかはあまりよく覚えていないのですが、飼い始めたのは3、4年ぐらい前ですかね。その間にメダカからたくさんの卵もでき、子供もでき、少しずつ採集や知り合いに譲ったりして世代の新陳代謝を図っていますが、このブログを書いた時点でおそらく3世代ぐらいこの水槽で生きていると思います。
まあ、実際にメダカを飼ってみて、育て方とか含めてインターネットで調べていると、Raspberry PiやArduino等を使って水槽IoTをやられている方々が本当に多いんですね!メダカなど飼っている方は自分のようなIT屋さんが多いんでしょうか。
今回は少々以前(2019年頃だったかも)にやったRaspberry Pi + DS18B20の水温センサーを使って水槽用の水温計を作って、そのデータをサーバへ収集・グラフ化して日々の水温状況を監視することをやったので、その内容を備忘録として載せておきたいと思います。
用意したもの
- Raspberry Pi 3 Model B+
Wi-Fi、Bluetoothがついているバージョンです。
Raspberry Piであればどれでも動くと思います。水温計以外にもいろんな機能をつける予定があったので、水槽向けではRaspberry Pi 3 Mode B+にしました。購入はだいぶ前だったのですが、当時はHong Kongにある「Argon 40」というサイトで購入しました。もちろんamazonとか、他のサイトでも同じものが購入可能だと思います。
なお、今回思い返して配線に使用したラズパイはZero Wを使いました。
- Raspberry Pi Zero W
- 防水温度センサー(DS18B20)
防水パッケージ化されているプローブ形式、1Mのものを購入しました。当時はeBayが安かったので、eBayで購入しました。
他に購入したもの:
- 4.7kΩ抵抗
配線
今あるものと昔の記憶を呼び起こしてみました。
今回は以下のようにつなげています。
- 電源ピン(赤色) → 3.3V
- GNDピン(茶色) → GND
- Dataピン(白色) → GPIO4
4.7kΩの抵抗はVCCとDataピンとをプルアップ抵抗として繋ぎます。
ブレッドボードで組んだ配線としてはこんな感じになります。画像はZeroを使って配線しました。実際の水槽ではModel B+を使用していますが、こちらも同様にDataピンGPIO4を使用しています。
実装のポイント
Raspberry Piを使ってDS18B20センサーから値を取得するためには、Raspberry Pi上でいくつかの事前設定が必要になります。
「1-Wire」通信を有効にする
DS18B20は「1-Wire」通信でデータ転送を行います(「1-Wire」の詳細についてはこちらのWikipediaにて参照)。Raspberry Piにはこの「1-Wire」通信データを行うためのドライバーがあるため、この設定を有効化します。
有効化するためには、次のコマンドでconfig.txtを開きます。
$ sudo vi /boot/config.txt
開いた後、次の内容を追加します(最終行への追加で良いと思います)。
dtoverlay=w1-gpio,gpiopin=4,pullup=y
一度再起動し、完了後に「lsmod | grep w1」コマンドを実行し、次のような結果が出力されれば有効化できています。
$ lsmod | grep w1
w1_therm 16384 0
w1_gpio 16384 0
wire 45056 2 w1_gpio,w1_therm
$
デバイスIDの確認
デバイスIDはDS18B20のディレクトリの場所を確認することで取得します。
「ls /sys/bus/w1/devices/」のコマンドを実行することで取得ができます。DS18B20は頭が「28」で始まるものが該当します。この値はセンサー毎に異なります。
$ ls /sys/bus/w1/devices/
28-0517600709ff w1_bus_master1
$
シェルによる実行と値の取得
上記設定が完了後にシェルを実行して値を取得します。
以下はDS18B20から値を取得するサンプルです。環境変数で設定しているDEVIDは先ほどのコマンド実行で取得した「28」で始まる値になります。
#!/bin/sh
DEVID="28-0517600709ff"
echo `cat /sys/bus/w1/devices/$DEVID/w1_slave | perl -e 'while(<stdin>){ if(/t=([-0-9]+)/){print $1/1000,"\n";} }'`
実行結果:
$ ./get_value_ds18b20.sh
18.625
$
catコマンドで「w1_slave」自体の情報を直接確認した場合は次のような出力結果となります。
$ cat /sys/bus/w1/devices/28-0517600709ff/w1_slave
2e 01 4b 46 7f ff 0c 10 e4 : crc=e4 YES
2e 01 4b 46 7f ff 0c 10 e4 t=18875
$
この「t=18875」に該当する値がDS18B20で測定された温度になります。これは摂氏温度となり、1000倍表示となっていますので、catコマンド取得した結果から、後続のperlコマンド「perl -e ‘while(){ if(/t=([-0-9]+)/){print $1/1000,”\n”;} }’」を使って「t=」以降の文字列を抽出して小数桁2桁に数値化しています。
設定方法や取得方法については次のサイトを参考にさせていただきました(ありがとうございました)。
以上のように、水温計の値を定期的に収集して、サーバ等へアップロード、蓄積していくことで、時系列での水温状況を監視することができます。
実際にDS18B20センサーを設置している自宅の水槽です。時々センサーについたコケ掃除はしていますが、長いこと設置しているので、大分汚れていますね。
水温計設置 その後
メダカ水槽に水温計を設置して2年ほど経過しましたが、おおよそ季節ごとの水温の推移がDS18B20で確認できるようになりました。次のグラフはご参考までに、2020年の1年間で取得した水温データになります。
室内の環境にも影響するとは思いますが、そこまで水温が下がることはなさそうです。メダカは15℃〜30℃あたりが活発に泳ぐということですので、少なくとも自宅の水槽ではファンやヒーターを設置する必要はないかもしれませんね。
このブログを書いた2022年1月時点もセンサー自身は特に問題なく動いています。ただ、センサー自身は水槽の汚れによってコケがよく付着するので、こまめに掃除しておいたほうがよいと思います。
振り返り
水槽の水温が15°Cより下回ったり、逆に30°C以上になるようであれば、閾値をトリガーにしてファンを回すとか、ヒーターをつけるとかの仕組みを入れようと思っていましたが、特段その必要性はないようです。ただ、自身の興味のために、近いうちに、どこかのタイミングでトライしてみたいと思います。