ขอสอบถามการทำงานของรีเลย์

คือผมอยากทราบการทำงานของรีเลย์เมื่อค่าECต่ำแล้วต้องการให้รีเลย์ตัวแรกทำงานปล่อยปุ๋ยลงถังรดน้ำเป็นเวลา5วินาที แล้วจึงรดน้ำเองอัตโนมัติเป็นเวลา2-3ชั่วโมง หลังจากรีเลย์ตัวแรกหยุดทำงาน รีเลย์ตัวที่สองก็จะทำงานปล่อยปุ๋ยอีกชนิดลงไปเป็นเวลา5วินาที แล้วจึงรดน้ำเป็นเวลา2-3ชั่วโมงแบบเดิมเดิม โดยมีโมดุลนาฬิกาช่วยการทำงาน ผมการเขียนโค้ดยังไงครับขอพี่ช่วยแนะนำหน่อยครับ

#define BLYNK_PRINT Serial
#include <MCP3008.h>
#include <ESP8266WiFi.h> //เรียกใช้ไลเบอรี่
#include <BlynkSimpleEsp8266.h>
#include <SimpleTimer.h>
#include <DHT.h>
#define DHTPIN 0   // กำหนดช่องพินของเซนเชอร์ ขาD3
#define DHTTYPE DHT22   // DHT 11  ชื่อ ของเซ็นเชอร์ที่ใช้
#define BLYNK_PRINT DebugSerial
#define CS_PIN 15
#define CLOCK_PIN 14
#define MOSI_PIN 13
#define MISO_PIN 12
MCP3008 adc(CLOCK_PIN, MOSI_PIN, MISO_PIN, CS_PIN);
int sensorValue = 0;
int sensorPin = A0;
char RelayPin = 2; //ขาD4 ปั๊มน้ำรดน้ำ ในถังผสม
char Relay1 = 16; //ขาD2 ปั๊มน้ำถัง A
char Relay2 = 5; //ขาD0 ปั๊มน้ำถัง B
char Relay3 = 4; //ขาD0 ปั๊มน้ำถังผสม

char auth[] = "34r2TCne4O8RuuWxkohVrv_sQwKHEDbe";

// Your WiFi credentials.
// Set password to "" for open networks.
char ssid[] = "Sermphan_2.4GHz";
char pass[] = "0987297146";
BlynkTimer timer;
BlynkTimer sensor;         // Timer object for the DHT sensor
BlynkTimer charger;        // Timer object for the charger

DHT dht(DHTPIN, DHTTYPE);
int x_time = 0;
bool _x_time = false;
int chargeCounter = 0;
int chargeTime = 1;

int x_time1 = 0;
bool _x_time1 = false;
int chargeCounter1 = 0;
int chargeTime1 = 1;


int x_time2 = 0;
bool _x_time2 = false;
int chargeCounter2 = 0;
int chargeTime2 = 2;


void myTimerEvent()
{
  float h = dht.readHumidity();
  float t = dht.readTemperature();

  if (isnan(h) || isnan(t))
  {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }
  else
  {
    Serial.print("Humidity: ");
    Serial.print(h);
    Serial.print(" %\t");
    Serial.print("Temperature: ");
    Serial.println(t);
    Blynk.virtualWrite(V5, h);
    Blynk.virtualWrite(V4, t);



  }
}
void setup()
{
  Serial.begin(115200);
  pinMode(sensorPin, INPUT);
  pinMode(RelayPin, OUTPUT);
  digitalWrite(RelayPin, HIGH);
  pinMode(Relay1, OUTPUT);
  pinMode(Relay2, OUTPUT);
   pinMode(Relay3, OUTPUT);
   digitalWrite(Relay1, HIGH);
    digitalWrite(Relay2, HIGH);
     digitalWrite(Relay3, HIGH);
  
 Serial.println("กำลังเชื่อมต่อไปที่ Blynk Server");
 Blynk.connect();




  dht.begin();

  Blynk.begin(auth, ssid, pass, "blynk.iot-cm.com", 8080);

  timer.setInterval(2000L, myTimerEvent);
  timer.setInterval(1000L, countCharger);
  timer.setInterval(1000L, countCharger1);
  timer.setInterval(1000L, countCharger2);
}

