Switch reset wifi ไม่ทำงาน

ผมมี switch 1 ตัว เพื่อใช้ทำการ reset wifi แต่พอกดค้างไว้ 5 วินาทีตามที่เขียนโปรแกรมไว้ มันไม่เข้าสู่โหมด reset wifi ตามที่เขียนไว้ ผมต่ออะไรผิด หรือเขียนโปรแกรมผิดตรงไหนหรือป่าวครับ
ต่อวงจรตามรูปด้านล่าง

#include <BlynkSimpleEsp8266.h>
#include <ESP8266WiFi.h>
#include <DNSServer.h>
#include <ESP8266WebServer.h>
#include <WiFiManager.h>

#define D2 4
#define ConfigWiFi_Pin D2
#define ESP_AP_NAME "ESP8266 V2 Config AP"

char auth[] = "JH_Lx-jy-bFQ-aV-eT3TEH2BGdjCRANW";
char ssid[] = "";
char pass[] = "";

void setup()
{
  pinMode(ConfigWiFi_Pin, INPUT_PULLUP);
  Serial.begin(115200);

  WiFiManager wifiManager;
  Serial.println("Reset Wifi Config !");
  for (int i = 5; i > 0; i--) {
    Serial.print(String(i) + " ");
    delay(1000);
  }

  if (digitalRead(ConfigWiFi_Pin) == LOW) // กดปุ่มเพื่อรีเซตไวไฟ
  {
    wifiManager.resetSettings();//goto ip 192.168.4.1 to config
  }

  wifiManager.autoConnect("ESP8266 V2 Begin"); //ESP_AP_NAME
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(250);
    Serial.print(".");
  }
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
  Blynk.begin(auth, ssid, pass, "oasiskit.com", 8080);  // server blynk
}

ไม่แน่ใจว่า @11167 มีจุดประสงค์อะไรที่ต้องทำแบบนี้ แต่โดยปกติ ผมจะต่อ EN กับ GND ครับ

ผมทำเผื่อไว้เวลาเปลี่ยนเร้าเตอร์ใหม่ หรือย้ายอุปกรณ์ไปใช้ที่อื่นจะได้กด Reset ได้เลย
แล้ว EN นี่คืออะไรขาไหนหลอครับ

ขานี้ครับ จุดต่อ EN ,GND ก็คือปุ่มรีเซ็ต NODE mcu นี่แหละครับ แทนที่เราจะไปกดปุ่ม RST ที่แผงของ NODE mcu เราก็มากดปุ่มนี้แทน

1

1.

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

คงต้องดู​ โค้ดแล้วละครับ​ เพราะผมเองไม่ได้ใช้ wifimanager​ มานานแล้ว​ แต่ผมใช้​ iotwebconf​ น่ะครับเข้าใจง่ายและยืดหยุ่นกว่า​ ใช้ได้ทั้ง​ esp8266​ และ​ esp32​ เลย​ ​ ยังไงตอนนี้ลองศึกษาโค้ดที่มีอยู่ก่อนนะครับ

code ชุดนี้ ใช้ Wifimanager สำหรับ ESP8266 นะครับ ESP32 จะใช้ไม่ได้ ลองดูครับ ใส่ค่าได้ 8 ค่า + ใส่ Blynk Token ได้ + ใส่ line token ได้

//ความต้องการของ Project (เพื่อป้องกันความผิดพลาดเรื่องของ Version และตรวจสอบย้อนหลังได้)
//Arduino IDE Version 1.8.7 -1.8.9
//Blynk Version 0.5.4 - 0.6.1

#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <WiFiManager.h>//WiFiManager Version 0.14.0
#include <FS.h>
#include <DNSServer.h>
#include <ArduinoJson.h>//ArduinoJson Version 5.13.3
#include <ESP8266HTTPClient.h>//ส่งค่าเข้า Server 



//------------------------Blynk---------------------------------------------
//#define BLYNK_MAX_SENDBYTES 1200
//สำหรับระบุคัวอักษรสูงสุด(1200)ที่อยู่ในเนื้อหา ของ Email ที่ส่ง
//เซิร์ฟเวอร์คลาวด์ฟรี Blynk ให้อีเมลสูงสุด 100 ฉบับต่อวัน
//ความยาวสูงสุดของเนื้อหาการแจ้งเตือนสามารถมีได้ 120 สัญลักษณ์
//จำกัด เวลาระหว่างการแจ้งเตือนอย่างน้อย 15 วินาที
//Blynk API ร้องขอให้ส่ง EMAIL
//Blynk.email ("mysmarthomepuy@gmail.com", "แจ้งเตือนระบบ..", "อุณหภูมิมากกว่า 28C!");

