
留守中に植物に水をやりたいのでArduino(的なもの)を買ってきて自動水やり機を作ってみた
しばらく家を開ける予定がある時、生き物が家にいると少し困る。
預けられるサイズならともかく、自分の背丈よりも巨大に育ってしまったエバーフレッシュ(室内でしか生きられない樹)くんなんかは割とどうしたら良いか分からない。
数日程度ならともかく1-2週間家を空ける用事があると3日に一回くらい誰か水やりを頼みたいかも。というか3日に一回物理的に作動する何かがあれば自動化できるのでは?
古典的な鉢に挿しておく水やり代行では力不足、かといってそこまで大掛かりなシステムは必要ではない。
リアル世界にスクリプト実装したい…
そんな課題を解決できそうな楽しげなものをamazonで見つけたのでポチってみました!
ELEGOOさんのArduino用UNO R3スターターキットです。
互換品(Arduinoはオープンソースで本家ではない商品も色々出ています)のUNOと色々なものがセットになっている感じ。
Arduinoを動かしてみる



存在は存じ上げていたけれど、arduinoの実物を触るのは実は初めてです。
まずはチュートリアル通りにbuilt inのLEDを光らせてみます。


とりあえず意図した通りにちゃんと動いていそう。これは楽しい。そして気軽。
次はシンプルなLEDの光らせ方を試してみました。
digitalWrite(i, HIGH);、digitalWrite(i, LOW);でi番目のピンの電圧をいじれるっぽいなと基本的な使い方を理解。
関数とか変数とかも使えそうな気配なので、ぷすぷすとLEDと抵抗を刺してこんなコードを試してみる。


なんとなくで使えそう!!めちゃめちゃ手軽で人気があるの頷ける〜という感じです。
軽くググると案の定C言語ベースらしくて、C言語は好きだったこともあり取っ付きやすいです。
チュートリアルや入っているものを先頭から全部試して遊びたいけれど、とりあえず水やりが実装できないかに進んで行きます。差し迫った旅行があるので。。
今回はサーボモーターと動作している時に知らせるブザーを使うことにしました。
チュートリアルに付属していたコードを参考にライブラリも読み込んでこんな感じに。
#include <Servo.h>
#include "pitches.h"
Servo myservo;
void setup() {
// put your setup code here, to run once:
myservo.attach(9);
pinMode(12, OUTPUT);
}
void loop() {
// put your main code here, to run repeatedly:
unsigned long duration=10000, exectime=2000;
tone(12, NOTE_A5,exectime);
delay(10);
myservo.write(180);
delay(exectime);
myservo.write(0);
delay(duration);
}
exectimeの時間の間サーボの角度が180度に変わることで水をやる想定です。水やり中はブザーがラの音で鳴ります。水やり終了後、durationで指定する時間サーボの角度が0度になり待機します。

上記のコードの時間のdurationはテスト用に短めの間隔です。
うちの場合、多分水やりの頻度は2-3日に一度が良さそうなので、60時間とすると数字を[msec]に直してduration=216000000に書き換えればOKです。
unsigned longは32bitだそうなので、2^32-1=4,294,967,295までの数が入ります。これなら大丈夫!delayの時間はそんなに正確では無いみたいですが、まあ植物が生きててくれれば良いので大丈夫かな。
水やり機側の準備
ざっくりした設計はこんな感じです。

水を汲み出すポンプとかは無いのであるもので作っていきます。
水位のセンサーがあれば正確な量をあげられるとか、土の湿度が分かると良いかもとか、まずはそういうことは考えないシンプルな方法で行きます。

やることは穴を開けストローを刺し穴を開け、テープで止めていくのみです。が、サーボで上の穴を塞ぐところが全工程で一番大変でした。

あと穴自体の方ももっと小さい方が良かったのでテープで少し埋めました
きちんと穴が0度で塞がるために試行錯誤を繰り返し、ついに


完成!
そしてできてみてから気が付いたのですが、この方法だと水を入れるのが結構大変ですw
改良の余地は色々ありそうですが簡単には作れました。
プログラミングや電子回路に触れたことがあれば1日ですぐに色々作れてしまいそうです。環境構築も楽々で、こんなに手軽だったとは!という感想。
逆にここからプログラミングや電子回路について学んでいくのも楽しいかも。
アイディア次第で楽しいものも実用的なものも色々作れそうです。
エバーフレッシュ(水を切らすと大量の葉っぱを撒き散らすが、元気な時はかわいいし部屋がオシャレになる)くんのおかげで新しい楽しみを発見できました!
追加
二週間家を空けて観葉植物達元気でした!
ソースコード、配線
#include <Servo.h>
#include "pitches.h"
Servo myservo;
void setup() {
// put your setup code here, to run once:
myservo.attach(9);
pinMode(12, OUTPUT);
}
void loop() {
// put your main code here, to run repeatedly:
unsigned long duration=220000000, exectime=2000;
tone(12, NOTE_A5,exectime);
delay(10);
myservo.write(180);
delay(exectime);
myservo.write(0);
delay(duration);
}

サーボの電源(赤): 5V
ブザーの正極(赤): 12
負極(黒)はGNDへ