M5Stackで手軽に作る観葉植物育成デバイス

第4回:電動スプレーを操作して自動水やり機の完成!

こんにちは、ヨシケンです!
小型のArduino互換機のM5Stackシリーズを使って、室内の植物を見守り、水やりなどを自動化するデバイスを作る今回の連載。

最終回となる今回は、ついに電動スプレーをM5Stackから操作できるようにします。インターネットにもつながっているので、遠隔から植物の確認できたり、状況に応じて自動で水やりすることができます。M5Stackを使っての植物育成デバイス、いよいよ完成です!

grow-plants-device-04-01

grow-plants-device-04-02

M5Stackシリーズを使って観葉植物育成機作り

 

今回の記事で必要な物一覧

M5Stack Core

ESP32を搭載し、ディスプレイ、センサなども入ったArduino互換機

grow-plants-device-02-02-2

 

ローム照度・近接センサ (RPR-0521RS)

赤外線を発しその反射光を測定して、光の強度や近接度を計測します。

grow-plants-device-03-02

 

DHT11温湿度センサ

温度と湿度が両方測れるデジタル温湿度センサモジュール

grow-plants-device-03-03

 

水分センサ

土中の水分量を計測

grow-plants-device-03-04

 

電動霧吹きスプレー

電池で動くこのような霧吹き機

grow-plants-device-01-08

 

トランジスタ (秋月電商)と基盤など

build-motion-activated-squirt-bottle-02

 

今回の記事の流れ

  1. 電動スプレーの改造
  2. 全体を組み合わせたスケッチを作る
  3. M5Stackをくっ付けて植物自動見守り機の完成
  4. まとめ

 

1. 電動スプレーの改造

植物の水やり自動化の為に、写真のような単三電池(4本)で動く、電動のスプレーを改造して使います。改造作業は、破損、発熱などに注意して自己責任でおこなってくださいね。

grow-plants-device-04-04

 

この電動スプレーの上部の、給水モーターが入った部分を以下写真のように開けます。そうすると水を汲み上げるためのモータが入っているので、そこに外部から操作できるようにケーブルを設置します。モータにつながったケーブルの一方と、電源(単三乾電池4本)につながっている部分に、それぞれオレンジと青のケーブルを半田付けして、外に出すようにします。

grow-plants-device-04-05

 

M5Stackからモータを制御するために、トランジスタを使って、スプレーから取り出した配線とそれぞれをつなぎます。トランジスタは3本の端子が、写真左(平な面を正面にして)からE(エミッタ)、C(コレクタ)、B(ベース)と付いています。M5Stackで比較的大きな(6V)の電圧を使ったモータを制御し、電流を制御する為のスイッチのような役目を持ちます。

grow-plants-device-04-06

平な面を正面に、左からE(エミッタ), C(コレクタ), B(ベース)

 

スプレー側から出したケーブルとトランジスタ、M5Stackへの配線を以下のようにおこないます。接続しやすくするためにここでは小さい基盤を使って、ケーブルとトランジスタをはんだ付けしています。写真ではトランジスタの丸い面がこちらを向いているので、左からB、C、Eとなっているので、向きに気を付けてくださいね。

スプレー側 基盤のトランジスタ M5Stack側
B(左側のベース) GPIO26 (黄色)
オレンジのケーブル C(真ん中のとオレンジを繋ぐ)
ブルーのケーブル E(右側エミッタとブルーを繋ぐ) GND (ブルー)

grow-plants-device-04-07

 

配線、半田付けができたら、電動スプレーを操作するためのスケッチを書きます。M5StackにあるButtonというサンプルプログラムを使って、左側のAボタンが押されたら、M5StackにつないだGPIO26をHIGHにする、というとても簡単なものです。

[M5Stack_Button_High.ino](サンプルプログラムのButton.inoに以下6行目、17〜19行目を追加)

#include <M5Stack.h>
void setup() {
  M5.begin(true, false, true);
  M5.Power.begin();

  pinMode(26, OUTPUT);

...
  
}

void loop() {
  M5.update();
 
  if (M5.BtnA.wasReleased() || M5.BtnA.pressedFor(1000, 200)) {
    M5.Lcd.print('A');
    digitalWrite(26, HIGH);
    delay(1000);
    digitalWrite(26, LOW);
  } else if (M5.BtnB.wasReleased() || M5.BtnB.pressedFor(1000, 200)) {
    M5.Lcd.print('B');
  }
…

}

