別ブログで記事にした、M5Stackを使用した自動水やり機・環境計測装置をこちらにも転載します。
****************************************************************

2019/03/24

◆概要
  ・Earthセンサーが未入手なのでAngleユニットで代用。
  ・ポンプが未入手なのでトランジスタ以降をLEDで代用。

ということで、今回は以下を行います。
・環境センサーの動作
・アナログ入力の値によってGPIOのON/OFF
・DeepSleepモードへ移行、一定時間後に再起動

◆プログラム
  ArduinoIDEで作りました。
  ・_190324_M5Stack_Watering_test.ino
  ・BME280.h
  ・BME280.cpp
   の3つで構成しています。
「BME280.h」 「BME280.cpp」はこちらからコピーして、IDE右上の▼をクリックして新規タブを開いてペーストしてください。
  タブの名前は元ファイルと同じにしてください。(ライブラリの自作方法と同じです。)


_190324_M5Stack_Watering_test.ino


#include <M5Stack.h>
#include <Wire.h>
#include "BME280.h"
#include "esp_deep_sleep.h"

//ENV
BME280 bme280;

//Earth
float Earth_limit = 1000; //土壌湿度のリミット
uint16_t analogRead_value = 0;
uint16_t digitalRead_value = 0;
int Earth_digiPin = 26;
int Earth_anaPin = 36;

//水やり
int pomp_pin = 2;
int pomp_delay = 5 * 1000; //ポンプON時間
int WateringAct = 0;


void DeepSleepConfig() { //DeepSleep設定
 esp_deep_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_OFF);
 esp_deep_sleep_pd_config(ESP_PD_DOMAIN_RTC_SLOW_MEM, ESP_PD_OPTION_OFF);
 esp_deep_sleep_pd_config(ESP_PD_DOMAIN_RTC_FAST_MEM, ESP_PD_OPTION_OFF);
 esp_deep_sleep_pd_config(ESP_PD_DOMAIN_MAX, ESP_PD_OPTION_OFF);
}

String ENVRead() { //ENV計測
 float tmp = (float)bme280.readTemperature();
 float hum = (float)bme280.readHumidity();
 float pressure = (float)bme280.readPressure();
 Serial.printf("Tmp: %2.2fdegC Hum: %0.2f%% Prs: %0.2fPa\r\n", tmp, hum, pressure);
 return "Tmp:" + String(tmp, 2) + "degC, Hum:" + String(hum, 2) + "h%%";
}

String EarthRead() { //Earth計測
 analogRead_value = analogRead(Earth_anaPin);// read analog value of EARTH
 digitalRead_value = digitalRead(Earth_digiPin);// read digital value of EARTH
 Serial.printf("Earth_ana: %d Earth_degi: %d \r\n", analogRead_value, digitalRead_value);
 return "Earth:" + digitalRead_value;
}

String Watering() { //水やり動作 土壌湿度がリミットより低い場合ポンプON
 if (analogRead_value < Earth_limit ) {
  Serial.println("do");
  digitalWrite(pomp_pin, HIGH);
  delay(pomp_delay);
  digitalWrite(pomp_pin, LOW);
  return "do"; //水やりを実行します
 } else {
  Serial.println("do not");
  return "do not"; //水やりを行いません
 }
}

//========================================================================
void setup() {
 M5.begin();
 Wire.begin();
 Serial.begin(115200);
 Serial.println("WakeUp ");
 DeepSleepConfig();

//i2c(ENV)設定
 pinMode(21, INPUT_PULLUP); //デファルトのSDAピン21 のプルアップの指定
 pinMode(22, INPUT_PULLUP); //デファルトのSDAピン22 のプルアップの指定
 bme280.begin(); // BME280の初期化

//Earth設定
 dacWrite(25, 0);//話し声無効
 pinMode(Earth_digiPin, INPUT);

//水やり設定
 pinMode(pomp_pin, OUTPUT);
 digitalWrite(pomp_pin, LOW);
}


void loop() { //動作プログラム
 Serial.println("Start");

 ENVRead();
 EarthRead();
 Watering();

 delay(1000);

//DeepSleep Start
 Serial.println("DeepSleep");
 esp_deep_sleep_enable_timer_wakeup(15 * 1000 * 1000); //15s後に起動
 esp_deep_sleep_start();
}


◆動作内容と結果
  ・動作内容
    起動→Tmp,Hum,Pres,Earth_ana,Earth_degiの値を表示。
    Earth_anaの値が設定値(Earth_limit)より小さいと"do"を表示、GPIO2が設定時間(pomp_delay)ON(LEDが点灯)。大きい場合は"do not"を表示。
    Earth_anaはAngleユニットを回すことで変えることが可能。
    DeepSleepに移行。15秒後に再起動して始めに戻る。

  ・動作結果(シリアルモニタ)
   1回目はEarth_anaが0のため"do"、2回目は1971のため"do not"となっている。
   LEDも"do"の場合のみ点灯していた。
   DeepSleepの際に時計機能も停止しているため、起動時の時間表示も進んでいない。(プログラム内のDeepSleepConfig()の中の設定を変えれば時間表示も進められるかも)

 

◆今後
  ・Wifi経由でのLine、Cloudへのデータ送信
  ・Earthセンサーとポンプの購入
  ・盆栽の購入