Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
63
Help us understand the problem. What is going on with this article?
@kwt514

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

More than 3 years have 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)

63
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
kwt514

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
63
Help us understand the problem. What is going on with this article?