ทดสอบ Pushbutton 3 ปุ่มแทนสวิตซ์ปิดเปิดไฟบ้าน

สำหรับโปรเจคนี้ผมเคยคิดมานานว่าผมอยากจะทำมัน เคยอ่านหลายกระทู้ ก็มีคนพยายามจะดัดแปลงสวิทช์ปิดเปิดไปบ้านให้สามารถทำงานสอดคล้องกับ blynk Application โดยปกติแล้วตามท้องตลาดก็จะมีอยู่หลายยี่ห้อด้วยกันเช่น SONOFF เขาก็จะมีเทคโนโลยีการผลิตที่ดีอยู่แล้ว ซึ่งมีการใช้งานได้ง่ายราคาตอนนี้ก็ไม่แพงมาก เราก็สามารถที่จะซื้อเอามาใช้งานได้เลย แต่ในที่นี้สำหรับคนที่จะ DIY ถ้ายังนึกภาพไม่ออกว่าจะเอาของที่มีอยู่ทั่วไปมาใส่ลงใน Box ลอย แล้วมันจะอยู่ยังไง มันสามารถนำอุปกรณ์ต่างๆเข้าไปไว้ใน Box ได้หรือเปล่า ถ้าใครสงสัยในจุดนี้ก็ลองดูตัวอย่างที่ผมทำไว้ให้ดูนะครับ โปรเจคนี้ไม่ได้มุ่งหวังว่า ทุกคนที่อ่านของผมจะต้องทำตามเพราะงาน DIY นี้ ผมทำเพื่อทดสอบว่าแนวคิดของผมสามารถที่จะทำให้เป็นจริงได้หรือไม่ อีกอย่างหนึ่งสำหรับคนที่คิดจะทำตามโปรเจคนี้ ควรระมัดระวังเรื่องแรงดันไฟฟ้าด้วยนะครับ ต้องมีพื้นฐานมาบ้างแต่ถ้าจะไม่ใช้ไฟ 220 โวลท์ ก็ทำเพียงแค่ให้ รีเลย์ ทำงานก็พอ เพราะการนำไปใช้จริงจะต้องเซฟตี้ จุดของแรงดันไฟฟ้า 220 โวลท์เอาไว้ด้วย พูดง่ายๆถ้าไฟช็อตผมไม่รับผิดชอบนะครับ อิ…อิ…

ส่วนอันนี้เป็นภาพตัวอย่าง



แนวคิดผมคือผมจะทำทีเดียวทั้ง 3 ปุ่ม เลยเพราะฉะนั้นถ้ามีปุ่ม 2 ปุ่มหรือ 1 ปุ่มก็สามารถลดตัวรีเลย์ หรือ สายไฟลง ได้ทำให้มีพื้นที่ว่างลง สำหรับท่านผู้อ่านทุกท่านที่เข้ามาอ่านแล้วมี “วิธีในลักษณะนี้” ที่ดีกว่า เล็กกว่า ก็สามารถแนะนำได้นะครับ DIY เป็นงาน จินนาการ ผสมผสานกับ ความจริง ที่ลงตัวนะครับ

Code : 22/07/2563 23:20

#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <WiFiManager.h>
#include <FS.h>
#include <DNSServer.h>
#include <ArduinoJson.h>
#include <ESP8266HTTPClient.h>
//----------------------------------------------------------

//Blynk------------
#include <BlynkSimpleEsp8266.h>
#define BLYNK_DEBUG
#define BLYNK_PRINT Serial
int blynkIsDownCount = 0;
char blynk_token[34] = "l9JJngz0CfzRvO3rTbMB9-_Mmn-I0jdK";
BlynkTimer timer;

//***********สำหรับ Server local ที่แจกให้ เพิ่ม **** แค่ 2 บรรทัดนี้
char server[] = "oasiskit.com";
int port = 8080;

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

