エンジニアリング

へたれエンジニアが水耕栽培の水やり-給水を自動化!水やりマンを作った(ESP32)

どーも まる@へたれ です。

今年はお仕事が忙しいようで夏休みが夏休みっぽく過ごせていない感じです。とはいえお仕事ばかりやっていると脳みそが鬱々しくなってきてスノーボードシーズン前に退職する恐れがあるので気分転換でお家でIoTすることをしました。

こんな感じで食用の野菜を育て始めました。サニーレタス美味しいです。

とは言えモノグサで毎日水やりとかをやることは絶対にできない。忘れることが生きている中で見えていたので出来る限り自動化することにしました。

自動水やりマンを作ってみよう

システムイメージはこんな感じです。

  1. デカイ2リットルペットボトルに水中ポンプ(モーター)と栽培しているプランタをつなぐ。
  2. プランタの水位が減ってくるとそれを「浮き」のようになっているフロートスイッチで検知
  3. 水中モーターがオンとなって水を給水する

イメージは1日1回水位チェックを走らせる事を想定。

完成形はこんな感じです。圧倒的ハンドメイド感ですが、図工の成績が小・中学校ずっと赤点だった僕はこんなもんです。

右上の黄色線でつながっているのがフロートスイッチです。こいつで水の水位を監視してます。

初めArduinoや、ESP-WROOM2 でやろうとしたのですが、長時間(24時間)の省電力モードが出来なかったのでESP32で作成することにしました。

材料はこの辺です



電池ボックスはDC用のアダプタをかましてマイクロUSBに接続するアダプタを利用してESP32の電源として利用しました。

リレーは水中ポンプが12Vと結構電力を食うので独立した電源で稼働させるために使ってます。

配線図を見てみましょう

リレーのスイッチは12ピンにつないでこれのHigh/Lowでモーターのオン・オフを行います。

フロートスイッチはアナログなのですが抵抗の付け方が悪いのか0(水がない=浮きが下にさがっている) or 4250(水が規定値まである=浮きが上にあがっている)のデジタルっぽくしか動かないのでこの挙動を前提でコードを組み立てます。

水やりマンのコードを書いてみよう

ArduinoIDEを使ってコードを書いてみます。
前提でESP32のライブラリ導入が必要です。

設定はこんな感じ。

コードはこんな感じです。

#include <WiFi.h>
#include <WiFiClient.h>  


const char* WIFI_SSID = "ここいれて";
const char* WIFI_PASS = "ここいれて";

int degitalPin = 12;
int watorLevelPin = 32;
int watorLevel = 0;
WiFiClient client;


void setup() {
  Serial.begin(115200);
  WiFi.begin(WIFI_SSID, WIFI_PASS);
  
  Serial.println("Connecting Wifi...");
  while (WiFi.status() != WL_CONNECTED) {
      delay(500);
      Serial.println("Connecting to WiFi..");
      
  }
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
  
  pinMode(degitalPin, OUTPUT);

  delay(3000);
  
  boolean loopflag = true;
  watorLevel = 0;
  int waterCount = 0;
  //水やり処理の部分
  while(loopflag){
    watorLevel = analogRead(watorLevelPin);
    delay(1000);
    Serial.println("Wator Level: Empty(" + String(watorLevel) + ")");
    
    if(watorLevel < 4000) {
        digitalWrite(degitalPin,HIGH);
        Serial.println("給水中");
        delay(2500);
        digitalWrite(degitalPin,LOW);
        waterCount++;
    }

    if(watorLevel>4000 || waterCount > 2) {
      loopflag = false;
      Serial.println("給水完了");
    }
      
      delay(3000);
  }


  Serial.println("Start : Deep Sleep");
  //deep sleep をするよ部分
  float set_sleep_sec;
  set_sleep_sec = 24 * 60 * 60;   // sec
  esp_sleep_enable_timer_wakeup(set_sleep_sec * 1000000LL * 1.006);
  esp_deep_sleep_start();
  delay(1000);
}



void loop() {
//loopはdeepsleepを使うので使わない

}

wifi接続の処理が前半に書かれてますが、これは後日、Lineに通知を流したりするためにいれてあるだけで使ってません。

水やり処理の部分
浮きの水位をwatorLevelで取得をして、digitalWriteをHIGH/LOWにしてポンプを動かします。1回で大量に給水すると水位がオーバーして溢れる可能性があるので2.5秒動かしてもう一度水位を確認して・・・を繰り返します。
誤って無限ループになることを懸念して3回で停止するようにしてます。

deep sleep をするよ部分
ここで、省電力にするためにESP32をdeepsleepします。
24時間眠らせてますが、少し内部時計がずれるため1.006の補正をいれてます。(あまり気にしないでも良いっちゃ良いが・・・)
deepsleepから復帰するとsetup()から処理が始まる形になるのでloop()には何も処理を書いてないです。

これで水やりマンが完成です!!!!

リレーのカチッという音と共に秋の訪れを感じましょう

リレーの切り替えのときになるカチッっていう音がなんか気持ち良区内ですか?なんかハマった感じがして・・・って僕だけですかね?

今後も少しずつ水耕栽培のカスタマイズは行っていきます!