void countCharger()
{
    
   if(_x_time == true){ // ถ้ามีการกดปุ่มปั๊ม 1 ครั้ง 
 x_time++; // นับไปครั้งละ 1 วิ แต่ยังจะไม่เข้า loop 5 วิ เพราะยังนับไม่ถึง
  if (x_time > 1) { //นับไปจนกว่า x_time มากกว่า 5

digitalWrite(Relay1, LOW);
Blynk.virtualWrite(V1, LOW); // คืนค่าปุ๊มกดปั๊มให้ Off
Blynk.virtualWrite(V10,chargeCounter);
_x_time = false;
}
}
   
}
void countCharger1()
{
    
   if(_x_time1 == true){ // ถ้ามีการกดปุ่มปั๊ม 1 ครั้ง 
 x_time1++; // นับไปครั้งละ 1 วิ แต่ยังจะไม่เข้า loop 5 วิ เพราะยังนับไม่ถึง
  if (x_time1 > 1) { //นับไปจนกว่า x_time มากกว่า 5

digitalWrite(Relay2, LOW);
Blynk.virtualWrite(V3, LOW); // คืนค่าปุ๊มกดปั๊มให้ Off
Blynk.virtualWrite(V11,chargeCounter1);
_x_time1 = false;
}
}
   
}
void countCharger2()
{
    
   if(_x_time2 == true){ // ถ้ามีการกดปุ่มปั๊ม 1 ครั้ง 
 x_time2++; // นับไปครั้งละ 1 วิ แต่ยังจะไม่เข้า loop 5 วิ เพราะยังนับไม่ถึง
  if (x_time2 > 2) { //นับไปจนกว่า x_time มากกว่า 5

digitalWrite(Relay3, LOW);
Blynk.virtualWrite(V6, LOW); // คืนค่าปุ๊มกดปั๊มให้ Off
Blynk.virtualWrite(V12,chargeCounter2);
_x_time2 = false;
}
}
   
}

BLYNK_WRITE(V1)
{
  int pinValue = param.asInt();     
if ( pinValue == 1){
     x_time = 0;
    _x_time = true;
     digitalWrite(Relay1, HIGH); 
}else{
      _x_time = false;
                    // Set the internal counter value in second
    chargeCounter = chargeTime;
    digitalWrite(Relay1, LOW);
    Blynk.virtualWrite(V10,chargeCounter);
}
}
BLYNK_WRITE(V3)
{
  int pinValue = param.asInt();     
if ( pinValue == 1){
     x_time1 = 0;
    _x_time1 = true;
     digitalWrite(Relay2, HIGH); 
}else{
      _x_time1 = false;
                    // Set the internal counter value in second
    chargeCounter1 = chargeTime1;
    digitalWrite(Relay2, LOW);
    Blynk.virtualWrite(V11,chargeCounter1);
}
}
BLYNK_WRITE(V6)
{
  int pinValue = param.asInt();     
if ( pinValue == 1){
     x_time2 = 0;
    _x_time2 = true;
     digitalWrite(Relay3, HIGH); 
}else{
      _x_time2 = false;
                    // Set the internal counter value in second
    chargeCounter2 = chargeTime2;
    digitalWrite(Relay3, LOW);
    Blynk.virtualWrite(V12,chargeCounter2);
}
}
void loop()
{
  float vall = adc.readADC(0);
  Blynk.virtualWrite(V2, vall);
  delay(1000);
  Serial.print("EC = " );
  Serial.println(vall);
  
  sensorValue = analogRead(A0);

  if (sensorValue >= 640 && sensorValue <= 1024)
  {
    Serial.println(sensorValue);

    digitalWrite(RelayPin, HIGH);
    delay(1500);


  }
  else {
    Serial.println(sensorValue);
    digitalWrite(RelayPin, LOW);
    delay(1000);

  }

  delay(1000);

  Serial.print("Sensor = " );
  Serial.println(sensorValue);


  Blynk.run();
  timer.run(); // Initiates BlynkTimer
}

นี้โค้ดทั้งหมดครับ ผมควรเขียนไปในแนวทางไหนหรอครับ

Code ชุดนี้เป็นแนว เท่านั้นนะครับ