// Blynk API ร้องขอให้ PUSH การแจ้งเตือน
//Blynk.notify ("การแจ้งเตือน ESP8266 - อุณหภูมิมากกว่า 28C!");


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

char Blynk_Token[34] = "x2_I-FkZ2YJN7JFGZq-xvLg9GvNxCzkE";

int blynkIsDownCount = 0;
BlynkTimer timer;//ใช้ Timer ของ library Blynk ในการตั้งค่าการวนซ้ำ Function ต่างๆได้

//--ถ้าใน Blynk cloud โดยตรงให้ตัดออก--
char server[] = "oasiskit.com";
int port = 8080;
//-----------------------------------

//----Line notify----------------------------------------------------------------

#include <TridentTD_LineNotify.h>
char line_token1[45] = "";
char line_token2[45] = "";

//QerWyEZdBShylI3iTTxKz1Pk8Zo1vLy2NQa7AXFgYLM
//8HBPx7WHUTjGoPWACom1i98WEHGeCr6jZIDFx9L7kry

//Line Notify  แจ้งเตือน 1 ครั้ง
int blynk_Connect = 0;
int Notify_blynk_status1 = 0;
int Notify_blynk_status2 = 0;
//-------------------------------------------------------------------------------



#define D0 16// ไฟ onboardD016
#define D4 2 // ปุ่มกดตั้งค่า Aeecsspoint

char Data1[34] = "";
char Data2[34] = "";
char Data3[34] = "";
char Data4[34] = "";
char Data5[34] = "";
char Data6[34] = "";
char Data7[34] = "";
char Data8[34] = "";

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

String IP;

void setup() {


  pinMode(D0, OUTPUT);      // สัญญาณไฟ ในสภาวะต่างๆ
  pinMode(D4, INPUT_PULLUP); //กดปุ่ม ค้าง เพื่อตั้งค่า AP config


  Serial.begin (115200);








  Serial.println("");
  Serial.println("");
  Serial.println("ติดตั้ง FS...");
  delay (1000);

  Serial.println("");
  if (SPIFFS.begin()) {
    Serial.println("ติดตั้งระบบไฟล์ข้อมูล");

    if (SPIFFS.exists("/config1.json")) {//ชื่อไฟล์และช่องว่าง ต้องไม่ผืด ""
      //อ่านและโหลดไฟล์เดิมที่เคยบันทึกออกมา
      Serial.println("");
      Serial.println("กำลังอ่านไฟล์กำหนดค่าข้อมูล");
      File configFile1 = SPIFFS.open("/config1.json", "r");
      delay (1000);

      Serial.println("");
      if (configFile1) {
        Serial.println("เปิดไฟลืเดิมที่เคยกำหนดค่าก่อนหน้า..พบข้อมูลดังนี้");
        delay (1000);
        Serial.println("");
        size_t size = configFile1.size();
        // จัดสรรบัฟเฟอร์เพื่อจัดเก็บเนื้อหาของไฟล์
        std::unique_ptr<char[]> buf1(new char[size]);

        configFile1.readBytes(buf1.get(), size);
        DynamicJsonBuffer jsonBuffer;
        JsonObject& json = jsonBuffer.parseObject(buf1.get());
        json.printTo(Serial);
        Serial.println("");
        if (json.success()) {
          delay(1000);
          Serial.println("");
          Serial.println("ทำการเพิ่ม ช่องการป้อนค่าใน Web portal");
          Serial.println("");

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

          strcpy(line_token1, json["line_token1"]);
          strcpy(line_token2, json["line_token2"]);

          strcpy(Data1, json["Data1"]);
          strcpy(Data2, json["Data2"]);
          strcpy(Data3, json["Data3"]);
          strcpy(Data4, json["Data4"]);
          strcpy(Data5, json["Data5"]);
          strcpy(Data6, json["Data6"]);
          strcpy(Data7, json["Data7"]);
          strcpy(Data8, json["Data8"]);

        } else {
          Serial.println("ไม่สามารถโหลดไฟล์ข้อมูล json config ได้");
        }
      }
    }

  } else {
    Serial.println("ติดตั้ง FS ไม่สำเร็จ");
  }
  // สิ้นสุดการอ่าน
  delay( 1000);


  //แสดงชื่อหัวข้อที่จะป้อนลงในช่องต่าง ใน WebPortal
  WiFiManagerParameter custom_text0 ("<p> </p>"); //ขึ้นย่อหน้าใหม่

  WiFiManagerParameter custom_Blynk_Tokentext ("<label>ป้อน Blynk_Token</label>");

  WiFiManagerParameter custom_line_token1text ("<label>ป้อน line_token1</label>");
  WiFiManagerParameter custom_line_token2text ("<label>ป้อน line_token2</label>");


  WiFiManagerParameter custom_text1 ("<label>1: ป้อนค่า</label>");
  WiFiManagerParameter custom_text2 ("<label>2: ป้อนค่า</label>");
  WiFiManagerParameter custom_text3 ("<label>3: ป้อนค่า</label>");
  WiFiManagerParameter custom_text4 ("<label>4: ป้อนค่า</label>");
  WiFiManagerParameter custom_text5 ("<label>5: ป้อนค่า</label>");
  WiFiManagerParameter custom_text6 ("<label>6: ป้อนค่า</label>");
  WiFiManagerParameter custom_text7 ("<label>7: ป้อนค่า</label>");
  WiFiManagerParameter custom_text8 ("<label>8: ป้อนค่า</label>");


  WiFiManagerParameter custom_Blynk_Token("Blynk_Token", "Blynk_Token",  Blynk_Token, 34  );

  WiFiManagerParameter custom_line_token1("line_token1", "line_token1",  line_token1, 45  );
  WiFiManagerParameter custom_line_token2("line_token2", "line_token2",  line_token2, 45  );

  WiFiManagerParameter custom_Data1("Data1", "Data1", Data1, 34  );
  WiFiManagerParameter custom_Data2("Data2", "Data2", Data2, 34  );
  WiFiManagerParameter custom_Data3("Data3", "Data3", Data3, 34  );
  WiFiManagerParameter custom_Data4("Data4", "Data4", Data4, 34  );
  WiFiManagerParameter custom_Data5("Data5", "Data5", Data5, 34  );
  WiFiManagerParameter custom_Data6("Data6", "Data6", Data6, 34  );
  WiFiManagerParameter custom_Data7("Data7", "Data7", Data7, 34  );
  WiFiManagerParameter custom_Data8("Data8", "Data8", Data8, 34  );


  WiFiManager wifiManager;

  wifiManager.setSaveConfigCallback(saveConfigCallback1);



  wifiManager.addParameter(&custom_text0);
  wifiManager.addParameter(&custom_Blynk_Tokentext);
  wifiManager.addParameter(&custom_Blynk_Token);



  wifiManager.addParameter(&custom_line_token1text);
  wifiManager.addParameter(&custom_line_token1);

  wifiManager.addParameter(&custom_line_token2text);
  wifiManager.addParameter(&custom_line_token2);



  wifiManager.addParameter(&custom_text1);
  wifiManager.addParameter(&custom_Data1);

  wifiManager.addParameter(&custom_text2);
  wifiManager.addParameter(&custom_Data2);

  wifiManager.addParameter(&custom_text3);
  wifiManager.addParameter(&custom_Data3);

  wifiManager.addParameter(&custom_text4);
  wifiManager.addParameter(&custom_Data4);

  wifiManager.addParameter(&custom_text5);
  wifiManager.addParameter(&custom_Data5);

  wifiManager.addParameter(&custom_text6);
  wifiManager.addParameter(&custom_Data6);

  wifiManager.addParameter(&custom_text7);
  wifiManager.addParameter(&custom_Data7);

  wifiManager.addParameter(&custom_text8);
  wifiManager.addParameter(&custom_Data8);


  delay( 2000);
  Serial.println("");


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

    digitalWrite(D0, 0);
    delay( 500 );
    digitalWrite(D0, 1);
    delay( 500 );
    Serial.print (String(i) + " ");
  }
  Serial.println("");

  if (digitalRead(D4) == 0) {
    digitalWrite(D0, 0);
    Serial.println("");
    Serial.println("ปุ่มถูกกดแล้ว");

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

    if (!wifiManager.autoConnect("PUYIOT ESP8266")) {
      Serial.println("ไม่สามารถเชื่อมต่อและหมดเวลา");
      delay( 3000);
      //ESP8266 Reset เพื่อเข้าสู่การ Config ค่าอีกครั้ง
      ESP.reset();
      delay(5000);
    }
  }

  Serial.println("");
  IP = WiFi.localIP().toString();
  Serial.print("หมายเลข IP ที่ได้ : ");
  Serial.println(IP);

  if (IP == "0.0.0.0") {
    Serial.println("");
    Serial.println(": เชื่อมต่อ WiFi ไม่ได้....ระบบจะ Resetภายใน 20 วินาที)");
    delay( 20000);
    ESP.reset();

  }

  if (IP != "0.0.0.0") {
    Serial.println("");
    Serial.println("::: เชื่อมต่อ WiFi สำเร็จ!:::");
    Serial.println("");

    //digitalWrite(D0, LOW); //ให้ไฟ onBoardด ติดค้าง ถ้าเชื่อมต่อ WiFi สำเร็จ
  }
  delay( 500 );

  strcpy(Blynk_Token, custom_Blynk_Token.getValue());

  strcpy(line_token1, custom_line_token1.getValue());
  strcpy(line_token2, custom_line_token2.getValue());

  strcpy(Data1, custom_Data1.getValue());
  strcpy(Data2, custom_Data2.getValue());
  strcpy(Data3, custom_Data3.getValue());
  strcpy(Data4, custom_Data4.getValue());
  strcpy(Data5, custom_Data5.getValue());
  strcpy(Data6, custom_Data6.getValue());
  strcpy(Data7, custom_Data7.getValue());
  strcpy(Data8, custom_Data8.getValue());


  delay( 2000);


  if (shouldSaveConfig1) {

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


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

    json["line_token1"] =  line_token1;
    File configFile10 = SPIFFS.open("/config1.json", "w");


    json["line_token2"] =  line_token2;
    File configFile11 = SPIFFS.open("/config1.json", "w");



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


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

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

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

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

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

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

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


    if (!configFile1) {
      Serial.println("ไม่สามารถเปิดไฟล์กำหนดค่าสำหรับการเขียนได้");

    }
    json.printTo(Serial);
    json.printTo(configFile9);
    configFile9 .close();

    json.printTo(configFile10);
    configFile10 .close();

    json.printTo(configFile11);
    configFile11 .close();


    json.printTo(configFile1);
    configFile1.close();

    json.printTo(configFile2);
    configFile2.close();

    json.printTo(configFile3);
    configFile3.close();

    json.printTo(configFile4);
    configFile4.close();

    json.printTo(configFile5);
    configFile5.close();

    json.printTo(configFile6);
    configFile6.close();

    json.printTo(configFile7);
    configFile7.close();

    json.printTo(configFile8);
    configFile8.close();

  }

  delay(2000);


  //Print เพื่อเชคว่าค่าที่บันทึกไว้ยังอยู่หรือไม่
  Serial.println("");
  Serial.println("รายงานสถานะเครือข่ายที่เชื่อมต่อได้");

  Serial.println("-----------------------------------");
  Serial.println("");
  Serial.print("local ip   : ");
  delay(100);
  Serial.println(WiFi.localIP());
  delay(100);

  Serial.print("subnetMask : ");
  delay(100);
  Serial.println(WiFi.subnetMask());

  Serial.print("gateway    : ");
  delay(100);
  Serial.println(WiFi.gatewayIP());

  Serial.print("SSID       : ");
  delay(100);
  Serial.println(WiFi.SSID());

  Serial.print("Password   : ");
  delay(100);
  Serial.println(WiFi.psk());


  Serial.println("");
  Serial.println("-----------------------------------");

  Serial.print("Blynk_Token = ");
  Serial.println(Blynk_Token);

  Serial.print("line_token1 = ");
  Serial.println(line_token1);

  Serial.print("line_token2 = ");
  Serial.println(line_token2);

  Serial.print("Data1 =    ");
  Serial.println(Data1);

  Serial.print("Data2 =    ");
  Serial.println(Data2);

  Serial.print("Data3 =    ");
  Serial.println(Data3);

  Serial.print("Data4 =    ");
  Serial.println(Data4);

  Serial.print("Data5 =    ");
  Serial.println(Data5);

  Serial.print("Data6 =    ");
  Serial.println(Data6);

  Serial.print("Data7 =    ");
  Serial.println(Data7);

  Serial.print("Data8 =    ");
  Serial.println(Data8);

  Serial.println("");
  Serial.println("บันทึกค่าทั้งหมดแล้ว");


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


  //  ส่งข้อความเดียวกัน ให้ Line Notify 2 กลุ่ม
  LINE.setToken(line_token1); LINE.notify("ระบบเริ่มทำงาน");
  LINE.setToken(line_token2); LINE.notify("ระบบเริ่มทำงาน");





}//จบ void setup




void loop() {



  //---------------------------------------------
  if (Blynk.connected())
  {
    //เมื่อ Esp8266  เขื่อมต่อ Blynk Could ได้สำเร็จ
    Blynk.run();
    digitalWrite(D0, LOW);
    blynk_Connect = 1;

  }
  else {
    //เมื่อ Esp8266  เขื่อมต่อ Blynk Could ไม่ได้
    digitalWrite(D0, LOW);
    delay(200);
    digitalWrite(D0, HIGH);
    delay(100);
    blynk_Connect = 0;
  }
  //---------------------------------------------




  //แจ้งเตือน 1 ครั้ง กรณี Blynk เชื่อมต่อ Blynk Could ได้
  if (blynk_Connect == 1 && Notify_blynk_status1 == 0) {

    // LINE.notify("ชุดทดสอบ  เชื่อมต่อ Blynk Server ได้แล้ว");
    LINE.setToken(line_token1); LINE.notify("ระบบ เชื่อมต่อ Blynk Cloud ได้แล้ว");
    LINE.setToken(line_token2); LINE.notify("ระบบ เชื่อมต่อ Blynk Cloud ได้แล้ว");
    delay (200);
    Notify_blynk_status1 = 1;
  }
  else if (blynk_Connect == 1  && Notify_blynk_status1 == 1) {
    delay(10);
    Notify_blynk_status2  = 0;
  }


  //แจ้งเตือน 1 ครั้ง กรณี Blynk เชื่อมต่อ Blynk Could ไม่ได้  หรือ กรณี Internet มา
  if (blynk_Connect == 0 && Notify_blynk_status2  == 0) {

    //LINE.notify("ชุดทดสอบ!!!  เชื่อมต่อ Blynk Server ไม่ได้");
    LINE.setToken(line_token1); LINE.notify("ระบบ!! เชื่อมต่อ Blynk Cloud ไม่ได้");
    LINE.setToken(line_token2); LINE.notify("ระบบ!! เชื่อมต่อ Blynk Cloud ไม่ได้");
    delay (200);
    Notify_blynk_status2  = 1;
  }
  else if (blynk_Connect == 0  && Notify_blynk_status2  == 1) {
    delay(10);
    Notify_blynk_status1 = 0;
  }




  timer.run();//ต้องอยู่ใน void loop เสมอ

  delay(500);

}//จบ void loop



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


