ปรึกษาหน่อยค่ะ สวิทช์ในแอพBlynkขึ้นสถานะ off แล้ว แต่ค่าของESP8266 ยังมีค่าเป็น 1 อยู่ค่ะ ต้องแก้ตรงไหนรึป่าวคะ รบกวนด้วยนะคะ

ตามหัวข้อเลยค่ะ
พอดีต้องการสั่งการทำงานของมอเตอร์ปั๊มน้ำ แบบสามารถเลือกกดได้ทั้งหน้าตู้และในแอพBlynkค่ะ โดยมีสวิทช์ลูกลอย และโฟว์ลสวิทช์เป็นเงื่อนไขในการทำงาน โดยเมื่อกดสวิทช์เปิด มอเตอร์จะทำงาน delayไว้ 5วินาที ถ้าน้ำไม่ไหลเข้าท่อโฟว์ลสวิทช์จะไม่ทำงาน และให้สั่งตัดการทำงานของมอเตอร์ แต่ถ้ามีน้ำไหลเข้าท่อมอเตอร์จะสามารถทำงานต่อได้ จนเมื่อน้ำเต็มให้สวิทช์ลูกลอยเป็นตัวตัดการทำงาน หรือสามารถกดสวิทช์ปิดได้ค่ะ
ในส่วนโค้ดของการทำงานหน้าตู้ไม่มีปัญหาอะไรค่ะ แต่พอมาสั่งการทำงานบนBlynk พอกดสวิทช์on มอเตอร์ทำงานค่ะ 5วิผ่านไปถ้าน้ำไม่ไหล มอเตอร์ควรจะหยุดการทำงานแบบถาวรคือที่ESP8266แสดงค่าเป็น 0 และในแอพขึ้นสถานะ off แต่มันหยุดแล้วกลับมาทำงานต่ออีกครั้งแบบวงเป็นลูปค่ะ โดยที่ESP8266มีค่าเป็น1อยู่ตลอด แต่มอเตอร์กับสถานะที่แอพoffแล้ว รบกวนช่วยดูหน่อยนะคะ ขอบคุณค่ะ
โค้ดมี2ส่วนค่ะ คือส่วนที่อัพโหลดลงบนMega2560 กับบนESP8266 ตามลำดับค่ะ


#include <SoftwareSerial.h>
void setup() {
Serial.begin(115200);
 pinMode(2,OUTPUT); // relaylamp
 pinMode(3,OUTPUT); // relayแมกเนติก
 pinMode(4,INPUT); // swopen
 pinMode(5,INPUT); // swclose
 pinMode(6,INPUT); // โฟว์ลสวิชท์
 pinMode(7,INPUT); // ลูกลอยสูง สีน้ำตาล
 pinMode(8,INPUT); // manaul
 pinMode(9,INPUT); // app
 pinMode(10,INPUT); //จากขาD0ของแอพ สั่งเปิด-ปิดrelaypump
 pinMode(11,OUTPUT); //จากขาD1ของแอพ สั่งเปิด-ปิดrelaylamp
 pinMode(12,OUTPUT); //ส่งไปบอกespว่าselectorsw app ทำงาน ไปD2ของesp
 
}

void loop() {
  int swon = digitalRead(4);// รับค่าสวิทช์เปิด
  int swoff = digitalRead(5); // รับค่าสวิทช์ปิด
  int flowswon = digitalRead(6);
  int floatswon = digitalRead(7);//สวิทช์ลูกลอยตัดการทำงานของปั๊ม
  int manaul = digitalRead(8); //selectorswปรับไปที่manaul
  int app = digitalRead(9); //selectorswปรับไปที่app
  int swonoff = digitalRead(10); //สั่งจากแอพ

//---------Serial monitor----------
 Serial.println("Sw off");
 Serial.println(swoff);
 Serial.println("Sw on");
 Serial.println(swon);
 Serial.println("float sw on");
 Serial.println(floatswon);
 Serial.println("no-off for app");
 Serial.println(swonoff);
 Serial.println("flow sw on");
 Serial.println(flowswon);
  
//---------Manaul----------
 if(manaul == 1){
  Serial.println("manaul");
  Serial.println(manaul);
  digitalWrite(12,LOW); //ส่งไปบอกespว่าselectorsw app ไม่ทำงาน
   if(swon == 1) // ถ้ากดสวิตช์เปิด
   {
    Serial.println("pump on"); // ให้แสดงค่าว่า “pumpon” ใน serial monitor
    digitalWrite(2,HIGH); // led สีเขียวไฟติด แสดงปั๊มทํางาน
    digitalWrite(3,HIGH); // relaypumpปั๊มติด
    digitalWrite(11,HIGH); //ขาแสดงrelaypump for esp
    delay(5000);
    if(flowswon == 1){
      Serial.println("pump on"); // ให้แสดงค่าว่า “pumpon” ใน serial monitor
      digitalWrite(2,HIGH); // led สีเขียวไฟติด แสดงปั๊มทํางาน
      digitalWrite(3,HIGH); // relaypumpปั๊มติด
      digitalWrite(11,HIGH); //ขาแสดงrelaypump for esp
    }
   }
   else if(swoff == 1 || floatswon == 1 || flowswon == 0) // ถ้ากดสวิตช์ปิด
   {
    Serial.println("pump off"); // ให้แสดงคำว่า “pumpoff” ใน serial monitor
    digitalWrite(2,LOW); // led สีแดงติด แสดงปั๊มไม่ทำงาน
    digitalWrite(3,LOW); // relaypumpปั๊มดับ
    digitalWrite(11,LOW); //ขาแสดงrelaypump for esp
   }
 }
 
 //---------App----------
 if(app == 1){
  Serial.println("app");
  Serial.println(app);
  digitalWrite(12,HIGH); //ส่งไปบอกespว่าselectorsw app ทำงาน
  
   if(swonoff == 1){
    Serial.println("pump on"); // ให้แสดงค่าว่า “pumpon” ใน serial monitor
    digitalWrite(2,HIGH); // led สีเขียวไฟติด แสดงปั๊มทํางาน
    digitalWrite(3,HIGH); // relaypumpปั๊มติด
    digitalWrite(11,HIGH); //ขาแสดงrelaypump for esp
    delay(5000);
    if(flowswon == 0){  
     Serial.println("pump on"); // ให้แสดงค่าว่า “pumpon” ใน serial monitor
     digitalWrite(2,LOW); // กําหนดให้ led สีแดงติด ปั๊มไม่ทำงาน
     digitalWrite(3,LOW); // กําหนดให้ led ปั๊มดับ
     digitalWrite(11,LOW); //ขาแสดงrelaypump for esp
    }
   }
   if(swonoff == 0){
    Serial.println("pump on"); // ให้แสดงค่าว่า “pumpon” ใน serial monitor
    digitalWrite(2,LOW); // กําหนดให้ led สีแดงติด ปั๊มไม่ทำงาน
    digitalWrite(3,LOW); // กําหนดให้ led ปั๊มดับ
    digitalWrite(11,LOW); //ขาแสดงrelaypump for esp
   }
  } 
 delay(5000);
}


