S.hayaのアイコン画像

【家庭菜園】遠隔操作での水遣り、プラス 温度、湿度計測用のマイコンの遠隔再起動

S.haya 2021年05月04日に作成  (2021年05月04日に更新)
  • 【はじめに】
    半年ほど前から家庭菜園を試みています。室外に温室を設置しESP32マイコンで温度、湿度、照度を計測、その結果からコンセント型のタイマーの時間を設定し水やりを行ってきましたが、各センサーがハングアップしたり水がうまく流れなかったりとなかなかうまくいきませんでした。温室が室外のためセンサーがハングすると毎回外に出て電源の上げ直しが必要で大変面倒だったのでObnizを利用し遠隔で操作出来ないかトライしてみました。

・やりたいこと

  1. 遠隔操作による水やり
  2. マイコンの遠隔再起動(センサーの電源OFF-ON)
  3. 温度調整(風の循環)
  4. 温室の温湿度情報の収集(元々ESP32で実施していたのでそのまま利用)

・用意する物

  1. obniz Board 1Y (3.3Vと+、ーあるので1Yの方が便利)
  2. ポンプ(水遣り用:Amazonで購入 WayinTop 小型ポンプ DC3V 5V )
  3. リレー(手持ち品 ※上記ポンプについているものでOK)
  4. ハンディ―扇風機(100均)
  5. サーボモータ(扇風機の首振り用)
  6. ESP32本体
  7. ESP32への接続用 BME280(温度、湿度、気圧センサ)
  8. ESP32への接続用 BH1750(光量センサ)
  9. ESP32への接続用 土壌湿度センサー(上記ポンプについてるもの)
  10. Ambient(外部サービス)
  11. その他 ブレッドボード、配線、ケース、結束バンド、水やり用チューブ、電源など

※温度、湿度など各センサーの情報収集は元々ESP32にて実施していたのでそのまま継続利用する事にしました。ESP32、Ambientに関しては特に説明致しませんので詳しくはメーカのサイトを参照ください。

  • 【使い方】
  1. Ambientの画面からセンサー情報(温度、湿度、光量、土壌湿度)を確認する。
  2. センサーの値が更新されていなければマイコンの電源を上げなおす。
  3. 土壌湿度が不足していたらポンプを作動して水やりを行う。
  4. 気温が高い場合は扇風機を回す。
  5. しばらく待って再度センサー情報で状況が改善されているか確認する。

【参考:Ambient画面 画面コピペするサイズの関係で4項目のみ表示】
キャプションを入力できます

【obniz画面】

キャプションを入力できます

【扇風機を回しているところ】
キャプションを入力できます

【水やりをしているところ】
キャプションを入力できます

  • 【配線図】
    キャプションを入力できます

【動画① ESP32の電源OFFとON マイコン中央のLED点灯、消灯】

ここに動画が表示されます

【動画② 扇風機のOFFとON、風量パワーの変更と首振り】

ここに動画が表示されます

動画③ 水やりポンプのOFFとON と 水量変更】

ここに動画が表示されます

  • 【接続:obnizからの接続】
obniz 接続先 ケーブル
0 サーボ 茶色
1 サーボ 赤色
2 サーボ 黄色
3 扇風機 プラス
4 扇風機 マイナス
5 ポンプ 白色
6 ポンプ 黒色
7 -- --
8 -- --
9 リレー IN
10 リレー V
11 リレー GND
- ESP32 GND
3.3v ESP32 3V3
+ -- --

【<参考> 接続:ESP32からの接続】

ESP32 接続先 ケーブル 接続先 ケーブル 接続先 ケーブル |
3V3 BME280 VCC と SDO BH1750 VCC 土壌湿度 VCC |
GND BME280 GND BH1750 GND と ADD 土壌湿度 GND |
D21 BME280 SDA BH1750 SDA 土壌湿度 -- |
D22 BME280 SCL BH1750 SCL 土壌湿度 -- |
VP BME280 -- BH1750 -- 土壌湿度 AOUT |
  • 【obnizのソース】