/**คือผมอยากทราบการทำงานของรีเลย์เมื่อค่าECต่ำแล้วต้องการให้รีเลย์ตัวแรกทำงานปล่อยปุ๋ยลงถังรดน้ำเป็นเวลา5วินาที แล้วจึงรดน้ำเองอัตโนมัติเป็นเวลา2-3ชั่วโมง
  หลังจากรีเลย์ตัวแรกหยุดทำงาน รีเลย์ตัวที่สองก็จะทำงานปล่อยปุ๋ยอีกชนิดลงไปเป็นเวลา5วินาที แล้วจึงรดน้ำเป็นเวลา2-3ชั่วโมงแบบเดิมเดิม โดยมีโมดุลนาฬิกาช่วยการทำงาน
  ผมการเขียนโค้ดยังไงครับขอพี่ช่วยแนะนำหน่อยครับ**/

#include <ESP8266WiFi.h>                  //โหลดไลบารี่ ..มาใช้งาน     //https://github.com/esp8266/Arduino
#include <ESP8266WebServer.h>             //โหลดไลบารี่ ..มาใช้งาน
#include <WiFiManager.h>                  //โหลดไลบารี่ ..มาใช้งาน     //https://github.com/tzapu/WiFiManager
#include <FS.h>                           //โหลดไลบารี่ ..มาใช้งาน     //this needs to be first, or it all crashes and burns...
#include <DNSServer.h>                    //โหลดไลบารี่ ..มาใช้งาน
#include <ArduinoJson.h>                  //โหลดไลบารี่ ..มาใช้งาน     //https://github.com/bblanchon/ArduinoJson
//------------------------------------------------------------------------------------------------------------------------//
#include <BlynkSimpleEsp8266.h>           //โหลดไลบรารี่ ของ BLYNK      มาใช้งาน
//------------------------------------------------------------------------------------------------------------------------//




//------------------------------        การกำหนดค่าในส่วนของ Blynk         ------------------------------------------------//
#define BLYNK_DEBUG
#define BLYNK_PRINT Serial        // ใส่ความคิดเห็นในส่วนนี้เพื่อปิดการใช้งานพิมพ์และประหยัดพื้นที่

int blynkIsDownCount = 0;        //Integer Variable ตัวแปรชื่อ blynkIsDownCount ใช้เก็บเลขจำนวนเต็ม โดยเริ่มต้นให้มีค่า = 0

char blynk_token[34] = "8dwBaSBOE8htLFrK37JPAYB1hmaw8TaQkU";//ใส่ Blynk_token ของเราที่ Blynk ส่งมาทาง Email ตอน Create Project ใหม่

BlynkTimer timer;  //เรียกใช้การตั้งเวลาของ Blynk
//ฟังชั่นเปิดใช้งาน BlynkTimer ซึ่งทำหน้าที่คล้าย ๆ interrupt timer หมายถึงเมื่อครบเวลาตามที่กำหนดไว้โปรแกรมหลักจะกระโดด
//ไปทำงานในโปรแกรมตอบสนองที่กำหนดไว้
//กรณีนี้จะนำฟังชั่นที่เปิดใช้งาน BlynkTimer ไปใช้ในการ เชื่อมต่อซ้ำ (reconnecting)
//โดยรูปแบบคำสั่ง คือ timer.setInterval(30000L, reconnecting); อยู่ใน void setup

WidgetLED led_1(V10);// Relay 1 ปล่อยปุ๋ย A ลงถัง
WidgetLED led_2(V12);// ปั๊มรดน้ำทำงาน
WidgetLED led_3(V11);// Relay 2 ปล่อยปุ๋ย B ลงถัง


//----------------------------------  กำหนดหมายเลขของขาของ Node MCU ESP 8266  --------------------------------------------//

#define D0 16 // ใช้ไฟ LED สีฟ้า ของบอร์ด MCU ESP8266 ให้มีสัญญาณไฟกระพริบ ตาม Code ที่เขียน

#define D3 0 // ใช้เป็นปุ่มกด เพื่อเข้า AP Config ได้ตามความต้องการของผู้ใช้
//------------------------------------------------------------------------------------------------------------------------//


#include <Scheduler.h>

#include <DHT.h>
#define DHTTYPE DHT21
#define DHTPIN  D6
DHT dht(DHTPIN, DHTTYPE);

//--Temp
int v1;//Min
int v2;//Max


int a1 = 0;
int a2 = 0;



const long oneSecond  = 10000;               // 1000 มิลลิวินาที = 1 วินาทีเท่ากับ
const long oneMinute  = oneSecond * 60;     //    1 นาที     = 1 วินาที  x 60 วินาที
const long oneHour    = oneMinute * 60;     //    1 ชั่วโมง   = 1 นาที   x 60 นาที
const long threeHour  = oneHour * 3;       //    3 ชั่วโมง     = 1 ชั่วโมง x 3 ชั่วโมง







