観葉植物の自動水やり機を作ろう!!(ESP-WROOM-02) 〜 其の1 〜


1.はじめに

今回はESP-WROOM-02開発ボードの自動水やり機を作ってみる。

※ポンプ以外のところはネットでたくさんあるので軽めに説明してます!

水を使うので、水浸しにならないようにご注意ください。

[補足]

twitter始めました。フォローお願いします。

※※※ 普段は競馬予想 sivaを運用しています。
連対的中率 : 約 86%
回収率 : 約 136%

ESP-WROOM-02を使った理由

Wifi経由でのデータのロギングやTwitter連携など今後の拡張を考えてESP-WROOM-02にしてみました。

完成イメージ

Youtube動画はこちら

2.材料の準備

準備したもの(総額で5,000円以内)

名称 購入場所
ESPr® Developer(ESP-WROOM-02開発ボード) 千石電商(秋葉原)で購入
Grove - 水分センサー 千石電商(秋葉原)で購入
トランジスタ (2SC1815GR) 千石電商(秋葉原)で購入
ブレッドボード 千石電商(秋葉原)で購入
ブレッドボード用ジャンプワイヤー 千石電商(秋葉原)で購入
ミニエアポンプモーター(6V) Amazonで購入
プラスチックの容器(水筒) ダイソーで購入
ビニールホース 東急ハンズで購入

その他にハンダ、ドリル、接着剤、グルーガン、USBケーブルなどの道具を準備。

3.回路図

簡単に今回の回路図です。
ESP-WROOM-02でAnalogを読むのにはTOUTのピンを使うらしいです。

4.ブレッドボード上で試す

ここで土壌湿度センサーからくるデータをシリアルモニターで確認すると、湿度が高い状態を1023で低いと0になっていました。

とりあえずここまでのプログラム。

#include <SPI.h>

#define ANALOG_PIN     A0 
#define MOTOR_PIN 12

void setup() {
  Serial.begin(115200);  
  pinMode(MOTOR_PIN, OUTPUT);
}

void loop() {
  int val = analogRead(ANALOG_PIN);
  int per = (int) map(val, 0, 1023, 0, 100);

  String message = "土壌湿度 : " + String(per) + "%";
  Serial.println(message)
  if (val < 200) {
    digitalWrite(MOTOR_PIN, HIGH); 
  } else {
    digitalWrite(MOTOR_PIN, LOW);    
  }
  delay(1000);   
}

12番のPinにLEDなどデバッグしてもらえば確認できると思いますが、湿度が低くなるとLEDが点灯する。

5.ポンプの作成

水をあげるポンプの作成します。

①ドリルと容器を準備(ペットボトルとかでOK)

②蓋に2つの穴を開けてビニールホースを通す

③【重要】蓋の密閉度を高める

蓋に通したホースに隙間をなくして空気を漏らさないようにします。
※※しっかりやらないと動きません。

④一本はエアポンプモーターへもう一本は植木へ

写真の例だとオレンジのホースをモータに接続します。
ピンクのホースを植木に接続します。

6.いざ実験!!

Youtube動画はこちら

それなりに動きました。今後、運用しながら改善していきます。

7.少し機能追加

せっかくのESP-WROOM-02なのでTwitterにデータをアップロードしてみます。

[アカウント]
https://twitter.com/AutoWatering

#include <SPI.h>
#include <ESP8266WiFi.h>

#define ANALOG_PIN     A0 
#define MOTOR_PIN 12

const char* ssid = "*******************";
const char* password = "*******************";

// StewGate U を使う
const char* host = "stewgate-u.appspot.com";
const char* token = "*******************";  


void setup() {
  Serial.begin(115200);
  WiFi.begin(ssid, password);
  while(WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  pinMode(MOTOR_PIN, OUTPUT);
}

int tweetTime = 0;
void loop() {
  int val = analogRead(ANALOG_PIN);

  if (tweetTime == (600 * 6)) {
    tweetTime = 0;
  } else if(tweetTime == 0) {
    int per = (int) map(val, 0, 1023, 0, 100);
    String message = "土壌湿度 : " + String(per) + "%";
    tweet(message);
  }
  if (val < 200) {
    digitalWrite(MOTOR_PIN, HIGH); 
  } else {
    digitalWrite(MOTOR_PIN, LOW);    
  }
  delay(1000);   
  tweetTime++;
}

void tweet(String msg) {
  WiFiClient client;
  const int httpPort = 80;

  if(!client.connect(host, httpPort)) {
    Serial.println("connection failed");
    return;
  }
  client.println("POST /api/post/ HTTP/1.0");
  client.print("Host: ");
  client.println(host);

  int msgLength = 40;
  msgLength += msg.length();
  client.print("Content-length:");
  client.println(msgLength);
  client.println("");

  client.print("_t=");
  client.print(token);
  client.print("&msg=");
  client.println(msg);
  delay(10);

  while(client.available()){
    String line = client.readStringUntil('\r');
    Serial.print(line);
  }
}

8.さいごに

自宅の環境でまだまだいろいろ試したいことあるので、もっといろいろなものを作ってみたいと思います。

twitter始めました。フォローお願いします。