#define D0 16 // ใช้ไฟ LED สีฟ้า ของบอร์ด MCU ESP8266 ให้มีสัญญาณไฟกระพริบ ตาม Code ที่เขียน 
#define D4 2 // ใช้เป็นปุ่มกด เพื่อเข้า AP Config ได้ตามความต้องการของผู้ใช้

#define D5 14 //Relay No.1 
#define D6 12 //Relay No.1
#define D7 13 //Relay No.1
//------------------------------------------------------------------------------------------------------------------------//

bool shouldSaveConfig1 = false;
void saveConfigCallback1 () {
  shouldSaveConfig1 = true;
  Serial.println("Should save  All Data config");
}
//-----------------------------------------------------------------------------------------------------------------------//

String IP;

//กำหนดสถานะ เพื่อให้สามารถแยกระหว่างการติดหรือดับของ ของ Relays

int Device_1sent;
int Device_2sent;
int Device_3sent;
int Device_4sent;
int Device_5sent;
int Device_6sent;
int Device_7sent;
int Device_8sent;


//Power state ONOFF


int powerstate_sent1;
int powerstate_sent2;
int powerstate_sent3;
int powerstate_sent4;
int powerstate_sent5;
int powerstate_sent6;
int powerstate_sent7;
int powerstate_sent8;


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

#include <EEPROM.h>

#include <Bounce2.h>  //ใช้ library เพื่อป้องกันการแกว่งตัวของหน้าสัมผัส PB ระหว่างการปิดเปิด

#define D1 5 //PB No.1
Bounce debouncer1 = Bounce(); //กำหนดให้ตัวแปรชื่อ  debouncer1 เป็นของปุ่มที่ 1
int a1 = 0;//กำหนดสถานะให้กับปุ่มต่างๆ เพื่อให้สามารถแยกระหว่างการ ON หรือ OFF ของ PB
#define D2 4 //PB No.2
Bounce debouncer2 = Bounce(); //กำหนดให้ตัวแปรชื่อ  debouncer2 เป็นของปุ่มที่ 2
#define D3 0 //PB No.3
int a2 = 0;//กำหนดสถานะให้กับปุ่มต่างๆ เพื่อให้สามารถแยกระหว่างการ ON หรือ OFF ของ PB
Bounce debouncer3 = Bounce(); //กำหนดให้ตัวแปรชื่อ  debouncer3 เป็นของปุ่มที่ 3
int a3 = 0;//กำหนดสถานะให้กับปุ่มต่างๆ เพื่อให้สามารถแยกระหว่างการ ON หรือ OFF ของ PB









//--------Blynk Control---------
BLYNK_WRITE(V1)  //V1 ใน Blynk สลับ จาก 0-> 1  เป็น 1->0
{
  int pinValue = param.asInt();
  if (pinValue == 1 ) {
    Device_1_On();
  }
  if (pinValue == 0) {
    Device_1_Off();
  }
}

void Device_1_On() {
  Device_1sent = 10;
  Blynk.virtualWrite(V1, 1);
  //--เก็บค่าสถานะไว้ใน EEPROM --------

  EEPROM.put(10, Device_1sent ); //เขียนค่า Device_1sent   ลงใน Address 10
  EEPROM.commit(); //จบการเขียน
  delay(50);
}
//--------------------------------//
void Device_1_Off() {

  Device_1sent = 11;
  Blynk.virtualWrite(V1, 0);
  //--เก็บค่าสถานะไว้ใน EEPROM --------
  EEPROM.put(10, Device_1sent ); //เขียนค่า Device_1sent   ลงใน Address 10
  EEPROM.commit(); //จบการเขียน
  delay(50);
}

//--------Blynk <Timer> Control---------
BLYNK_WRITE(V11) //V11  ใน Code  สลับ จาก 1->off   เป็น 0-> on
{
  int pinValue = param.asInt();
  if (pinValue == 1 ) {
    Blynk.setProperty(V1, "onBackColor", "#f6119d");
    delay(10);
    Blynk.setProperty(V1, "onLabel", "Ctrl By Timer");
    delay(10);

    Device_1_Off();

  }
  if (pinValue == 0) {
    Blynk.setProperty(V1, "offBackColor", "#181916");
    delay(10);
    Blynk.setProperty(V1, "onLabel", "ON");
    Blynk.setProperty(V1, "onBackColor", "#c6e613");

    Device_1_On();
  }
}





//--------Blynk Control---------
BLYNK_WRITE(V2) //V2 ใน Blynk สลับ จาก 0-> 1  เป็น 1->0
{
  int pinValue = param.asInt();
  if (pinValue == 1 ) {
    Device_2_On();
  }
  if (pinValue == 0) {
    Device_2_Off();
  }
}

void Device_2_On() {

  Device_2sent = 20;
  Blynk.virtualWrite(V2, 1);
  //--เก็บค่าสถานะไว้ใน EEPROM --------
  EEPROM.put(20, Device_2sent );
  EEPROM.commit(); //จบการเขียน
  delay(50);
}
//--------------------------------//
void Device_2_Off() {
  Device_2sent = 21;
  Blynk.virtualWrite(V2, 0);
  //--เก็บค่าสถานะไว้ใน EEPROM --------
  EEPROM.put(20, Device_2sent );
  EEPROM.commit(); //จบการเขียน
  delay(50);
}

//--------Blynk <Timer> Control---------
BLYNK_WRITE(V12) //V12  ใน Code  สลับ จาก 1->off   เป็น 0-> on
{
  int pinValue = param.asInt();
  if (pinValue == 1 ) {
    Blynk.setProperty(V2, "onBackColor", "#f6119d");
    delay(10);
    Blynk.setProperty(V2, "onLabel", "Ctrl By Timer");
    delay(10);

    Device_2_Off();

  }
  if (pinValue == 0) {
    Blynk.setProperty(V2, "offBackColor", "#181916");
    delay(10);
    Blynk.setProperty(V2, "onLabel", "ON");
    Blynk.setProperty(V2, "onBackColor", "#c6e613");

    Device_2_On();
  }
}


//--------Blynk Control---------
BLYNK_WRITE(V3)  //V3 ใน Blynk สลับ จาก 0-> 1  เป็น 1->0
{
  int pinValue = param.asInt();
  if (pinValue == 1 ) {
    Device_3_On();
  }
  if (pinValue == 0) {
    Device_3_Off();
  }
}

void Device_3_On() {
  Device_3sent = 30;
  Blynk.virtualWrite(V3, 1);
  //--เก็บค่าสถานะไว้ใน EEPROM --------
  EEPROM.put(30, Device_3sent );
  EEPROM.commit(); //จบการเขียน
  delay(50);
}
//--------------------------------//
void Device_3_Off() {
  Device_3sent = 31;
  Blynk.virtualWrite(V3, 0);
  //--เก็บค่าสถานะไว้ใน EEPROM --------
  EEPROM.put(30, Device_3sent );
  EEPROM.commit(); //จบการเขียน
  delay(50);
}


//--------Blynk <Timer> Control---------
BLYNK_WRITE(V13) //V13  ใน Code  สลับ จาก 1->off   เป็น 0-> on
{
  int pinValue = param.asInt();
  if (pinValue == 1 ) {
    Blynk.setProperty(V3, "onBackColor", "#f6119d");
    delay(10);
    Blynk.setProperty(V3, "onLabel", "Ctrl By Timer");
    delay(10);

    Device_3_Off();
  }
  if (pinValue == 0) {
    Blynk.setProperty(V3, "offBackColor", "#181916");
    delay(10);
    Blynk.setProperty(V3, "onLabel", "ON");
    Blynk.setProperty(V3, "onBackColor", "#c6e613");

    Device_3_On();


  }
}