bool shouldSaveConfig = false;

//callback notifying us of the need to save config
void saveConfigCallback () {
  Serial.println("Should save config");
  shouldSaveConfig = true;
}
//------------------------------------------------------------------------------------------------------------------------//


//-------------สำหรับ Server local ที่แจกให้ เพิ่ม **** แค่ 2 บรรทัดนี้--------------   (ถ้าเป็น Blynk Server ปกติไม่ต้องใส่)  ----------//
char server[] = "oasiskit.com";
int port = 8080;
//------------------------------------------------------------------------------------------------------------------------//





BLYNK_WRITE(V1)// ตั้งค่า อุณหภูมิ Min

{
  v1 = param.asInt();

}


BLYNK_WRITE(V2)// ตั้งค่า อุณหภูมิ Max

{
  v2 = param.asInt();

}







class Task_1 : public Task {
  protected:
    void setup() { }


    void loop()  {

      //-----------------------------------------------------------------------------------------------------------//
      if (Blynk.connected())
      {
        Blynk.run();
        digitalWrite(D0, LOW);

      } else {

        digitalWrite(D0, LOW);
        delay(200);
        digitalWrite(D0, HIGH);
        delay(100);

      }
      //-----------------------------------------------------------------------------------------------------------//

      timer.run();//ให้เวลาของ Blynk ทำงาน

      delay(100);

    }
} Task_1_task;




class Task_2 : public Task {
  protected:
    void setup() { }


    void loop()  {

      float t ;
      t = dht.readTemperature();

      Blynk.virtualWrite(V3, t);


      if ( t > v1 && t <= v2 ) {

        led_1.off();
        led_3.off();


      }
      else if (a1 == 0) {

        led_1.on();
        delay(5000);
        led_1.off();
        a1 = 1;
      }

    }





} Task_2_task;





class Task_3 : public Task {
  protected:
    void setup() { }


    void loop()  {
      if (a1 == 1) {

        led_2.on();
        delay(oneSecond);//ทดสอบทำแค่ 10 วินาที
        led_2.off();
        led_3.on();
        delay(5000);
        led_3.off();
        led_2.on();
        delay(oneSecond);//ทดสอบทำแค่ 10 วินาที
        led_2.off();
        a1 = 0;
      }

      delay(10);
    }





} Task_3_task;













//------------------------------------------------------------------------------------------------------------------------//
//*********************************************       void setup        **************************************************//
//------------------------------------------------------------------------------------------------------------------------//