これで、M5StackのAボタンを押すと10秒間GPIO26がHIGHとなりスイッチが入ります。その間だけ電動スプレーの電源が入り、スプレーから水が出る仕組みです。このスケッチをM5Stackに書き込んで、スプレーを操作してみましょう。

grow-plants-device-04-08

 

M5StackのAボタン(左側)を押すと、スプレーの電源が10秒間だけ入ったでしょうか?ここでは電源のオンオフだけを確かめましたが、水を入れるとその間だけ水が噴霧されます。

 

2. センサと組み合わせて全体のスケッチを作る

これまでセットした温湿度センサの結果や、水分センサの値に応じて、表示を変えたり、自動で水やりできるようにしましょう。

ここではある一定の値の時(室温が30℃を超えるか、水分センサの数値が300以下の時)に、「暑いよ〜、温度◯◯Cが高すぎるか、水分不足です!」と表示して、水やりを自動でおこないます。その後「水やりしました!」というメッセージをL INEに送ります。

センサ類とスプレーを組み合わせたスケッチはこのようになりました。

[ M5Stack_Sensor_Spray.ino]

#include <M5Stack.h>
#include <DHT.h>
#include <Wire.h>
#include <RPR-0521RS.h>
RPR0521RS rpr0521rs;

#include <ssl_client.h>
#include <WiFiClientSecure.h>
#include <HTTPClient.h>
WiFiClient client;

const char* ssid = "YOUR SSID";
const char* password =  "YOUR PASSWORD";

void send(String message) {
  const char* host = "notify-api.line.me";
  const char* token =  "YOUR TOKEN";
  WiFiClientSecure client;
  Serial.println("Try");
  client.setInsecure();
  if (!client.connect(host, 443)) {
    Serial.println("Connection failed");
    return;
  }
  Serial.println("Connected");
  String query = String("message=") + message;
  String request = String("") +
                   "POST /api/notify HTTP/1.1\r\n" +
                   "Host: " + host + "\r\n" +
                   "Authorization: Bearer " + token + "\r\n" +
                   "Content-Length: " + String(query.length()) +  "\r\n" +
                   "Content-Type: application/x-www-form-urlencoded\r\n\r\n" +
                   query + "\r\n";
  client.print(request);

  while (client.connected()) {
    String line = client.readStringUntil('\n');
    Serial.println(line);
    if (line == "\r") {
      break;
    }
  }
  String line = client.readStringUntil('\n');
  Serial.println(line);
}

const int PIN_DHT = 5;
DHT dht(PIN_DHT,DHT11);

void setup() {
  M5.begin();  
  WiFi.begin(ssid, password);

  dht.begin();
  byte rc; 
  rc = rpr0521rs.init();
  pinMode(26, OUTPUT);
}

uint16_t analogRead_value = 0;

