ต้องการสลับโหมด Manual กับ Auto โดยการใช้ปุ่มภายนอกครับ

จากโค้ด คือ สามารถสลับการทำงานระหว่าง Auto กับ Manual ได้แล้วครับ โดยสลับผ่าน Blynk เมื่อกดปุ่มจะเช็คสถานะจาก (switchstatus) 1 เป็น Auto 0 Manual ทีนี้ ผมต้องการให้ปุ่มภายนอกสามารถสลับโหมดการทำงานได้เช่นกันครับ แต่ผมไม่ทราบจะต้องใช้โค้ดในการ รับ - ส่ง ข้อมูลจากปุ่ม ไปสู่การเปลี่ยนโหมดการทำงานได้ยังไงครับ
ช่วยทีครับ เหลือแค่จุดนี้จุดเดียวก็สมบูรณ์แล้วครับ ดูคลิปจากหลายที่และลองพยายามทำตามแล้วครับ ยังไม่ได้เลย

#define BLYNK_PRINT Serial
#define DHTPIN 15
#define DHTTYPE DHT11

#define PUMP 16
#define relayone 17
#define relaytwo 18

#define PUSHBUTTON1    19   //D4
#define PUSHBUTTON2    21   //D5
#define PUSHBUTTON3    22   //D7
#define PUSHBUTTON4    23   //TX

const int moisture1 = 32;
const int moisture2 = 33;
const int moisture3 = 34;
const int moisture4 = 35;
int moisture_value1 = 0;
int moisture_value2 = 0;
int moisture_value3 = 0;
int moisture_value4 = 0;

#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
#include <DHT.h>
DHT dht(DHTPIN, DHTTYPE);

char auth[] = "T5CWX3dmqVkm1_52sQOWmdhbgczLRzMT";
char ssid[] = "OIL2G";
char pass[] = "0649461953";

char server[] = "oasiskit.com";
int port = 8080;

bool switchStatus = 0; // 0 = manual,1=auto
int soilMoistureLimit = 0;
bool manualSwitch = 0;
bool solenoid1 = 0;
bool solenoid2 = 0;


BlynkTimer timer;

// sync all status
BLYNK_CONNECTED() {
    Blynk.syncAll();
}

// update switchStatus
BLYNK_WRITE(V0)
{   
  switchStatus = param.asInt(); // Get value as integer
}

// update soilMosture setting
BLYNK_WRITE(V1)
{
  soilMoistureLimit = param.asInt(); // Get value as integer
}

// update manualSwitch
BLYNK_WRITE(V2)
{
  manualSwitch = param.asInt();
}

BLYNK_WRITE(V3)
{
  solenoid1 = param.asInt();
}

BLYNK_WRITE(V4)
{
  solenoid2 = param.asInt();
}

void manualAutoAction()
{
  moisture_value1 = analogRead(moisture1);
  moisture_value2 = analogRead(moisture2);
  moisture_value3 = analogRead(moisture3);
  moisture_value4 = analogRead(moisture4);
  Serial.print("Moisture1 = ");
  Serial.println(moisture_value1);
  delay(500);
  Serial.print("Moisture2 = ");
  Serial.println(moisture_value2);
  delay(500);
  Serial.print("Moisture3 = ");
  Serial.println(moisture_value3);
  delay(500);
  Serial.print("Moisture4 = ");
  Serial.println(moisture_value4);
  delay(500);
  if(switchStatus)
  {
    // auto
    if(moisture_value1 < soilMoistureLimit||(moisture_value2 < soilMoistureLimit))
    {
      digitalWrite(PUMP,HIGH);
      digitalWrite(relayone,HIGH);
    }  
    else
    {
      digitalWrite(PUMP,LOW);
      digitalWrite(relayone,LOW);
    }
     {
    if(moisture_value3 < soilMoistureLimit||(moisture_value4 < soilMoistureLimit))
    {
      digitalWrite(PUMP,HIGH);
      digitalWrite(relaytwo,HIGH);
    }  
    else
    {
      digitalWrite(PUMP,LOW);
      digitalWrite(relaytwo,LOW);
    }
  }
}
  //manual
  else
  {
    if(manualSwitch)
    {
      digitalWrite(PUMP,HIGH);
    }
    else
    {
      digitalWrite(PUMP,LOW);
    }

    if(solenoid1)
    {
      digitalWrite(relayone,HIGH);
    }
    else
    {
      digitalWrite(relayone,LOW);
    }

    if(solenoid2)
    {
      digitalWrite(relaytwo,HIGH);
    }
    else
    {
      digitalWrite(relaytwo,LOW);
    }
    // manaul
  }
}

void checkTemp()
{
  float h = dht.readHumidity();
  float t = dht.readTemperature(); // or dht.readTemperature(true) for Fahrenheit

  if (isnan(h) || isnan(t)) {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }
  // You can send any value at any time.
  // Please don't send more that 10 values per second.
  Blynk.virtualWrite(V5, h);  //V5 is for Humidity
  Blynk.virtualWrite(V6, t);  //V6 is for Temperature
}

