เงื่อนไขการทำงานของ Button ระบบพ่นน้ำลดฝุ่นละออง โดยใช้ Node MCU

ช่วยแนะนำด้วยครับ ว่าจะเขียนเงื่อนไขอย่างไรดี มือใหม่ครับ
ผมทำระบบพ่นละอองน้ำลดฝุ่น


การต่อวงจร ผมใช้ Relay 1 ตัว ต่อที่ขา D2 (GP4) สั่งงานด้วย Blynk
ปกติเปิดปิดน้ำได้แล้วครับ
สิ่งที่ต้องการให้พี่ ๆ ช่วยเหลือคือ

  1. เมื่อกดปุ่ม Gp4 บน Blynk เพื่อให้ Relay ทำงาน ปุ่ม V4 กับ V5 จะไม่สามารถกดได้
  2. ถ้ากดปุ่ม V4 หรือ V5 เพื่อสั่งให้ Relay ทำงาน ปุ่ม Gp4 จะไม่สามารถกดได้
  3. ถ้ากดปุ่ม V5 เพื่อสั่งให้ Relay GP4 กับ V4 จะไม่สามารถกดได้
  4. ถ้าต้องการให้ V4 ทำงาน 5 นาทีและหยุดทำงาน และทุกปุ่มพร้อมทำงาน ต้องเขียนโปรแกรมอย่างไรครับ
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <SoftwareSerial.h>
BlynkTimer timer;
#define ON LOW
#define OFF HIGH
char ssid[] = "wichutit2019";
char pass[] = "wct33450";
char auth[] = "3OeXDPlyLqpOenNClsZtU62xMZeUOi7W";




void setup() {
    Serial.begin(115200);
    Blynk.begin(auth, ssid, pass,"blynk.jpnet.co.th",8080);  //"blynk.jpnet.co.th",8080 "blynk-cloud.com",80
    Blynk.syncAll();
    Serial.println("\nStart");
    pinMode (Relay1,OUTPUT);
    }
void loop() {
Blynk.run();
timer.run();
}

เคยเรียน ภาษาซี มาก่อนรึป่าวครับ เคยใช้พวก if else หรือไม่

อันนี้โค้ดทั้งหมดของโปรแกรมครับ

#include "BLINKER_PMSX003ST.h"
#include <ESP8266WiFi.h>
#include <TridentTD_LineNotify.h>
#include <BlynkSimpleEsp8266.h>
#include <SoftwareSerial.h>
SoftwareSerial pmsSerial(13,5);
BlynkTimer timer;

BLINKER_PMSX003ST pms;
#define ON LOW
#define OFF HIGH
char ssid[] = "wichutit2019";
char pass[] = "wct33450";
char auth[] = "3OeXDPlyLqpOenNClsZtU62xMZeUOi7W"; //Auth Token from Blynk   RamZqLD2uTNxqP2zN7Ktrm1YEGSU7B0p


#define LINE_TOKEN  "8esngelBMepyIBtP4E3OeJLJDpZbMQxxD5JtphGhQ3n"   //Line token
const long interval = 30000;          //เวลาหน่วงการแจ้งเตือนซ้ำ [millisecond]

int PM_Alert;                    //ค่า PM2.5 ที่ต้องการให้แจ้งเตือน

unsigned long previousMillis = PM_Alert;

//-----------------รับค่าจาก Slider ----------
BLYNK_WRITE(V1) 
{
PM_Alert = param.asInt();
}

//---------เซนเซอร์อ่านค่าฝุ่น------------
void sensor() {
    pms.request();
    if(!pms.read()){
        return;
    }
    Serial.print("PM2.5(ATO)\t");
    Serial.print(pms.getPmAto(2.5));
    Serial.println("ug/m3");
    Serial.print("PM10(ATO)\t");
    Serial.print(pms.getPmAto(10));
    Serial.println("ug/m3");
    Serial.println();
        //delay(1000);
   
}

//------sent data to blynk------
void data_update() {
Blynk.virtualWrite(V2,pms.getPmAto(2.5));
Blynk.virtualWrite(V3,pms.getPmAto(10));
Serial.println();
}

void setup() {
    Serial.begin(115200);
    Blynk.begin(auth, ssid, pass,"blynk.jpnet.co.th",8080);  //"blynk.jpnet.co.th",8080 "blynk-cloud.com",80
    Blynk.syncAll();
    Serial.println("\nStart");

    pmsSerial.begin(9600);
    pms.begin(pmsSerial);
    //  pms.wakeUp();
    //  pms.setMode(PASSIVE);
    pms.setMode(ACTIVE);
    timer.setInterval(1000L,sensor);
    timer.setInterval(2000L,data_update);
    //timer.setInterval(3000L,chackMP);
    LINE.setToken(LINE_TOKEN);
    }

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