<!-- HTML Example -->
<html>
  <head>
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <script src="https://obniz.com/js/jquery-3.2.1.min.js"></script>
    <script src="https://unpkg.com/obniz@3.14.0/obniz.js"></script>
  </head>
  <body>
    <div id="obniz-debug"></div>
    <h1>obniz ESP32電源off/on 水やり 風循環</h1>
    <h2>EMP32 電源停止/開始</h2>
    <button id="DOWN">電源停止</button> <button id="UP">開始</button><br /><br />
    <h3>扇風機 開始/停止 風量バー</h3>
    <button id="START">開始</button> <button id="STOP">停止</button>
    <input id="slider2" type="range" min="0" max="100" /><br /><br />
    <h3>扇風機 旋回バー</h3>
    <input id="slider" type="range" min="0" max="180" /><br /><br />
    <h3>給水ポンプ ON/OFF 水量調整バー</h3>
    <button id="POMPON">POMPON</button> <button id="POMPOFF">POMPOFF</button>
    <input id="slider3" type="range" min="0" max="100" /><br />
    <script>
     var obniz = new Obniz("OBNIZ_ID_HERE");
     obniz.onconnect = async function () {
       var servo = obniz.wired("ServoMotor", { gnd: 0, vcc: 1, signal: 2 });
       $("#slider").on("input", function () {
         servo.angle($("#slider").val());
       });

       obniz.io9.output(false);
       obniz.io10.output(1);
       obniz.io11.output(false);
       //var led = obniz.wired("LED", { anode: 10, cathode: 11 });
       $("#DOWN").on("click", function () {
         obniz.io9.output(1);
         DOWN.style.backgroundColor = "gray";
         UP.style.backgroundColor = "silver";
       });
       $("#UP").on("click", function () {
         obniz.io9.output(false);
         DOWN.style.backgroundColor = "silver";
         UP.style.backgroundColor = "gray";
       });
      
       obniz.io3.output(false);
       obniz.io4.output(false);
       var motor = obniz.wired("DCMotor", { forward: 3, back: 4 });
       $("#START").on("click", function () {
         motor.forward();
         START.style.backgroundColor = "gray";
         STOP.style.backgroundColor = "silver";
       });
       $("#STOP").on("click", function () {
         motor.stop();
         START.style.backgroundColor = "silver";
         STOP.style.backgroundColor = "gray";
       });
       $("#slider2").on("input", function () {
         motor.power($("#slider2").val());
       });
       
       obniz.io5.output(false);
       obniz.io6.output(false);
       var pomp = obniz.wired("DCMotor", { forward: 5, back: 6 });
       $("#POMPON").on("click", function () {
         pomp.forward();
         POMPON.style.backgroundColor = "gray";
         POMPOFF.style.backgroundColor = "silver";
       });
       $("#POMPOFF").on("click", function () {
         pomp.stop();
         POMPON.style.backgroundColor = "silver";
         POMPOFF.style.backgroundColor = "gray";
       });
       $("#slider3").on("input", function () {
         pomp.power($("#slider3").val());
         //motor.move(true);
       });
     };
</script>
  </body>
</html>

【参考 : ESP32のソース】

/*
 * BME280で5分毎に温度、湿度、気圧、光量、土壌湿度を測定し、Ambientに送信する

  Complete project details at http://randomnerdtutorials.com  
  ボードマネージャのURL : https://dl.espressif.com/dl/package_esp32_index.json
  ボード:ESP32 Dev Module
  [I2C]
  PIn ESp32    ESP8266     BME280
       3V3     3V3       +(V)
       GND     GND       -(GND)
       D22     D1        SCL
       D21     D2        SDA
       NC      NC        CSB
       VCC     VCC       SDO  注意!必須です
  
  20201010 ADD  

*********/
/*

  Advanced BH1750 library usage example

  This example has some comments about advanced usage features.

  Connection:

    VCC -> 3V3 or 5V
    GND -> GND
    SCL -> SCL (A5 on Arduino Uno, Leonardo, etc or 21 on Mega and Due, on esp8266 free selectable)
    SDA -> SDA (A4 on Arduino Uno, Leonardo, etc or 20 on Mega and Due, on esp8266 free selectable)
    ADD -> (not connected) or GND

  ADD pin is used to set sensor I2C address. If it has voltage greater or equal to
  0.7VCC voltage (e.g. you've connected it to VCC) the sensor address will be
  0x5C. In other case (if ADD voltage less than 0.7 * VCC) the sensor address will
  be 0x23 (by default).

*/
/*
 * Moisture Sensor V1.2
 *  VCC -> 3V3 
 *  GND -> GND
 *  AOUT-> A0  ボード表示 VP 
 */

// #include <ESP8266WiFi.h>
#include <SPI.h>
// #include "BME280_SPI.h"
#include "Ambient.h"
//#include <Wire.h>
#include <Adafruit_BME280.h>
#include <BH1750.h>

#define BME_CS 15
#define PERIOD 300

//Moisture Sensor INPUT PIN
#define MOIS_PIN A0

