Yusuke Oike
Published © MIT

mieru

it's able to watch the status of plants water. basic function has notify from LINE.

BeginnerWork in progress3 hours33
mieru

Things used in this project

Hardware components

M5StickC PLUS ESP32-PICO Mini IoT Development Kit
M5Stack M5StickC PLUS ESP32-PICO Mini IoT Development Kit
×1
water pump
×1
soil moisture sensor
×1

Software apps and online services

Arduino IDE
Arduino IDE

Story

Read more

Code

mieru_v1.0

Arduino
If u run it, it can send water to plants automatically. Then notify me that done it from LINE server by themselves.
#include <M5StickCPlus.h>
#include <WiFiClient.h>           // IFTTTを経由する場合必要(WiFiClientSecureと入れ替え)
#include <WiFi.h>                 // 共通で必要
#include <WiFiClientSecure.h>     // LINE Notify 単体の場合必要
#include <WiFiMulti.h>            // 複数のアクセスポイントを動的に切り替えるために必要

#define INPUT_PIN 33
#define PUMP_PIN 32

// WiFiClient client;
WiFiMulti wifiMulti;

bool flag = true;
bool alarm_flg = false;
int rawADC;
int lastWifiStatus = WL_DISCONNECTED;
int btn_pw = 0;
String makerEvent = "";
String makerKey = "";
const char* serverUrl = "";
const char* msg[] = {"power_on...", "water_the_plants!"};

// LINE Notify設定
const char* host = "";
const char* token = "";

WiFiServer server(80);

// 再起動(リスタート)処理
void restart() {
  // 電源ボタン状態取得(1秒以下のONで「2」1秒以上で「1」すぐに「0」に戻る)
  btn_pw = M5.Axp.GetBtnPress();
  if (btn_pw == 2) {  // 電源ボタン短押し(1秒以下)なら
    ESP.restart();    // 再起動
  }
}

// LINE Notify 純正
void notify_line(const char* value) {
  // HTTPSへアクセス(SSL通信)するためのライブラリ
  WiFiClientSecure client;

  // サーバー証明書の検証を行わずに接続する場合に必要
  client.setInsecure();
  
  Serial.println("Try");
  
  //LineのAPIサーバにSSL接続(ポート443:https)
  if (!client.connect(host, 443)) {
    Serial.println("Connection failed");
    return;
  }
  Serial.println("Connected");

  // リクエスト送信
  String query = String("message=") + String(value);
  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');
    if (line == "\r") {
      break;
    }
  }
  
  String line = client.readStringUntil('\n');
  Serial.println(line);  
}

void setup() {
  M5.begin();
  Serial.begin(115200);
  
  M5.Lcd.setTextColor(GREEN);
  M5.Lcd.setTextSize(3);
  M5.Lcd.setRotation(3);
  M5.Lcd.setTextDatum(TC_DATUM);
  M5.Lcd.setCursor(20, 20);
  M5.Lcd.print("mieru");

  pinMode(INPUT_PIN, INPUT);
  pinMode(PUMP_PIN, OUTPUT);
  pinMode(10, OUTPUT);

  digitalWrite(10, 1);
  // WiFiアクセスポイントを追加(他に追加したいアクセスポイントがあったら、ここで追加する)
  wifiMulti.addAP("you62");

    // WiFi接続
  int wifiStatus = wifiMulti.run();

  if(wifiStatus != lastWifiStatus) {
    switch(wifiStatus) {
      case WL_NO_SHIELD:
      Serial.println("no shiled");
      break;
      case WL_IDLE_STATUS:
      Serial.println("idle");
      break;
      case WL_NO_SSID_AVAIL:
      Serial.println("no ssid available");
      break;
      case WL_SCAN_COMPLETED:
      Serial.println("scan completed");
      break;
      case WL_CONNECTED:
      Serial.println("connected");
      Serial.print("ssid:");
      Serial.println(WiFi.SSID());
      break;
      case WL_CONNECT_FAILED:
      Serial.println("connect failed");
      break;
      case  WL_CONNECTION_LOST:
      Serial.println("connection lost");
      break;
      case  WL_DISCONNECTED:
      Serial.println("disconnected");
      break;
    }
    lastWifiStatus = wifiStatus;
  }
  
  M5.Lcd.setTextSize(2);
  M5.Lcd.setCursor(20, 70);
  M5.Lcd.print(WiFi.localIP());
  Serial.println(WiFi.localIP());
  Serial.println("WiFi Ready!");

  server.begin();
  notify_line(msg[0]);
  // doGet(msg[0]);
}

void loop() {
  rawADC = analogRead(INPUT_PIN);
  if (rawADC >= 1850 && !alarm_flg) {
    // doGet(msg[1]);
    notify_line(msg[1]);
    alarm_flg = true;
    digitalWrite(10, 0);
    M5.Beep.tone(2600);
    delay(500);
    M5.Beep.mute();
    // pump start
    digitalWrite(PUMP_PIN, 1);
    delay(1000);
    // flag = !flag;
    // pump stop
    digitalWrite(PUMP_PIN, 0);
  }
  M5.lcd.fillRect(80, 100, 240, 50, BLACK);
  M5.Lcd.setCursor(20, 100);
  M5.Lcd.print("water: " + String(rawADC));
  Serial.print("water: ");
  Serial.println(rawADC);
  if (M5.BtnA.wasPressed()) {
      digitalWrite(PUMP_PIN, 1);
      delay(1000);
      // flag = !flag;
      digitalWrite(PUMP_PIN, 0);
  }
  M5.update();
  delay(500);
}

Credits

Yusuke Oike
1 project • 1 follower
Software Engineer / Technical Sales / Educator(Electronic Information)

Comments