void loop() {
  M5.update();
  delay(3000);
  // 湿度を取得
  float humidity = dht.readHumidity();
  // 温度を取得
  float temperature = dht.readTemperature();

  analogRead_value = analogRead(36);

  Wire.begin(21,22);
  byte rc;
  unsigned short ps_val;
  float als_val;
  rc = rpr0521rs.get_psalsval(&ps_val, &als_val);

    if (als_val != RPR0521RS_ERROR) {
      Serial.print(F("RPR-0521RS (Ambient Light) = "));
      Serial.print(als_val);
      Serial.println(F(" [lx]"));
      Serial.println();
    }
  
  M5.Lcd.clear(BLACK);

  if ( (temperature > 30) or (analogRead_value < 300) ) {
    M5.Lcd.fillScreen(TFT_RED);
    send("暑いよ〜、温度"+String(temperature,1)+"Cが高すぎるか、水分不足です!");
    digitalWrite(26, HIGH);
    send("水やりしました!");
    delay(1000);
    digitalWrite(26, LOW);
  }  else if ( (temperature < 10) ) {
    M5.Lcd.fillScreen(TFT_BLUE);
    send("寒すぎ!温度"+String(temperature,1)+"Cが低いです!");
  }

  M5.Lcd.setTextColor(WHITE);
  M5.Lcd.drawString("M5STACK SENSORS",0,0,4);
  
  M5.Lcd.setTextColor(YELLOW);
  M5.Lcd.drawString("Humidity:",0,30,4);
  M5.Lcd.drawFloat(humidity, 0, 0, 50, 4); 
  M5.Lcd.drawString("%",50,50,4); 

  M5.Lcd.setTextColor(GREEN);
  M5.Lcd.drawString("Temperature:",0,80,4);
  M5.Lcd.drawFloat(temperature, 0, 0, 100, 4);
  M5.Lcd.drawString("C",50,100,4);
  
  M5.Lcd.setTextColor(BLUE);
  M5.Lcd.drawString("Moisture:",0,130,4);
  M5.Lcd.drawFloat(analogRead_value, 0, 0, 150, 4);

  M5.Lcd.setTextColor(WHITE);
  M5.Lcd.drawString("Light:",0,180,4);
  M5.Lcd.drawFloat(als_val, 0, 0, 200, 4);

  if (M5.BtnA.pressedFor(100)){
    send("温度は"+String(temperature,1)+"C、湿度は"+String(humidity,1)+"%です!");
  } else if (M5.BtnB.pressedFor(100)){
    send("水分は"+String(analogRead_value)+"です!");
  } else if (M5.BtnC.pressedFor(100)){
    digitalWrite(26, HIGH);
    send("水やりしました!");
    delay(1000);
    digitalWrite(26, LOW);
  }
}

ここでは前回作ったように、M5StackからWi-Fiに接続してLINEにメッセージを送るために、”YOUR SSID”と”YOUR PASSWORD”、”YOUR TOKEN”にはご自宅のWi-FiのID、パスワード、LINE Notifyのトークンを入れます。

grow-plants-device-04-09

 

室温が30度以上か水分の値が300以下や日光が当たらなくなったら、写真のように画面が赤くなります。合わせてLINEでメッセージが送られます。また、水分量が300以下の時は合わせて電動スプレーに電源が入り10秒間水やりをして、LINEに下のようなメッセージを送っています。

grow-plants-device-04-10

 

3. M5Stackをくっ付けて植物見守り機の完成!

それではこれまでのセンサ、ケーブルを全部セットして便利に使ってみましょう。

grow-plants-device-04-11

 

温湿度、明るさセンサは計測しやすい位置に付け、水分センサはちょっと離れた位置まで測れるように長いケーブルを付けました。M5Stackの画面が見やすいように電動スプレーの取手部分にセットしています。

grow-plants-device-04-12

 

ボタンを押すことにより、水やりできたり、L I N Eメッセージを送ったりする事もできます。

grow-plants-device-04-13

 

もちろん定期的に植物周りの環境を測定して、自動で動いてくれます。その結果をLINEにも送ってくれるので、離れた所からでも植物の状況が確認できますね。

grow-plants-device-04-14

grow-plants-device-04-15

 

いかがでしょうか?M5Stackを使った自動植物育成機の完成です。色々なセンサを追加したり、スケッチを変えて他の動きにしたり、LINEのメッセージを変えたりして自由に作ってみてください。

水を噴霧しているところ

 

4. まとめ

今回は小型のArduino互換機のM5Stackを使って、自動水やり機を作りました。

M5Stackは、温湿度センサや明るさセンサ、アナログやデジタルのセンサなどに対応しているので、応用次第で様々な環境測定が可能です。また大きめの画面が付いているので、結果を面白く表示することも可能です。そしてWi-Fiに接続して、L I NEなどにメッセージを送れば離れたところからでも状況がチェックできてとても便利です。

今回は植物周りの計測や水やりなどに使いましたが、応用次第でもっと本格的な栽培などにも使えるかもしれません。また色々な機能を追加して、M5Stackとセンサを使って便利で面白い電子工作を楽しんでください!最後までお付き合いくださいまして、ありがとうございました!

電子工作マニュアル Vol.2
ヨシケン(吉田 顕一)

普通の会社に勤めるサラリーマンですが、モノ作りが好きな週末メイカーで、電子書籍MESHBOOKを出したり、ブログを書いたりしています!

http://blog.ktrips.net