void setup() {

  //-------IO NODE MCU Esp8266-------//
  pinMode(D0, OUTPUT);      //กำหนดโหมดใช้งานให้กับขา D0 เป็นขา สัญญาณไฟ ในสภาวะต่างๆ
  pinMode(D3, INPUT_PULLUP);//กำหนดโหมดใช้งานให้กับขา D3 เป็นขา กดปุ่ม ค้าง เพื่อตั้งค่า AP config


  // ให้ LED ทั้งหมดดับก่อน
  digitalWrite(D0, LOW);//ให้หลอด LED สีฟ้าดับก่อน

  //-------------------------------//


  Serial.begin(115200);
  //-------------------------------//

  dht.begin();





  //read configuration from FS json
  Serial.println("mounting FS...");

  if (SPIFFS.begin()) {
    Serial.println("mounted file system");

    if (SPIFFS.exists("/config.json")) {
      //file exists, reading and loading
      Serial.println("reading config file");
      File configFile = SPIFFS.open("/config.json", "r");

      if (configFile) {
        Serial.println("opened config file");
        size_t size = configFile.size();
        // Allocate a buffer to store contents of the file.
        std::unique_ptr<char[]> buf(new char[size]);

        configFile.readBytes(buf.get(), size);
        DynamicJsonBuffer jsonBuffer;
        JsonObject& json = jsonBuffer.parseObject(buf.get());
        json.printTo(Serial);
        if (json.success()) {
          Serial.println("\nparsed json");
          strcpy(blynk_token, json["blynk_token"]);

        } else {
          Serial.println("failed to load json config");
        }
      }
    }
  } else {
    Serial.println("failed to mount FS");
  }
  //end read











  //**************************        AP AUTO CONNECT   ********************************************//

  WiFiManagerParameter custom_blynk_token("blynk", "blynk token", blynk_token, 34);

  //WiFiManager
  //Local intialization. Once its business is done, there is no need to keep it around
  WiFiManager wifiManager;

  //set config save notify callback
  wifiManager.setSaveConfigCallback(saveConfigCallback);
  wifiManager.addParameter(&custom_blynk_token);


  for (int i = 5; i > -1; i--) {  // นับเวลาถอยหลัง 5 วินาทีก่อนกดปุ่ม AP Config
    digitalWrite(D0, HIGH);
    delay(500);
    digitalWrite(D0, LOW);
    delay(500);
    Serial.print (String(i) + " ");//แสดงข้อความใน Serial Monitor
  }


  if (digitalRead(D3) == LOW) {
    digitalWrite(D0, HIGH);
    Serial.println("Button Pressed");

    wifiManager.resetSettings();




    if (!wifiManager.autoConnect("PUYIOT AP CONFIG")) {
      Serial.println("failed to connect and hit timeout");
      delay(3000);
      //reset and try again, or maybe put it to deep sleep
      ESP.reset();
      delay(5000);

    }
  }



  Serial.println("Connected.......OK!)");
  strcpy(blynk_token, custom_blynk_token.getValue());


  //save the custom parameters to FS
  if (shouldSaveConfig) {
    Serial.println("saving config");
    DynamicJsonBuffer jsonBuffer;
    JsonObject& json = jsonBuffer.createObject();
    json["blynk_token"] = blynk_token;
    File configFile = SPIFFS.open("/config.json", "w");

    if (!configFile) {
      Serial.println("failed to open config file for writing");

    }
    json.printTo(Serial);
    json.printTo(configFile);
    configFile.close();
    //end save
  }

  //**************************    จบ    AP AUTO CONNECT   *****************************************//




  Serial.println("local ip");
  delay(100);
  Serial.println(WiFi.localIP());
  Serial.println("gateway");
  delay(100);
  Serial.println(WiFi.gatewayIP());
  Serial.println("subnetMask");
  delay(100);
  Serial.println(WiFi.subnetMask());
  Serial.println("SSID");
  delay(100);
  Serial.println(WiFi.SSID());
  Serial.println("Password");
  delay(100);
  Serial.println(WiFi.psk());


  Blynk.config(blynk_token, server, port);
  ////เริ่มการเชื่อมต่อ Blynk Server*********สำหรับ Server local ที่แจกให้ เพิ่ม, server, port  แค่นี้จบ



  timer.setInterval(30000L, reconnecting);  //Function reconnect

  //ตั้งเวลาส่งข้อมูลให้ Blynk Server ทุกๆ 30 วินาที



  Scheduler.start(&Task_1_task);
  Scheduler.start(&Task_2_task);
  Scheduler.start(&Task_3_task);
  Scheduler.begin();




}


//------------------------------------------------------------------------------------------------------------------------//
//*********************************************   จบ  void setup        **************************************************//
//------------------------------------------------------------------------------------------------------------------------//









//------------------------------------------------------------------------------------------------------------------------//
//*********************************************       void Loop        ***************************************************//
//------------------------------------------------------------------------------------------------------------------------//


void loop() {





}

//------------------------------------------------------------------------------------------------------------------------//
//*********************************************      จบ void Loop       **************************************************//
//------------------------------------------------------------------------------------------------------------------------//









//------------------------------------------------------------------------------------------------------------------------//
void reconnecting()
{
  if (!Blynk.connected())
  {
    blynkIsDownCount++;
    BLYNK_LOG("blynk server is down! %d  times", blynkIsDownCount);
    Blynk.connect(5000);
  }
}

ผมใช้ Temp แทน EC นะครับ มี Slide bar บังคับให้ เป็นค่า Min หรือ Max ได้ เพื่อทดสอบการทำงานของระบบ ส่วนเรื่องของเวลาในการทำงาน ผม Set ค่า Delay เอาครับ โดยมีการทำงาน ตามเงื่อนไขที่คุณให้นั่นแหละครับ แต่เงื่อนไขก็ยังไม่สมบูรณ์อยู่

ครับพี่ ขอบคุณมากครับผมจะนำมาใช้เป็นแนวทางแก้ไขน่ะครับ:pray::pray::pray: