Help us understand the problem. What is going on with this article?

RPi3で植物水やり自動化

More than 1 year has passed since last update.

背景

先日思い立って、ベランダにプランターを置き、ナスやピーマンを育てはじめました。
問題になるのが水やりです。
毎朝あげないといけません。

実は以前同様にベランダで枝豆を育てようとしたことがあったのですが、水やりを忘れて枯らしてしまった過去があります。
同じ轍は踏みたくありません。
そもそも、決まった時間に決まった動作を確実に行うというのを人間がやることにそもそも無理があります。
そういうのは機械にやらせるべきです。

というわけで自動的に作物に水をやるシステムを作ることにしました。

ハードウェア

概要

拙いですが以下の図を御覧ください。

plant.png

ベランダに設置したタンクの水をポンプで汲み上げ、ホースを介して植木鉢に散水します。
ポンプはリレーモジュールにつなぎ、Raspberry PiからON/OFFできるようにします。

防水が大変なので、リレーモジュールなどは屋内に設置することにし、ポンプだけベランダに出しました。
コードはエアコンのダクト用の穴を介して屋内に引き込みました。

タンクへの給水は手動です。1週間分は貯めておけるので、土日にまとめて入れています。

また水やりとはあまり関係ないですが、USBカメラで定期的に写真を取り、植物の成長の記録を残します。

材料

初めてなので、まずはあまり金をかけないという点を重視して揃えました。
ラズパイとUSBカメラはもともと持っていたので新規に買ってません。

構成

USBカメラで撮影した写真が以下になります。
窓ごしにベランダを撮影しています。

plant2.png

植木鉢の上で散水できるよう、先の尖ったピンセットをガスバーナーで加熱して突き刺し、ホースに穴を開けています。

注意点

サイフォンの原理というものがあります。
タンク内の水面より、ホースの散水部分の位置が低いと、ポンプをOFFにしても水が流れ続けてしまいます。
タンクを低いところに置くことができなかったので、ホースに1箇所だけ空気を通す穴を開けてサイフォンが起こらないようにしています。

ソフトウェア

概要

ポンプON→OFF

Lチカ並にシンプルです。
第1引数に指定された数値の時間(秒)ポンプを作動させます。
購入したリレーモジュールは入力をGNDに短絡するとリレーがONになるので11番ピンをfalse(GND)にしています。

water.py

import RPi.GPIO as GPIO
import time
import sys

if (len(sys.argv) < 2):
    print("notime")
    quit()

try:
    pump_time = int(sys.argv[1])
except Exception:
    print("bad time")
    quit()

GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD)
GPIO.setup(11, GPIO.OUT)
GPIO.output(11,False)
time.sleep(pump_time)
GPIO.output(11,GPIO.OUT)
GPIO.cleanup()

cron呼び出しスクリプト

cronで直接呼び出される処理を記述しています。

  • 天気予報を確認し、雨が降りそうなときは散水量を少なくします。 こちらの記事のコードを拝借しました。
  • 記録のため散水の様子を動画で撮影します。 参考:http://docoma.club/?p=763
  • cameraディレクトリは別のファイルサーバをマウントしています。(SDカードに保存しているわけではありません)

takewater.sh

#!/bin/bash

RAINS=$(curl -s https://weather.yahoo.co.jp/weather/jp/14/4610/14110/******.html | tr '\n' ' ' | sed -e 's/<[^>]*>//g' | grep -oE ' - [0-9].*明日' | tr ' ' '\n' | grep -v '^$' | head -47 | tail -n 8 | awk '{SUM += $1}END{print SUM}')

echo "RAIN="$RAINS

PUMP_TIME=20
if [ $RAINS -gt 10 ]; then
    PUMP_TIME=10
fi

echo "PUMP_TIME="$PUMP_TIME

CAMERA_TIME=$((PUMP_TIME + 10))

ffmpeg -f v4l2 -s 1280x1024 -i /dev/video0 -t 00:00:$CAMERA_TIME -loglevel quiet /home/kaz/camera/$(date +%Y%m%d-%H%M%S).mp4 &
sleep 5
python /home/kaz/water.py $PUMP_TIME
sleep $((PUMP_TIME+5))

定期的な写真撮影

cronにより、10分毎に画像を保存します。

#!/bin/bash

/usr/bin/fswebcam  /home/kaz/camera/$(date +%Y%m%d-%H%M%S).jpg -r 1280x1024 -S 10

振り返り

  • 朝の忙しい時間帯にベランダに出て水をやるのはなかなか大変だったのですが、かなり楽になりました。
    作物が増えても対応できそうです。
  • 1本のホースですべての鉢に水をやるという方式にはやや難がありました。 ホースに穴を開けたりテープで塞いだりを繰り返し、ちょうどよい水量が与えられるように調整しました。
  • 土壌の水分をセンサーで測定し、少なければ水をやる・・・ということもできそうです。
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
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  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