今日は水遣りの制御を考えてみました。
<仕様>
土壌センサがある一定の乾き具合になったと判断したら、水をあげます。
水遣りを実行したら、一定時間は水遣りを実行しません。
土壌の乾き具合を人の目に分かるように通知します。
手動水遣りボタンが押されたら、状況にかかわらず水遣りを実行します。
<変数の定義>
水遣りの敷居値(乾き具合)として Thresholdを定義。
土壌の乾き具合を Soilと定義。
水遣りのRetry回数をカウントする Retryを定義。
土壌の判定具合を通知するため、Stateを定義。
<動作イメージ>
自動チェックは3時間に一回(60m*60s*3h*1000ms)
土壌の状態に応じて、LEDで通知
十分に水が供給されている = Blue
程よく水が含まれている = Green
もう少しで、水遣りが必要 = Yellow
水を上げたが渇きが解消されない = 水タンクEmpty = 警告!
手動水遣りボタンが押されたら、土壌の状態によらず水遣り実行
<実装イメージ>
実際にプログラムを組むときの骨格
以前に書いた、土壌センサを用いますので、土壌が乾いたときは最大1024が表示され、乾いているほどセンサ数値は大きくなります。
ここでは、仮に700を超えたら乾いていて水やりが必要と定義します。
if文を用いて、繋いでいきます。
たとえば、十分水が与えられている状態でセンサ読み値Soilが300であれば、Blueです。
501であればThreshold-200 = 700-200 = 500より大きいので、Yellowです。
一方、700より大きければ、水遣りを実行します。
ここで、Retryで水遣り回数をカウントアップします。
3分待った後、Retry回数をチェックし、2未満なのでもう一度判定に戻ってきます。
もう一度Soilを確認し、700より大きければ、もう一度水遣りをします。
水遣りとチェックを繰り返しても700以下にならなければ、水遣りができていないとし、警告を出しRedを表示します。
水遣りから3分待つのは、土壌に染み渡る時間を待ってチェックするためです。
判定間隔3時間や、渇きの敷居値700は実装しながら設定していきます。