ラズパイ+ds18b20センサーで6つの栽培容器の水温計測・グラフ化

ds18b20 栽培ガジェット

水耕栽培なので夏になると栽培容器の水温が心配、水温が上昇して30度を超えてしまうと、野菜が枯れてしまいそうなので各栽培容器の水温を測ることにしました。

栽培容器は現在15個くらいありますが、とりあえずセンサーを6個つけてそのうち1個は一番下の水槽の水温を測りました。栽培容器の水温は15個中5個ほど計測します。

 

センサーで水温を計測して、ラズパイのInfluxDBに保存・Grafanaでグラフ表示してみます。

ラズパイ構築やInfluxDB・Grafanaの使い方インストールは以下の別サイトを参考にしてください。

ラズパイの簡単インストール方法3種+OSまるごとバックアップ
自宅のIot化でLED照明オンオフ(Xiaomi LED)や玄関鍵の開閉(セサミ スマートロック)、壁スイッチのオンオフ、部屋の空気の状態を表示させたりしていますが、不満点は専用のアプリでないと操作できないこと。それと同じメーカーでないと他
Beヨンド
ガジェットおすすめランキング
【Iot環境センシング下準備】InfluxDB設定+Grafana+telegrafでラズパイデータ可視化 カッコいいグラフを作ろう
自宅環境センシングの2回目の記事として今回はラズパイ(Raspberry Pi)にデータベースのInfluxDBを入れて将来的にセンシングしたデータをInfluxDB保存していきます。そして次回は、GrafanaというデータをWebで美しく

Raspi・InfluxDB・Grafanaのシステムを構築するまではちょっと面倒ですが後々楽しいのでぜひ挑戦してみてくださいね。

防水ds18b20センサーを使って水温計測

水温センサーに防水仕様のds18b20プローブがあるというので、買ってみました。

アマゾンにも売ってるけどebayのほうが安い

10本入で13ドル弱でした。↓ここで10本買ってみました。

1/2/5/10 PCS New 1M Length Waterproof Digital Thermal Probe or Sensor DS18B20

1/2/5/10 PCS New 1M Length Waterproof Digital Thermal Probe or Sensor DS18B20

もしくは、今考えるとモジュール付きのやつのほうが安定した計測ができるのかもしれません。↓

 

1/2M DS18B20 Temperature Sensitive Module Thermometer Waterproof Cable Probe

1/2M DS18B20 Temperature Sensitive Module Thermometer Waterproof Cable Probe

アマゾンにも売ってますが、5個セットで1000円~なのでちょっと割高で同じ中国から送られて来るのならばebayで買ったほうが良い気がしたのでebayにしました。

そして、あとで気がついたのですが、抵抗も必要とのことでこれもebayで買いました。0.99ドルでした。

50pcs 1/4W 0.25w Watt Metal Film Resistor ±1% 1M 1K-910K ohm Ω

50pcs 1/4W 0.25w Watt Metal Film Resistor ±1% 1M 1K-910K ohm Ω

ds18b20水温センサー配線

ラズパイでの配線方法などは以下のサイトを参考にさせていただきました。

ds18b20の配線は以下のようになっています。

線の色 役割
VCC
データ
GND

防水のds18b20センサー6個を以下のように配線しました。わかりやすくFritzingでかけなかったので3つだけ表示させています。↓

ds18b20センサーの赤と黒ケーブルをGNDに配線して、黄色を4.7KΩの抵抗を通して3.3Vにつなげました。黄色ケーブルはさらにGPIO4に接続しました。

ds18b20

実際にはこんな感じにした。↓ 3Dプリンタで簡易ケースを作って磁石で棚板の裏にくっつけました。

ds18b20

先は栽培容器の水の中に入れます。↓

ds18b20

ラズパイ全体は・・・かなりたくさんのパーツを付けてしまったので見にくくてすみません、赤枠の左側が上画像の回路、ラズパイには赤枠真ん中のように接続しました。

ds18b20

ちなみにラズパイ本体はほぼ隠れてしまっていますが水色枠のです。GPIOがたくさんさせるようにPHAT STACKを経由して接続しています。

PHAT STACK

PHAT STACKは上画像赤枠のGPIOをたくさんさせるハットです。ちなみに右側の緑色の基盤はUPS(無停電電源装置)というよりラズパイに電力が行かなくなったら安全にシャットダウンしてくれるmopi2です。後ほど紹介していきます。

ラズパイ設定

ラズパイで1-Wireをオンにする設定が必要です。

raspi-configで1-wireを有効にする

$ sudo raspi-config

以下のような画面になる。

水耕栽培 水温 ラズパイ 設定

5 Interfacing Options

水耕栽培 水温 ラズパイ 設定

P7 1-Wire

水耕栽培 水温 ラズパイ 設定

「はい」を選ぶ

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がちゃんと計測しないときがあるので、他のスクリプトでやったらちゃんと取得するかと思ったが無理だった。

DS18B20 Temperature Sensor With Python (Raspberry Pi)
Yesterday at Liverpool Makefest, which incidentally was great, I spoke to a young man who wanted to use the Raspberry Pi to control his petrol powered radio con...
$ sudo pip install w1thermsensor

これはうまくできなかった。

水温をグラフで表示してみる

Cronで三分おきに水温データをInfluxDBに保存してGrafanaで表示させてみました。↓

水温センサーは6本とPHセンサーについていた水温センサーと合わせて7本。以下のグラフでは「中右」のセンサーがたまにしかデータを取得できてない。こういう現象がけっこう起きてds18b20センサーはあまり良いセンサーではない?もしくは接続方法が悪いのかもしれません。

水温

水温 Grafana JSONファイル

水温を6個計測する機会はあまりないとは思いますが、上記のグラフのGrafana用JSONファイルをダウンロードできるようにしておきました。

水温.json

必要な方は↑こちらを右クリックして「名前を付けてリンク先を保存」を選んでダウンロードしてください。

水耕栽培の水温 まとめ

ds18b20センサーは気まぐれ

ds18b20センサーは気まぐれで全く計測しなかったり突然計測するようになったりで、扱いにくい。

もう少しちゃんと信頼性のある水温センサーを見つけたら試してみたい。

後日PHをラズパイで計測するHomeLab-pHというものをebayで買ってみたら水温センサーもセットでついていて、アイソレーターもセットだったのでアイソレーターのところにds18b20をつなげたら、アイソレーター無しよりもちゃんと計測するようになった。HomeLab-pHをつなげた様子も後ほど記事にしてみます。

ペルチェ素子で水槽を冷やす

各水耕栽培のトレーの水温を計測してグラフにすることができましたが、夏に向けて水温が急上昇するのを避けるためにペルチェ素子とCPUクーラーなどを使って水槽の水温を下げる仕組みを作っていきます。

出来上がった装置は以下のようなもの、水槽からポンプで組み上げてサンドにしたペルチェ素子で冷やして水槽に返します。(上の棚に磁石でくっつけています)

ペルチェ素子

なかなかうまくいきましたが、冷えるのが遅い・・・冷やした結果は8Lの水に対して1時間冷やして5度前後しか冷えませんでした。

次回詳しくみていきましょう。

コメント

タイトルとURLをコピーしました