//--------ตรวจสอบค่า ถ้าถึงค่าที่กำหนดส่งไลน์แจ้งเตือน---------------------
if (pms.getPmAto(2.5) >= PM_Alert) {
      unsigned long currentMillis = millis(); 
      if (currentMillis - previousMillis >= interval) { //หน่วงเวลาแจ้งเตือนซ้ำ
        previousMillis = currentMillis;
        String msg = "ฝุ่น PM2.5เกินแล้วจ้า  : " + String(pms.getPmAto(2.5)) + " ug/m3";  //ข้อความที่จะส่ง LINE
        LINE.notify(msg);
      }
    }
}

พอเข้าใจอยู่บ้างครับ แต่พอนำมาใช้จริงงงงง ครับ
ไม่เข้าใจคำสั่งพวก WidgetLED ที่ใช้ร่วมกับปุ่มครับ

#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <SoftwareSerial.h>
BlynkTimer timer;
#define ON LOW
#define OFF HIGH
char ssid[] = "wichutit2019";
char pass[] = "wct33450";
char auth[] = "3OeXDPlyLqpOenNClsZtU62xMZeUOi7W";

int Relay1 = D2;

bool _button1 = false;
bool _button2 = false;
bool _button3 = false;

BLYNK_WRITE(V6){

    if (param.asInt() == 1){
        _button1 = true;
    }else{
        _button1 = false;
    }
}
BLYNK_WRITE(V4){

    if (param.asInt() == 1){
        _button2 = true;
    }else{
        _button2 = false;
    }
}
BLYNK_WRITE(V5){

    if (param.asInt() == 1){
        _button3 = true;
    }else{
        _button3 = false;
    }
}

//ตรงนี้คืออะไรครับ----------- ผมต้องเพิ่มใน Blynk ไหมครับ
/*WidgetLED led1(V30);
WidgetLED led2(V31);
WidgetLED led3(V32);
WidgetLED led4(V33);*/

void setup() {
    Serial.begin(115200);
    Blynk.begin(auth, ssid, pass,"blynk.jpnet.co.th",8080);  //"blynk.jpnet.co.th",8080 "blynk-cloud.com",80
    Blynk.syncAll();
    Serial.println("\nStart");
    pinMode (Relay1,OUTPUT);
    }
void loop() {

    if (_button1 == true){
            digitalWrite(Relay1, HIGH);
            led1.on();
        }else{
            digitalWrite(Relay1, LOW);
            led1.off();
        }
    if (_button2 == true){
            digitalWrite(Relay2, HIGH);
            led2.on();
        }else{
            digitalWrite(Relay2, LOW);
            led2.off();
        }
    if (_button3 == true){
            digitalWrite(Relay3, HIGH);
            led3.on();
        }else{
            digitalWrite(Relay3, LOW);
            led3.off();
        }
Blynk.run();
timer.run();
}

ผมต้องเพิ่ม LED บน Blynk ไหมครับ
ลองศึกษาจาก https://eleceasy.com/t/auto-manual-blynk/4193/7
แล้วยังงงอยู่ครับ เกี่ยวกับ LED

ต้องการเพิ่มไปทำอะไรครับ ตอนนี้ประเด็นหลักเราอยู่ที่เราจะแปลงเงื่อนไข ที่เราต้องการนั้นอย่างไร

คือผมไม่เข้าใจว่า WidgetLED led2(V31); มันคืออะไร ครับ
ผมเพียงแค่ต้องการกำหนดการสั่งงานของปุ่มเท่านั้นครับ

เป็นการกำหนดคลาส สำหรับ WidgetLED ชื่อ led2 โดยกำหนด virtual Pin เป็น V31 บนแอพ

เวลาที่เราไปใช้ เช่น เปิด LED ตือ

led2.on();

ถ้าเปิด คือ

led2.off();

เข้าใจแล้วครับ หลังจากลองทำดูมันเป็นการเปิดปิด LED นี่เองไม่เกี่ยวกับปุ่ม
รบกวนพี่ช่วยแนะนำการเขียนเงื่อนไขเกี่ยวกับปุ่มให้ด้วยครับ
เปรียบเทียบแค่ 2 ปุ่ม พอครับ
เช่น กดปุ่ม 1 ปุ่มที่ 2 จะกดไม่ได้ ปุ่มที่ 2 กดได้ ต่อเมื่อปุ่มที่ 1 กดไม่ได้ครับ
และเมื่อปุ่มที่ 2 ถูกกดจนครบเวลา 2 นาที ทั้งสองปุ่มจะกลับมาพร้อมกดปกติครับ
ขอบคุณพี่มาก ๆ ครับ ผมไม่ได้จบด้านเขียนโปรแกรม เลยงงงง

bool _button1 = false;
bool _button2 = false;

BLYNK_WRITE(V6){

    if (param.asInt() == 1){
        _button1 = true;
    }else{
        _button1 = false;
    }
}
BLYNK_WRITE(V4){

    if (param.asInt() == 1){
         if (_button1 == false){
        _button2 = true;
}
    }else{
        _button2 = false;
    }
}