BLYNK_CONNECTED()//sync สถานะอุปกรณ์ทั้งหมด เมื่อ Esp8266 เขื่อมต่อ Blynk Could ได้สำเร็จ
{
  Blynk.syncAll();//ให้ sync อมูลทั้งหมด ล่าสุดจาก Blynk Server
}

Libraly ที่ใช้.rar (1.5 MB)

WM_ESP8266_keep_8_values_Blynk_Line_2_values.rar (4.5 KB)

ขอบคุณมากครับ เดี๋ยวลองเอาไปศึกษาดูครับ

ว่าแต่อันนี้โปรเจคทำอะไรหลอครับ เผื่อจะเข้าใจ code ง่ายขึ้น :star_struck:

ผมจัดทำไว้เป็นฟอร์มส่วนตัวของผมเองครับ คือไม่ต้องเสียเวลามานั่งเขียนใหม่ ในโค้ดที่ให้ไปสามารถเพิ่มข้อมูลได้ 8 ข้อมูลมี LINE Token 1 แล้วก็ Blynk อีก 1 ดังนั้นถ้ามีโปรเจคที่ต้องการเพิ่มข้อมูลแค่ 2 ผมก็จะลบอีก 6 ข้อมูลออกเพื่อความสะดวกรวดเร็วในการเขียนโค้ดเท่านั้นเองครับ