#define BLYNK_PRINT Serial 
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>

// token ,wifi user ,wifi password
/*char auth[] = "vq8SsVCuQuxy_13FkLlIWKmjxOsmaWgI"; //Token key
char server[] = "elec.cmtc.ac.th";
char ssid[] = "Oil_2.4GHz";
char pass[] = "15043219";
int port = 8080;*/

// token ,wifi user ,wifi password
char auth[] = "vq8SsVCuQuxy_13FkLlIWKmjxOsmaWgI"; //Token key
char server[] = "elec.cmtc.ac.th";
char ssid[] = "Anchalee";
char pass[] = "0819324966";
int port = 8080;

WidgetLED ledon(V1);
WidgetLED ledoff(V2);

bool selectorswStatus = 0;
bool selectorswTemp = 0;
bool swonStatus = 0;
bool swonTemp = 0;


BlynkTimer timer;

void setup() {
  Serial.begin(9600);
  Serial.println("กำลังเชื่อมต่อไปที่ Blynk Server");
  WiFi.begin(ssid, pass); //เชื่อมต่อ WiFi
  Blynk.config(auth, server, port); //กำหนด Token key , ชื่อ Server และ port
  Blynk.connect(); //เชื่อมต่อไปยัง Blynk

  pinMode(D0,OUTPUT); // ไปขา10
  pinMode(D1,INPUT); // มาจากขา11
  pinMode(D2,INPUT); // มาจากขา12
  timer.setInterval(500, checkStatusSelectorsw);
  timer.setInterval(500, checkStatusSWon);

}

BLYNK_CONNECTED() {  // ฟังก์ชันนี้ทำงานเมื่อต่อ Blynk ได้ 
  Serial.println("App Blynk ทำงาน!");
}

void checkStatusSelectorsw()
{
  selectorswStatus = digitalRead(D2);

  if (selectorswStatus != selectorswTemp)
  {
    if (selectorswStatus == HIGH) {
      Serial.println("APP");
      Blynk.virtualWrite(V3, 1);
    }
    else {
      Serial.println("MANAUL");
      Blynk.virtualWrite(V3, 0);
    }
  selectorswTemp = selectorswStatus;
  }
}

void checkStatusSWon()
{
  swonStatus = digitalRead(D1);

  if (swonStatus != swonTemp)
  {
    if (swonStatus == HIGH) {
      Serial.println("SW ON");
      Blynk.virtualWrite(V4, 1);
    }
    else {
      Serial.println("SW OFF");
      Blynk.virtualWrite(V4, 0);
    }
  swonTemp = swonStatus;
  }
}

BLYNK_WRITE(V4)
{
  if (param.asInt() == 0)
  {
    digitalWrite(D0,LOW);
    ledon.off();
    ledoff.on();
  }
  if (param.asInt() == 1)
  {
    digitalWrite(D0,HIGH);
    ledon.on();
    ledoff.off();
  }
}


void loop() {

int swonoff = digitalRead (D0); //output for esp//เข้าขา10 input for uno
int relaypump = digitalRead (D1); //input for esp//เข้าขา11 output for uno
int selectorsw = digitalRead (D2);
  
  //---------Serial monitor----------
 Serial.println("sw on");
 Serial.println(swonoff);
 Serial.println("relaypump on");
 Serial.println(relaypump);
 Serial.println("selectorsw on");
 Serial.println(selectorsw);
    
  Blynk.run();
  timer.run();
  
//---------Manaul----------
  if (selectorsw == 0) {
    if (relaypump == 1) {
      Serial.println("pump on"); // ให้แสดงค่าว่า “app” ใน serial monitor
      ledon.on();
      ledoff.off();
    }
    else {
      Serial.println("pump off"); // ให้แสดงค่าว่า “manual” ใน serial monitor
      ledon.off();
      ledoff.on();
    }
  }
  
  delay(1000);
}
1 Like

ถ่ายวิธีการต่อมาดูหน่อย หน้าแอพด้วยครับ และปุ่มที่มีปัญหาใช้ vPin อะไร