#概要
GROVEの土中水分センサーとADコンバータ(MCP3002)で土中に含まれる水分量を5分おきに計測し、水分量が閾値を下回ったら灯油ポンプを作動させ、水タンクから水を汲み上げてプランターに水をやるというのを作ってみました。
#土中水分センサーの値を読み取る
水分センサーは水分量に応じた電圧(アナログ値)が出力されます。
Raspberry Piはデジタル入力しかできないので、ADコンバータでデジタルデータに変換して読み取る必要があります。今回はADコンバータにはMCP3002を使用しました。
Raspberry PiとMCP3002の接続は以下の記事を参考にさせていただきました。
Raspberry PiにA/DコンバータMCP3002をつなぐ
土中水分センサは以下の物を使用しました。
https://www.switch-science.com/catalog/814/
センサーはプランターに穴をあけて差し込んでいます。
#灯油ポンプを作動させて水をやる
水やりの部分は電動式灯油ポンプとGPIOを接続してGPIOをONにすることで灯油ポンプが作動するようにしています。
ただ、ポンプはモータが作動するのですが、Raspberry PiのGPIOでモータを動かそうとすると、電力不足に陥ってしまうので、灯油ポンプは最初からついている灯油ポンプの電池ボックスの電源で作動させるようにし、Raspberry Piからはリレースイッチの制御を行います。
Raspberry PiのGPIOをPythonで制御できるようにするには、以下の記事を参考にさせていただきました。
GPIOでLEDの点滅(Python)
#Pythonコード
5分おきに土中水分量を計測し、閾値を下回ったら灯油ポンプを30秒動かします。
水タンクが空になってしまっていた場合は、灯油ポンプを作動させても水分量が回復せず、また5分後に水をやろうとしてしまい、灯油ポンプの電池の無駄遣いになってしまうので、一度水をやったらその後しばらくは水やりをしないようにしています。
import spidev
import time
import datetime
import subprocess
import RPi.GPIO as GPIO
wet_low = 450
water_check_enable = True
water_wait_count = 0
check_reset = 10
def write_log(log_text):
f = open("/var/log/water","a")
d = datetime.datetime.today()
f.write (d.strftime("%Y-%m-%d %H:%M:%S" + "," + log_text + "\n" ))
#print log_text
f.close()
def read_wet_level():
spi=spidev.SpiDev()
spi.open(0,0)
resp=spi.xfer2([0x68,0x00])
value=(resp[0] * 256 + resp[1]) & 0x3ff
write_log("wet_level:" + str(value))
spi.close()
return value
def water():
write_log("***** water start *****")
GPIO.setmode(GPIO.BOARD)
GPIO.setup(16,GPIO.OUT)
GPIO.output(16,True)
time.sleep(30)
GPIO.output(16,False)
GPIO.cleanup()
write_log("***** water end *****")
while True:
wet_level =read_wet_level()
if water_check_enable == False:
water_wait_count += 1
if water_wait_count > check_reset:
water_check_enable = True
water_wait_count = 0
if wet_level < wet_low and water_check_enable == True:
water_check_enable = False
water()
time.sleep(300)