void setup()
{
  // Debug console
  Serial.begin(115200);
  pinMode(PUMP,OUTPUT);
  digitalWrite(PUMP,HIGH);
  digitalWrite(PUMP,LOW);
  pinMode(relayone,OUTPUT);
  digitalWrite(relayone,HIGH);
  digitalWrite(relayone,LOW);
  pinMode(relaytwo,OUTPUT);
  digitalWrite(relaytwo,HIGH);
  digitalWrite(relaytwo,LOW);
  pinMode(PUSHBUTTON1, INPUT_PULLUP);
  pinMode(PUSHBUTTON2, INPUT_PULLUP);
  pinMode(PUSHBUTTON3, INPUT_PULLUP);
  pinMode(PUSHBUTTON4, INPUT_PULLUP);
  dht.begin();
  WiFi.begin(ssid, pass);
  Blynk.config(auth, server, port);
  Blynk.connect();
  // key
  timer.setInterval(1000L, manualAutoAction);
  timer.setInterval(10000L, checkTemp);
}

void loop()
{
  Blynk.run();
  timer.run();
}

ถ่ายฮาร์ดแวร์มาดูหน่อยครับว่าต่อแบบไหน ต่ออะไรอยู่บ้าง

ภาพไม่ค่อยชัดเท่าไหร่นะครับ แล้วสายมันพันกันเยอะด้วย

ต้องการให้ปุ่มให้กดส่งค่า และปุ่นนั้นต่อกับต่ำแหน่งไหนบนบอร์ด แล้วก็ใช้บอร์ดอะไรกลับผมมองไม่เห็นเลยโถ่วววว :sweat_smile:

ปุ่มที่ 4 ครับตำแหน่งพอร์ตที่ 23 บอร์ด ESP 32 DEVKIT V1 ครับ
คือ แค่อยากทราบว่าต้องทำยังไงกับ Swtichstatus ครับ ในการลิงค์ปุ่มกันระหว่าง Blynk กับภายนอก
ปุ่ม 3 ปุ่ม ที่เหลือคือการควบคุม รีเลย์ 3 ตัวครับ

ก็ใช้คำสั่งพื้นฐานนี้แหละครับ แบบนี้

char Input = 23;

void loop(){

//// set button 1 ///
if (digitalRead(Input) == HIGH) {

Blynk.virtualWrite(V1,1); // กำหนดตาม Vpin on blynk
Serial.println("SW On");

}else{

Blynk.virtualWrite(V1,0);// กำหนดตาม Vpin on blynk
Serial.println("SW Off");

 }
}

อันนี้เป็นการกดปุ่ม 1 ครั้งใช่มั้ยครับ ไม่ใช่กดค้างใช่มั้ย 55
ผมต้องกำหนดค่าปุ่มอะไรเพิ่มเติมมั้ยครับ

ตอนนี้เราใช้ Vpin ไหนบน App เพื่อสลับค่าครับ

ต้องการแบบไหน ลักษณะของการกดปุ่ม อธิบายหน่อยครับ

 BLYNK_WRITE(V0)
 {   
   switchStatus = param.asInt(); // Get value as integer
 }

เป็น V0 ครับ
ผมกำหนดให้ Switchstatus เป็น bool ไว้ครับ

ลักษณะเป็น SWITCH เหมือน Blynk เลยครับ ไม่ใช่การ PUSH

เวลาวางโค้ตใส่ไฮไลท์ให้ด้วยนะครับ

ทำไฮไลท์โค้ต ลากคุมแล้ว กดตรงนี้ครับ

ภาพ

ได้ครับ ๆ พอดีบางปุ่มยังไม่รู้ครับว่าทำอะไรได้บ้าง :joy:

ผมหมายถึงลักษณะทางกายภาพของปุ่นเหล่านี้ที่เราใช้นะครับ

ภาพ

มันคือ
PUSH = กดค้างไว้ไฟวิ่ง พอปล่อย ไฟหยุด หรือ
SWITCH = กดหนึ่งครั้งมันจะค้าง ไฟวิ่ง ต้องกดอีกครั้ง ไฟหยุด

ครับที่ผมต้องการสลับโหมดก็คือการ SWITCH ครับ โดยการกดปุ่ม 1 ครั้ง คือการสลับการทำงานครับ
ระหว่าง AUTO กับ MANUAL

ถ้าอย่างนั้นก็เข้ากรณีนี้ถูกไหม

ภาพ

บน Widget button สามารถตั้งได้ว่าจะเป็น SWITCH หรือ PUSH นะครับ ต้องดูด้วยว่าเราตั้งอะไรมันไว้ ค่า Define มันคือ PUSH

คือ การสลับโหมดระหว่าง AUTO กับ MANUAL บน Blynk ผมได้แล้วครับ ๆ โดยใช้ Switch นี่ล่ะครับ
ติดปัญหาแค่ปุ่มภายนอกครับ ที่ผมอยากสลับโหมดให้ทำงานเหมือน SWITCH บน Blynk

ครับผมก็ถึงอยากรู้ว่า ปุ่มที่เรามีนั้นมันกด แบบไหน ?? ไฟถึง On หน้า Contack ถึงต่อกัน โค้ตมันเขียนไม่เหมือนกัน ถ้าการกดไม่เหมือนกัน

งั้นเอางี้ เขียนโค้ต LED ON/OFF โดยใช้ปุ่มนี้มาให้ผมดูหน่อยครับ ยังไม่ต้องใส่ โค้ต หลักเข้าไป

หมายถึงประเภทของปุ่มภายนอกที่ผมใช้งานอยู่รึเปล่าครับ