//Power state ON/OFF

BLYNK_WRITE(V31)
{
  int pinValue = param.asInt();
  if (pinValue == 1 ) {
    powerstate_sent1 = 211;
    EEPROM.put(211 , powerstate_sent1 );
    EEPROM.commit(); //จบการเขียน
    delay(50);
  }
  if (pinValue == 0) {

    powerstate_sent1 = 210;
    EEPROM.put(211, powerstate_sent1 );
    EEPROM.commit(); //จบการเขียน
    delay(50);
  }
}


BLYNK_WRITE(V32)
{
  int pinValue = param.asInt();
  if (pinValue == 1 ) {
    powerstate_sent2 = 221;
    EEPROM.put(221 , powerstate_sent2 );
    EEPROM.commit(); //จบการเขียน
    delay(50);
  }
  if (pinValue == 0) {

    powerstate_sent2 = 220;
    EEPROM.put(221, powerstate_sent2 );
    EEPROM.commit(); //จบการเขียน
    delay(50);
  }
}


BLYNK_WRITE(V33)
{
  int pinValue = param.asInt();
  if (pinValue == 1 ) {
    powerstate_sent3 = 231;
    EEPROM.put(231 , powerstate_sent3 );
    EEPROM.commit(); //จบการเขียน
    delay(50);
  }
  if (pinValue == 0) {

    powerstate_sent3 = 230;
    EEPROM.put(231, powerstate_sent3 );
    EEPROM.commit(); //จบการเขียน
    delay(50);
  }
}



//------------------------------------------------------//
BLYNK_CONNECTED()
{

  powerstate_sent1 = EEPROM.get(211, powerstate_sent1);
  Serial.print("powerstate_sent1 :");
  Serial.println(powerstate_sent1);
  delay(50);

  if (powerstate_sent1  == 211) {//กรณีที่ Power state ON จะเก็บค่า ทั้งหมดไว้รอ Sysn กับ Blynk

    //-----------------------------
    Device_1sent = EEPROM.get(10, Device_1sent);
    if (Device_1sent  == 10) {
      Blynk.virtualWrite(V1, 1);


    }

    if (Device_1sent  == 11) {
      Blynk.virtualWrite(V1, 0);
    }
    Serial.print("Device_1sent :");
    Serial.println(Device_1sent);
    //-----------------------------
    delay(50);
    //-----------------------------

  }
  else if (powerstate_sent1  == 210) {
    Device_1_Off();
  }






  powerstate_sent2 = EEPROM.get(221, powerstate_sent2);
  Serial.print("powerstate_sent2 :");
  Serial.println(powerstate_sent2);
  delay(50);
  if (powerstate_sent2  == 221) {//กรณีที่ Power state ON จะเก็บค่า ทั้งหมดไว้รอ Sysn กับ Blynk

    Device_2sent = EEPROM.get(20, Device_2sent);
    if (Device_2sent  == 20) {
      Blynk.virtualWrite(V2, 1);
    }

    if (Device_2sent  == 21) {
      Blynk.virtualWrite(V2, 0);
    }
    Serial.print("Device_2sent :");
    Serial.println(Device_2sent);
    //-----------------------------
    delay(50);
    //-----------------------------

  }

  else if (powerstate_sent2  == 220) {
    Device_2_Off();
  }




  powerstate_sent3 = EEPROM.get(231, powerstate_sent3);
  Serial.print("powerstate_sent3 :");
  Serial.println(powerstate_sent3);
  delay(50);
  if (powerstate_sent3  == 231) {//กรณีที่ Power state ON จะเก็บค่า ทั้งหมดไว้รอ Sysn กับ Blynk



    Device_3sent = EEPROM.get(30, Device_3sent);
    if (Device_3sent  == 30) {
      Blynk.virtualWrite(V3, 1);

    }

    if (Device_3sent  == 31) {
      Blynk.virtualWrite(V3, 0);
    }
    Serial.print("Device_3sent :");
    Serial.println(Device_3sent);
    //-----------------------------
    delay(50);
    //-----------------------------

  }
  else if (powerstate_sent3  == 230) {
    Device_3_Off();
  }



}//end Blynk connect




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

