Python
電子工作
RaspberryPi
水やり
MCP3002センサー

Raspberry Piでプランターの水やりを自動化してみた

More than 1 year has passed since last update.


概要

GROVEの土中水分センサーとADコンバータ(MCP3002)で土中に含まれる水分量を5分おきに計測し、水分量が閾値を下回ったら灯油ポンプを作動させ、水タンクから水を汲み上げてプランターに水をやるというのを作ってみました。


回路図

water_system_回路図.png

IMG_3902.jpg


土中水分センサーの値を読み取る

水分センサーは水分量に応じた電圧(アナログ値)が出力されます。

Raspberry Piはデジタル入力しかできないので、ADコンバータでデジタルデータに変換して読み取る必要があります。今回はADコンバータにはMCP3002を使用しました。

Raspberry PiとMCP3002の接続は以下の記事を参考にさせていただきました。

Raspberry PiにA/DコンバータMCP3002をつなぐ

土中水分センサは以下の物を使用しました。

https://www.switch-science.com/catalog/814/

センサーはプランターに穴をあけて差し込んでいます。

IMG_4033.jpg


灯油ポンプを作動させて水をやる

IMG_4032.jpg

水やりの部分は電動式灯油ポンプとGPIOを接続してGPIOをONにすることで灯油ポンプが作動するようにしています。

ただ、ポンプはモータが作動するのですが、Raspberry PiのGPIOでモータを動かそうとすると、電力不足に陥ってしまうので、灯油ポンプは最初からついている灯油ポンプの電池ボックスの電源で作動させるようにし、Raspberry Piからはリレースイッチの制御を行います。

Raspberry PiのGPIOをPythonで制御できるようにするには、以下の記事を参考にさせていただきました。

GPIOでLEDの点滅(Python)


Pythonコード

5分おきに土中水分量を計測し、閾値を下回ったら灯油ポンプを30秒動かします。

水タンクが空になってしまっていた場合は、灯油ポンプを作動させても水分量が回復せず、また5分後に水をやろうとしてしまい、灯油ポンプの電池の無駄遣いになってしまうので、一度水をやったらその後しばらくは水やりをしないようにしています。


water.py

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)