タニーさんは水中ポンプでやらかしたので花や野菜の自動水やり機を作る。

# 自動水やり機
<iframe width="923" height="1641" src="https://www.youtube.com/embed/kWmqPN1QIiQ" title="水浸し事件の教訓！タニーさんが作ったシンプル自動水やり器【TANI-Lab】" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

## 回路
ACアダプタ -> TLP-A100.Type-C.INPUT
TLP-A100.VBUS.OUTPUT -> TLP-P050.VIN
TLP-A100.VBUS.GND -> TLP-P050.GND
TLP-P050.VOUT -> Pump1.Posi
TLP-P050.VOUT -> Pump2.Posi
TLP-P050.GND -> Pump1.Nega
TLP-P050.GND -> Pump2.Nega
TLP-A100.Type-C.OUTPUT -> ESP32.MicroUSB
TLP-A100.MicroUSB -> PC

ESP32.PIN17 -> TLP-P050.EN

## 参考
 https://lang-ship.com/blog/work/esp32-tcp-ip-socket/
 https://dev.classmethod.jp/articles/esp32_flash_io/


## プログラム

~~~diff_cpp
#include <WiFi.h>
#include <FS.h>
#include <SPIFFS.h>

const char *ssid = "ssid";
const char *password = "password";

struct tm timeInfo;
#include <WiFiClient.h>

WiFiServer server(5000);
char tstr[20];
char tcp_buf[256];

long cmds[10];
int cc;

byte bMT;
const int PIN_MT = 17;

void WifiDateTime( void ){
  if (WiFi.begin(ssid, password) != WL_DISCONNECTED) {
    ESP.restart();
  }

  Serial.println("Connecting.\n");

  while (WiFi.status() != WL_CONNECTED) {
    Serial.println(".");
    delay(1000);
  }

  Serial.println("Connected!");
  Serial.printf("IP Address  : ");
  Serial.println(WiFi.localIP());
  
  configTzTime("JST-9", "ntp.nict.jp", "ntp.jst.mfeed.ad.jp");

  getLocalTime(&timeInfo);
  
  server.begin();
}

void GetSetting( void ){
  for ( int i=0; i<10; i++ ){
    cmds[i] = 0;
  }
  bMT= LOW;
  cc=0;
  SPIFFS.begin( true );

  fs::FS fs = SPIFFS;
  File file = fs.open("/hello.txt");
  while(file.available()){
    String s = file.readStringUntil('\n'); 
    char b[ 255 ];
    sprintf( b, "%s", s );
    cmds[cc] = atol( b );
    cc++;
    Serial.println( s );
  }
  file.close();
  
}

long GetTimeSerial( void ){
  sprintf( tstr, "%04d/%02d/%02d",
          timeInfo.tm_year + 1900, timeInfo.tm_mon + 1, timeInfo.tm_mday );
  Serial.println( tstr );
  
  sprintf( tstr,"%02d%02d%02d",
          timeInfo.tm_hour, timeInfo.tm_min, timeInfo.tm_sec );
  Serial.println( tstr );
  return atol( tstr );
}

void checkWifiClient( void ){
  WiFiClient client = server.available();
  if (client) {
    int readLength=0;
    memset( tcp_buf, 0, 255 );
    String s;
    cc=0;
    while (client.connected()) {
      int size = client.available();

      if (size > 0) {
        for (int i = 0; i < size; i++) {
          uint8_t c = client.read();
          tcp_buf[ readLength ] = c;
          readLength++;
        }
      }            
      delay(1);
    }
    client.stop();
    
    Serial.println( readLength );
    Serial.println( tcp_buf );

    char* c;
    c = strtok(tcp_buf, ":");
    while( 1 ) {
      if ( atoi( c ) == 0 ) { 
        if ( cc == 0) {
          c++;
        }else{
          break;
        }
      }
      cmds[cc] = atol( c )*1000000;
      c=strtok(NULL, ":");
      cmds[cc] += atol( c )*10000;
      c=strtok(NULL, ":");
      cmds[cc] += atol( c )*100;
      c=strtok(NULL, ";");
      cmds[cc] += atol( c );
      cc++;
      c=strtok(NULL, ":");
    }

    fs::FS fs = SPIFFS;
    File file = fs.open("/hello.txt", FILE_WRITE);
    char cb[255];
    for ( int i=0; i<cc; i+=2 ){
      Serial.println( cmds[ i ] );
      Serial.println( cmds[ i+1 ] );
      sprintf( cb, "%d", cmds[ i ] );
      file.println(cb);
      sprintf( cb, "%d", cmds[ i+1 ] );
      file.println(cb);
    }
    file.close();
    

  }
  
}

long getLocalTimeProc( void ){
  long si=0;
  getLocalTime(&timeInfo);
  
  if (timeInfo.tm_year != 70) {
    si = GetTimeSerial();

    checkWifiClient();

    for ( int i=0; i<cc; i+=2 ){
      if ( ( cmds[ i ] / 1000000 ) == 1 ) {
        long t1=cmds[ i+0 ] - 1000000;
        long t2=cmds[ i+1 ] - 2000000;
        if ( ( si > t1 ) && ( si < t2 ) ){
          if ( bMT == LOW ){
            bMT = HIGH;
            digitalWrite(PIN_MT, HIGH);
            Serial.println( "MT ON.");
          }
        }else{
          if ( bMT == HIGH ) {
            bMT = LOW;
            digitalWrite(PIN_MT, LOW);
            Serial.println( "MT OFF.");
          }
        }
      }
    }
  }

}

void setup() {
  Serial.begin(115200);
  pinMode(PIN_MT, OUTPUT);
  digitalWrite(PIN_MT, LOW);

  WifiDateTime();
  GetSetting();
  
}

void loop() {
  long si;
  si = getLocalTimeProc();
  if ( si == 0 ){
    Serial.println( "...sync.");
  }
  delay(1000);
}
~~~