void setup() {

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


  pinMode(D1, INPUT_PULLUP);//PB No.1
  debouncer1.attach(D1);
  debouncer1.interval(25);

  pinMode(D2, INPUT_PULLUP);//PB No.2
  debouncer2.attach(D2);
  debouncer2.interval(25);

  pinMode(D3, INPUT_PULLUP);//PB No.3
  debouncer3.attach(D3);
  debouncer3.interval(25);


  pinMode(D5, OUTPUT); //Relay No.1
  pinMode(D6, OUTPUT); //Relay No.2
  pinMode(D7, OUTPUT); //Relay No.3


  Serial.begin(115200);


  //ให้ OUTPUT ทุกตัวดับก่อนตอนเริ่มทำงาน
  digitalWrite(D5, 0);
  digitalWrite(D6, 0);
  digitalWrite(D7, 0);


  EEPROM.begin(512);






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


  if (SPIFFS.begin()) {

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

    Serial.println("mounted Data file system");


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

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

        configFile1.readBytes(buf1.get(), size);
        DynamicJsonBuffer jsonBuffer;
        JsonObject& json = jsonBuffer.parseObject(buf1.get());
        json.printTo(Serial);
        if (json.success()) {
          Serial.println("\nparsed  json");

          strcpy(blynk_token, json["blynk_token"]);


        } else {
          Serial.println("failed to load Data file json config");
        }
      }
    }
    //---------------------------------------------------------------------------------//



  } else {
    Serial.println("failed to mount FS");

  }
  //end read


  delay(1000);


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

  WiFiManagerParameter custom_text0("<p> </p>");
  WiFiManagerParameter custom_textA("<label>ป้อน Blynk Token</label>");


  WiFiManagerParameter custom_blynk_token("blynk_token", "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(saveConfigCallback1);

  wifiManager.addParameter(&custom_text0);
  wifiManager.addParameter(&custom_textA);
  wifiManager.addParameter(&custom_blynk_token);

  delay(1000);

  for (int i = 5; i > -1; i--) {  // นับเวลาถอยหลัง 5 วินาทีก่อนกดปุ่ม AP Config

    digitalWrite(D0, LOW);
    delay(500);
    digitalWrite(D0, HIGH);
    delay(500);
    Serial.print (String(i) + " ");


  }

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



    wifiManager.resetSettings();//ให้ล้างค่า SSID และ Password ที่เคยบันทึกไว้


    // wifiManager.autoConnect(); ใช้สร้างชื่อแอคเซสพอยต์อันโนมัติจาก ESP + ChipID

    if (!wifiManager.autoConnect("Lighting IOT")) {
      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(": เชื่อมต่อ WiFi สำเร็จ!)");

  strcpy(blynk_token, custom_blynk_token.getValue());

  delay(1000);

  if (shouldSaveConfig1) {
    //Serial.println("saving config");//แสดงข้อความใน Serial Monitor

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

    DynamicJsonBuffer jsonBuffer;
    JsonObject& json = jsonBuffer.createObject();

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

    Serial.println("saving blynk_token_ config");
    json["blynk_token"] = blynk_token;
    File configFile1 = SPIFFS.open("/config1.json", "w");

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


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

    }
    json.printTo(Serial);
    //-------------------------------------
    //--Write Close blynk_token
    json.printTo(configFile1);
    configFile1.close();
    //-------------------------------------
  }

  delay(1000);
  //-----------------------------------------------------------------

  //-----------------------------------------------------------------------------------------------------------------------//
  Serial.println("-----------------------------------");
  Serial.println();
  Serial.print("local ip   : ");
  delay(100);
  Serial.println(WiFi.localIP());
  delay(100);
  Serial.print("gateway    :");
  delay(100);
  Serial.println(WiFi.gatewayIP());
  Serial.print("subnetMask :");
  delay(100);
  Serial.println(WiFi.subnetMask());
  Serial.print("SSID       :");
  delay(100);
  Serial.println(WiFi.SSID());
  Serial.print("Password   :");
  delay(100);
  Serial.println(WiFi.psk());
  //-----------------------------------------------------------------------------------------------------------------------//
  //Print เพื่อเชคว่าค่าที่บันทึกไว้ยังอยู่หรือไม่
  Serial.println("-----------------------------------");
  Serial.println("เชคว่าค่าที่บันทึกไว้ยังอยู่หรือไม่");
  Serial.println();

  IP = WiFi.localIP().toString();
  Serial.print("IP to String = ");
  Serial.println(IP);


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


  timer.setInterval(30000L, reconnecting);


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


}

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









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