Adafruit_BME280 bme; // use I2C interface
Adafruit_Sensor *bme_temp = bme.getTemperatureSensor();
Adafruit_Sensor *bme_pressure = bme.getPressureSensor();
Adafruit_Sensor *bme_humidity = bme.getHumiditySensor();
// BME280 bme280;
WiFiClient client;
Ambient ambient;


const char* ssid     = "xx-xxx";
const char* password = "0000000000000";

unsigned int channelId = zzzzzzzz; // AmbientのチャネルID
const char* writeKey = "zzzzzzzzzzzzzzzzzzzzzzz"; // ライトキー

/*
  BH1750 can be physically configured to use two I2C addresses:
    - 0x23 (most common) (if ADD pin had < 0.7VCC voltage)
    - 0x5C (if ADD pin had > 0.7VCC voltage)

  Library uses 0x23 address as default, but you can define any other address.
  If you had troubles with default value - try to change it to 0x5C.

*/
BH1750 lightMeter(0x23);

void setup()
{  
    Serial.begin(115200);
    delay(10);

    Serial.println("Start");

    WiFi.begin(ssid, password);  //  Wi-Fi APに接続
    while (WiFi.status() != WL_CONNECTED) {  //  Wi-Fi AP接続待ち
        delay(100);
    }

    Serial.print("WiFi connected\r\nIP address: ");
    Serial.println(WiFi.localIP());

    // bme280.begin(BME_CS);
  if (!bme.begin()) {
    Serial.println(F("Could not find a valid BME280 sensor, check wiring!"));
    while (1) delay(10);
  }
  bme_temp->printSensorDetails();
  bme_pressure->printSensorDetails();
  bme_humidity->printSensorDetails();
  
  ambient.begin(channelId, writeKey, &client); // チャネルIDとライトキーを指定してAmbientの初期化

  Wire.begin();

  // begin returns a boolean that can be used to detect setup problems.
  if (lightMeter.begin(BH1750::CONTINUOUS_HIGH_RES_MODE)) {
    Serial.println(F("BH1750 Advanced begin"));
  }
  else {
    Serial.println(F("Error initialising BH1750"));
  }

  pinMode(MOIS_PIN,INPUT);
  
}

void loop()
{
    double temp, humid, pressure;

  sensors_event_t temp_event, pressure_event, humidity_event;
  bme_temp->getEvent(&temp_event);
  bme_pressure->getEvent(&pressure_event);
  bme_humidity->getEvent(&humidity_event);
  
 //   temp = bme280.readTemperature();
 //   humid = bme280.readHumidity();
 //   pressure = bme280.readPressure();
 
   temp = temp_event.temperature;
   humid = humidity_event.relative_humidity;
   pressure = pressure_event.pressure;
 

   float lux = lightMeter.readLightLevel();

   // 202010501 ADD Moisture Sensor 
   float moist = analogRead(MOIS_PIN);

    Serial.print("temp: ");
    Serial.print(temp);
    Serial.print(", humid: ");
    Serial.print(humid);
    Serial.print(", pressure: ");
    Serial.print(pressure);
    Serial.print(", Light:  ");
    Serial.print(lux);
    Serial.print(", Moisture:  ");
    Serial.println(moist);
    
    ambient.set(1, temp);     // 温度   をデータ1にセット
    ambient.set(2, humid);    // 湿度   をデータ2にセット
    ambient.set(3, pressure); // 気圧   をデータ3にセット
    ambient.set(4, lux);      // 光量   をデータ4にセット
    ambient.set(5, moist);    // 土壌湿度をデータ5にセット

    ambient.send(); // データをAmbientに送信
  

    delay(PERIOD * 1000);   
}
  • 【感想】
    ESP32マイコンの電源off/onが遠隔で可能となり大変便利になりました。
    また、直接モータ類が制御出来る便利さを実感しました。以前ポンプは100V電源で使用できるものをタイマー付きコンセントとセットで使っていましたが家庭菜園で使うにはパワーが大きいため水が溢れたり使いにくかったのですが、obnizは適当な小型のポンプなら何も考えずにそのまま繋いで動かせたので大変便利でした。
    ただ、電源容量は注意が必要で当初電源コンセント(USB変換)に手持ちの安物を使っていたところ、扇風機とポンプを回していたらESP32が動かなくなりました。どうやら電源不足だった様で容量の大きな物に取り替えたら問題無く動きました。(接続している装置にも依存すると思います)
S.haya さんが 前の火曜日の9:35 に 編集 をしました。 (メッセージ: 初版)
S.haya さんが 前の火曜日の9:38 に 編集 をしました。
S.haya さんが 前の火曜日の9:46 に 編集 をしました。
ログインしてコメントを投稿する