นี้คือตัวอย่าง ข้อแรก ข้อถัดมาโชว์ฝีมือให้ผมดูหน่อยว่า เป็นอย่างไร

ส่วนเรื่อง นับจนครบ 2 นาที โค้ตเรายังไม่มีการทำงานส่วนนี้ผมให้ไปศึกษาต่อจากกระทู้นี้ ผมไกต์ไว้ให้หมดแล้ว ลองทำความเข้าใจดูครับ

1 Like

โค้ดที่พี่ให้ไว้เป็นแนวทาง พอรันแล้วผมกดปุ่ม 1 ปุ่ม 2 ยังสามารถกดได้ครับ
สอบถามเพิ่มเติม กรณีใช้รีเลย์ตัวเดียวกัน แต่แยก 3 ปุ่ม ผมต้องขยายขา แต่ละปุ่ม แล้วค่อยเอามาต่อเข้ากันใช่ไหมครับ

มันกดได้ครับแต่มันจะไม่ทำงานครับ มันไม่สามารถล็อกให้มันกดไม่ได้โดยตรงนะครับ เนื่องจาก มันคือปุ่มเสมือนจริง มันจริงต้องกดได้ นะครับ แต่ในทางโปรแกรม ต่อให้กด ปุ่ม 2 มันก็จะไม่ทำงานเนื่องจากเราล็อก ภายในไว้แล้ว

ครับ ผมผมเข้าใจผิดไปแองนึกว่าสามารถล็อกการกดได้เหมือนในเว็บ ของคุณมาก ๆ ครับ เดี๋ยวลองทำเงื่อนไขดูครับ

กรณีนี้ มันไม่ต้อง เพิ่มขาก็ได้ ขึ้นอยู่กับว่าเราจะใช้ ปุ่มกับรีเลย์แบบไหนในแต่ละปุ่ม ถ้าไม่อธิบาย ผมก็ตอบไม่ได้ครับว่าต้องทำหรือไหม

ถ้ากำหนดปุ่มเป็น สวิตซ์ เวลาที่กด ปุ่ม 2 อาจจะ ให้มันเด้งเป็น off ไปเลยก็ได้ เพราะเรา ล็อกไว้

ผมทำโครงานนี้อยู่ครับ วัดค่าฝุ่นละอองแล้วควบคุมวาล์วน้ำ ตอนนี้เหลือส่วนของปุ่ม ทั้งสามปุ่มด้านล้างครับ
เพื่อให้สั่งงานรีเลย์ 1 ตัวทำงาน ตามเงื่อนไขของสวิตซ์ 3 ปุ่ม

#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <SoftwareSerial.h>
#define ON LOW
#define OFF HIGH
#define LED D2
char ssid[] = "wichutit2019";
char pass[] = "wct33450";
char auth[] = "5BSXwTQ0nJjsJB3stJALPTMz2oHwtbKJ";

bool _button1 = false;
bool _button2 = false;
bool _button3 = false;

BLYNK_WRITE(V1){

    if (param.asInt() == 1){
        _button1 = true;
         digitalWrite(LED,HIGH);
             
    }else{
        _button1 = false;
         digitalWrite(LED,LOW);
    }
}
BLYNK_WRITE(V2){

    if (param.asInt() == 1){
         if (_button1 == false)&&(_button3 == false){
        _button2 = true;
        digitalWrite(LED,HIGH);
        unsigned long sec;
        boolean ss =false;
           if (millis()>)sec{
               sec = (60000*5)+millis();
               ss = !ss;
                if (ss = true){
                   digitalWrite(LED,LOW);
                 }
                     
           }
                 
}
    }else{
        _button2 = false;
          digitalWrite(LED,LOW);
    }
}

BLYNK_WRITE(V3){

    if (param.asInt() == 1){
         if (_button1 == false)&&(_button2 == false){
        _button3 = true;
          digitalWrite(LED,HIGH);
        unsigned long sec;
        boolean ss =false;
           if (millis()>)sec{
               sec = (60000*10)+millis();
               ss = !ss;
                if (ss = true){
                   digitalWrite(LED,LOW);
                 }
                     
           }
}
    }else{
        _button3 = false;
        digitalWrite(LED,LOW);
    }
}


void setup() {
    Serial.begin(115200);
    Blynk.begin(auth, ssid, pass,"blynk.jpnet.co.th",8080);  //"blynk.jpnet.co.th",8080 "blynk-cloud.com",80
    Blynk.syncAll();
    Serial.println("\nStart");
    pinMode (LED,OUTPUT);
    }
    
void loop() {
 
     Blynk.run();

}

มัน Error ครับที่เงื่อนไข ( และ ; ผมใช่งานผิดตรงไหนครับ
ถ้าอยากได้แบบ ปุ่มที่ 2 และ ปุ่มที่ 3 เมื่อกดแล้วเวลาครบ ปุ่มเลื่อนมาปิด มีแนวทางไหมครับ

แคป error มาดูด้วยครับ