void loop(void) {

  debouncer1.update();

  //--Toggle SW  PB 1 -----------------------------------------------------------------------------------

  if ( debouncer1.fell() ) {

    a1 = !a1;

    if ( a1 == 1 ) {
      Device_1_Off();
    }

    if ( a1 == 0 ) {
      Device_1_On();
    }
    delay(50);
  }
  //-------------------------------------------------------------------------------------------------


  debouncer2.update();
  //--Toggle SW  PB 2 -----------------------------------------------------------------------------------

  if ( debouncer2.fell() ) {
    a2 = !a2;

    if ( a2 == 1 ) {
      Device_2_Off();
    }

    if ( a2 == 0 ) {
      Device_2_On();
    }
    delay(50);
  }
  //-------------------------------------------------------------------------------------------------




  debouncer3.update();
  //--Toggle SW  PB 3 -----------------------------------------------------------------------------------

  if ( debouncer3.fell() ) {
    a3 = !a3;

    if ( a3 == 1 ) {
      Device_3_Off();
    }

    if ( a3 == 0 ) {
      Device_3_On();
    }
    delay(50);
  }
  //-------------------------------------------------------------------------------------------------




  //------Relay No.1 -----------------//
  if (Device_1sent == 11) {//off
    digitalWrite(D5, 1);
    a1 = 1;
  }
  if (Device_1sent == 10) {//on
    digitalWrite(D5, 0);
    a1 = 0;
  }
  //---------------------------//



  //------Relay No.2 -----------------//
  if (Device_2sent == 21) {//off
    digitalWrite(D6, 1);
    a2 = 1;
  }
  if (Device_2sent == 20) {//on
    digitalWrite(D6, 0);
    a2 = 0;
  }
  //---------------------------//




  //------Relay No.3 -----------------//
  if (Device_3sent == 31) {//off
    digitalWrite(D7, 1);
    a3 = 1;
  }
  if (Device_3sent == 30) {//on
    digitalWrite(D7, 0);
    a3 = 0;
  }
  //---------------------------//












  //------------- Blynk Connect ---------------//
  if (Blynk.connected())
  {
    Blynk.run();
    digitalWrite(D0, LOW);
    //Serial.println("loop Blynk run");
  } else {
    digitalWrite(D0, LOW);
    delay(50);
    digitalWrite(D0, HIGH);
    delay(50);

    //Serial.println("loop Blynk connecting");
  }
  timer.run();//ให้เวลาของ Blynk ทำงาน

  // delay(200); // ตัดการหน่วงเวลาออก เพราะทำให้การกดปุ่มช้า


}//Loop




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


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

ปุ่มสวิตซ์พี่ซื้อที่ไหนหรอครับ

ที่นี่ครับ

https://www.allnewstep.com/product/3631/สวิตช์ปุ่มกด-กดติดปล่อยดับ-reset-switch-แบบกันน้ำ