別ブログで記事にした、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センサーとポンプの購入
・盆栽の購入