水耕栽培なので夏になると栽培容器の水温が心配、水温が上昇して30度を超えてしまうと、野菜が枯れてしまいそうなので各栽培容器の水温を測ることにしました。
栽培容器は現在15個くらいありますが、とりあえずセンサーを6個つけてそのうち1個は一番下の水槽の水温を測りました。栽培容器の水温は15個中5個ほど計測します。
センサーで水温を計測して、ラズパイのInfluxDBに保存・Grafanaでグラフ表示してみます。
ラズパイ構築やInfluxDB・Grafanaの使い方インストールは以下の別サイトを参考にしてください。
Raspi・InfluxDB・Grafanaのシステムを構築するまではちょっと面倒ですが後々楽しいのでぜひ挑戦してみてくださいね。
防水ds18b20センサーを使って水温計測
水温センサーに防水仕様のds18b20プローブがあるというので、買ってみました。
アマゾンにも売ってるけどebayのほうが安い
10本入で13ドル弱でした。↓ここで10本買ってみました。
もしくは、今考えるとモジュール付きのやつのほうが安定した計測ができるのかもしれません。↓
アマゾンにも売ってますが、5個セットで1000円~なのでちょっと割高で同じ中国から送られて来るのならばebayで買ったほうが良い気がしたのでebayにしました。
そして、あとで気がついたのですが、抵抗も必要とのことでこれもebayで買いました。0.99ドルでした。
ds18b20水温センサー配線
ラズパイでの配線方法などは以下のサイトを参考にさせていただきました。
ds18b20の配線は以下のようになっています。
線の色 | 役割 |
---|---|
赤 | VCC |
黄 | データ |
黒 | GND |
防水のds18b20センサー6個を以下のように配線しました。わかりやすくFritzingでかけなかったので3つだけ表示させています。↓
ds18b20センサーの赤と黒ケーブルをGNDに配線して、黄色を4.7KΩの抵抗を通して3.3Vにつなげました。黄色ケーブルはさらにGPIO4に接続しました。
実際にはこんな感じにした。↓ 3Dプリンタで簡易ケースを作って磁石で棚板の裏にくっつけました。
先は栽培容器の水の中に入れます。↓
ラズパイ全体は・・・かなりたくさんのパーツを付けてしまったので見にくくてすみません、赤枠の左側が上画像の回路、ラズパイには赤枠真ん中のように接続しました。
ちなみにラズパイ本体はほぼ隠れてしまっていますが水色枠のです。GPIOがたくさんさせるようにPHAT STACKを経由して接続しています。
PHAT STACKは上画像赤枠のGPIOをたくさんさせるハットです。ちなみに右側の緑色の基盤はUPS(無停電電源装置)というよりラズパイに電力が行かなくなったら安全にシャットダウンしてくれるmopi2です。後ほど紹介していきます。
ラズパイ設定
ラズパイで1-Wireをオンにする設定が必要です。
raspi-configで1-wireを有効にする
$ sudo raspi-config
以下のような画面になる。
config.txtを編集
黄色のケーブルをGPIO4にしました。
$ sudo vim /boot/config.txt dtoverlay=w1-gpio,pullup=on,gpiopin=4 #変更する $ sudo reboot
動くかどうかテストしてみる
設定完了したのでテストします。以下、デバイスが無い場合。
$ cd /sys/bus/w1/devices/ $ ls -al 合計 0 drwxr-xr-x 2 root root 0 2月 28 16:00 . drwxr-xr-x 4 root root 0 2月 28 16:00 .. lrwxrwxrwx 1 root root 0 2月 28 16:02 00-400000400004 -> ../../../devices/w1_bus_master1/00-400000400004 lrwxrwxrwx 1 root root 0 2月 28 16:02 00-800000000000 -> ../../../devices/w1_bus_master1/00-800000000000 lrwxrwxrwx 1 root root 0 2月 28 16:00 w1_bus_master1 -> ../../../devices/w1_bus_master1 $ ls w1_bus_master1 00-200000400004 w1_master_add w1_master_remove 00-a00000400004 w1_master_attempts w1_master_search driver w1_master_max_slave_count w1_master_slave_count power w1_master_name w1_master_slaves subsystem w1_master_pointer w1_master_timeout uevent w1_master_pullup w1_master_timeout_us
センサーがある場合は以下のように「28-011437dd46aa」などとディレクトリができる♪
$ ls -al 合計 0 drwxr-xr-x 2 root root 0 3月 15 15:16 . drwxr-xr-x 4 root root 0 3月 15 14:57 .. lrwxrwxrwx 1 root root 0 3月 15 15:17 28-011437dd46aa -> ../../../devices/w1_bus_master1/28-011437dd46aa lrwxrwxrwx 1 root root 0 3月 15 14:57 w1_bus_master1 -> ../../../devices/w1_bus_master1 $ cat 28-011437dd46aa/w1_slave 00 00 00 00 00 00 00 00 00 : crc=00 NO 00 00 00 00 00 00 00 00 00 t=0
うまく表示されない場合はlsmodで1-Wireが認識されているかチェックしてみる。↓
$ lsmod | grep w1 w1_therm 16384 0 w1_gpio 16384 0 wire 40960 2 w1_gpio,w1_therm
同じGPIOに6本つなげる
1-Wireは同じGPIOに何個もつなげて良いようなので6個一緒のところにつなげる。
6本つなげたらこうなった。「28-・・・」が6個あるのでコピーしておく。
$ ls /sys/bus/w1/devices 00-800000000000 28-011437ef5daa 28-0114380e63aa 28-02131af2c8aa 28-011437996daa 28-01143805afaa 28-01143836b3aa w1_bus_master1
いくつか反応しなくなるときがある。w1_slaveの中身をみてみる。85000とデフォルト値?反応してない。センサーを温めたりしたら反応する時もあるけど無反応のときがほとんど。
t=85000で反応してない↓
$ cat /sys/bus/w1/devices/28-011437996daa/w1_slave 50 05 4b 46 7f ff 0c 10 1c : crc=1c YES 50 05 4b 46 7f ff 0c 10 1c t=85000 $ cat /sys/bus/w1/devices/28-01143805afaa/w1_slave 50 05 4b 46 7f ff 0c 10 1c : crc=1c YES 50 05 4b 46 7f ff 0c 10 1c t=85000 # t=20437で水温2.04度と正常 $ cat /sys/bus/w1/devices/28-01143836b3aa/w1_slave 47 01 4b 46 7f ff 0c 10 6c : crc=6c YES 47 01 4b 46 7f ff 0c 10 6c t=20437
どうやらMax4本だと?安定して計測できるみたい。
pythonで水温計測値をInfluxDBに投げる
以下のようなPythonスクリプトを作ってInfluxDBに取得した水温データを投げてみました。
#!/usr/bin/env python # -*- coding: utf-8 -*- import binascii import base64 import requests from bluepy.btle import UUID, Peripheral, ADDR_TYPE_PUBLIC, DefaultDelegate from influxdb import InfluxDBClient client = InfluxDBClient(host='localhost', port=8086, username='root', password='xxxx', database='sensor') measurement = 'air5' sensor_dict = {} sensor_dict["28-011437ef5daa"] = "leaf-ds18b20-1" sensor_dict["28-0114380e63aa"] = "leaf-ds18b20-2" sensor_dict["28-02131af2c8aa"] = "leaf-ds18b20-3" sensor_dict["28-011437996daa"] = "leaf-ds18b20-4" sensor_dict["28-01143805afaa"] = "leaf-ds18b20-5" sensor_dict["28-01143836b3aa"] = "leaf-ds18b20-6" import sys import subprocess ERR_VAL = 85000 def main(key): res = get_water_temp(key) if res is not None: temp_val = res.split("=") if temp_val[-1] == ERR_VAL: print "Got value:85000. Circuit is ok, but something wrong happens..." sys.exit(1) temp_val = round(float(temp_val[-1]) / 1000, 1) #print temp_val json_body = [ { 'measurement': measurement, 'tags': {'place': value,'host': 'raspi3B+'}, 'fields': {'wtemp': temp_val } } ] #client.write_points(json_body) print(json_body) else: print "cannot read the value." sys.exit(1) def get_water_temp(key): try: res = subprocess.check_output(["cat", "/sys/bus/w1/devices/" + key + "/w1_slave"]) return res except: return None for key, value in sensor_dict.iteritems(): try: main(key) except: pass
スクリプト実行するとうまくいった♪けど85.0がたくさんでてきてちゃんと計測しないセンサーが半分ほど・・・
$ python script/ds18b20.py 85.0 35.2 [{'fields': {'wtemp': 35.2}, 'tags': {'host': 'raspi3B+', 'place': 'leaf-ds18b20-6'}, 'measurement': 'air5'}] 32.8 [{'fields': {'wtemp': 32.8}, 'tags': {'host': 'raspi3B+', 'place': 'leaf-ds18b20-3'}, 'measurement': 'air5'}] 85.0 37.9 [{'fields': {'wtemp': 37.9}, 'tags': {'host': 'raspi3B+', 'place': 'leaf-ds18b20-2'}, 'measurement': 'air5'}] 33.9 [{'fields': {'wtemp': 33.9}, 'tags': {'host': 'raspi3B+', 'place': 'leaf-ds18b20-1'}, 'measurement': 'air5'}]
なんで?まぁ、いいか・・・
crontabで3分おきに計測値を取得
とりあえず定期的に計測してグラフ表示するようにしてみます。以下のようにしました。
$ crontab -e #以下を追加 */3 * * * * /usr/bin/python /home/pi/script/ds18b20.py
しばらく計測してみて、ちゃんと計測しない85.0のセンサーを指でこすって温度を上げたり、ケーブルを抜き差ししたりすると数が減ったりちゃんと計測したりする。
違うスクリプトでやる。
ds18b20がちゃんと計測しないときがあるので、他のスクリプトでやったらちゃんと取得するかと思ったが無理だった。
$ sudo pip install w1thermsensor
これはうまくできなかった。
水温をグラフで表示してみる
Cronで三分おきに水温データをInfluxDBに保存してGrafanaで表示させてみました。↓
水温センサーは6本とPHセンサーについていた水温センサーと合わせて7本。以下のグラフでは「中右」のセンサーがたまにしかデータを取得できてない。こういう現象がけっこう起きてds18b20センサーはあまり良いセンサーではない?もしくは接続方法が悪いのかもしれません。
水温 Grafana JSONファイル
水温を6個計測する機会はあまりないとは思いますが、上記のグラフのGrafana用JSONファイルをダウンロードできるようにしておきました。
必要な方は↑こちらを右クリックして「名前を付けてリンク先を保存」を選んでダウンロードしてください。
水耕栽培の水温 まとめ
ds18b20センサーは気まぐれ
ds18b20センサーは気まぐれで全く計測しなかったり突然計測するようになったりで、扱いにくい。
もう少しちゃんと信頼性のある水温センサーを見つけたら試してみたい。
後日PHをラズパイで計測するHomeLab-pHというものをebayで買ってみたら水温センサーもセットでついていて、アイソレーターもセットだったのでアイソレーターのところにds18b20をつなげたら、アイソレーター無しよりもちゃんと計測するようになった。HomeLab-pHをつなげた様子も後ほど記事にしてみます。
ペルチェ素子で水槽を冷やす
各水耕栽培のトレーの水温を計測してグラフにすることができましたが、夏に向けて水温が急上昇するのを避けるためにペルチェ素子とCPUクーラーなどを使って水槽の水温を下げる仕組みを作っていきます。
出来上がった装置は以下のようなもの、水槽からポンプで組み上げてサンドにしたペルチェ素子で冷やして水槽に返します。(上の棚に磁石でくっつけています)
なかなかうまくいきましたが、冷えるのが遅い・・・冷やした結果は8Lの水に対して1時間冷やして5度前後しか冷えませんでした。
次回詳しくみていきましょう。
コメント