ESP32 Wifi manager Blynk

ต้องเอา library File .c มากางดูเลยอะครับ ผมก็ไม่เคยเหมือนกัน

-ขอเก็บเป็นข้อมูลเอาไว้ก่อนครับ ESP32 แสดงชื่อ WIFI ที่เราเชื่อมต่อ ปีหน้าจะเอามาศึกษาดู

#include <Arduino.h>
#include "WiFi.h"
#include <WiFiMulti.h>
#include <HTTPClient.h>
String wifiSSID = "";
String wifipassword = "1234567";
WiFiMulti wifiMulti;

void setup()
{
Serial.begin(115200);

// Set WiFi to station mode and disconnect from an AP if it was previously connected
WiFi.mode(WIFI_STA);
WiFi.disconnect();
delay(100);

Serial.println("Setup done");
Serial.println("scan start");

// WiFi.scanNetworks will return the number of networks found
int n = WiFi.scanNetworks();
Serial.println("scan done");
if (n == 0) {
Serial.println("no networks found");
} else {
Serial.print(n);
Serial.println(" networks found");
for (int i = 0; i < n; ++i) {
if (i == 0) // First one
{
wifiSSID = String(WiFi.SSID(i));
}
// Print SSID and RSSI for each network found
Serial.print(i + 1);
Serial.print(": ");
Serial.print(WiFi.SSID(i));
Serial.print(" (");
Serial.print(WiFi.RSSI(i));
Serial.print(")");
Serial.println((WiFi.encryptionType(i) == WIFI_AUTH_OPEN)?" ":"*");
delay(10);
}
}
Serial.println("");
wifiMulti.addAP(wifiSSID.c_str() , wifipassword.c_str());
Serial.println("Connect to:");
Serial.println(wifiSSID);
Serial.println("");
}

void loop()
{
while(wifiMulti.run() != WL_CONNECTED) {
Serial.print(".");
delay(500);
}

Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());

delay(50000);
//Esp8266 Modify

  Serial.println("local ip"); //แสดงข้อความใน Serial Monitor
  delay(100);
  Serial.println(WiFi.localIP());//แสดงข้อความใน Serial Monitor
  Serial.println("NOW WiFi Connect to:");< ---- -
  Serial.println(WiFi.SSID()); < ---- -
  // Blynk.config(blynk_token);////เริ่มการเชื่อมต่อ Blynk Server แบบปกติ
  Blynk.config(blynk_token, server, port);
  ////เริ่มการเชื่อมต่อ Blynk Server*********สำหรับ Server local ที่แจกให้ เพิ่ม, server, port  แค่นี้จบ
2 Likes

code ที่แสดง ชื่อ SSID ที่ ESP32 กำลังเชื่อมต่ออยู่ ผ่าน Serial Monitor (Update 23_01_2563 23:57)

#include <FS.h>                   //this needs to be first, or it all crashes and burns...
#include <SPIFFS.h>//เพิ่ม

#include <WiFi.h>          //https://github.com/esp8266/Arduino
#include <WiFiClient.h>


//needed for library
#include <DNSServer.h>
#include <WebServer.h>
#include <WiFiManager.h>          //https://github.com/tzapu/WiFiManager
#include <ArduinoJson.h>       //Ver 5.13.4   //https://github.com/bblanchon/ArduinoJson
//------------------------------------------------------------------------------------------------------------------------//
#include <BlynkSimpleEsp32.h>          //  Blynk_Release_v0.6.1 
//------------------------------------------------------------------------------------------------------------------------//


//------------------------------        การกำหนดค่าในส่วนของ Blynk         ------------------------------------------------//
#define BLYNK_DEBUG
#define BLYNK_PRINT Serial
int blynkIsDownCount = 0;

char blynk_token[34] = "lE0j-VJUuIZ3mBZYfpcHqCT36ak29gdU";//ใส่ Blynk_token ของเราที่ Blynk ส่งมาทาง Email ตอน Create Project ใหม่

BlynkTimer timer;  //เรียกใช้การตั้งเวลาของ Blynk

//----------------------------------  กำหนดหมายเลขของขาของ Node MCU ESP32  --------------------------------------------//

const int Ledblynk = 2;                     // ใช้ไฟ LED สีฟ้า ของบอร์ด MCU ESP32 ให้มีสัญญาณไฟกระพริบ ตาม Code ที่เขียน
const int AP_Config = 23;                // ใช้เป็นปุ่มกด เพื่อเข้า AP Config ได้ตามความต้องการของผู้ใช้
//------------------------------------------------------------------------------------------------------------------------//



bool shouldSaveConfig = false;

//callback notifying us of the need to save config
void saveConfigCallback () {
  Serial.println("Should save config");
  shouldSaveConfig = true;
}
//------------------------------------------------------------------------------------------------------------------------//


//-------------สำหรับ Server local ที่แจกให้ เพิ่ม **** แค่ 2 บรรทัดนี้--------------   (ถ้าเป็น Blynk Server ปกติไม่ต้องใส่)  ----------//
char server[] = "oasiskit.com";
int port = 8080;
//------------------------------------------------------------------------------------------------------------------------//





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

void setup() {

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


  // ให้ LED ทั้งหมดดับก่อน
  digitalWrite(Ledblynk, LOW);//ให้หลอด LED สีฟ้าดับก่อน

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


  Serial.begin(115200);
  //-------------------------------//



  //*************************    การ อ่าน  เขียนค่า WiFi + Password ]ลงใน Node MCU ESP32   ************//

  //read configuration from FS json
  Serial.println("mounting FS...");//แสดงข้อความใน Serial Monitor

  if (SPIFFS.begin(true)) {
    Serial.println("mounted file system");
    if (SPIFFS.exists("/config.json")) {
      //file exists, reading and loading
      Serial.println("reading config file");
      File configFile = SPIFFS.open("/config.json", "r");
      if (configFile) {
        Serial.println("opened config file");
        size_t size = configFile.size();
        // Allocate a buffer to store contents of the file.
        std::unique_ptr<char[]> buf(new char[size]);

        configFile.readBytes(buf.get(), size);
        DynamicJsonBuffer jsonBuffer;
        JsonObject& json = jsonBuffer.parseObject(buf.get());
        json.printTo(Serial);
        if (json.success()) {
          Serial.println("\nparsed json");
          strcpy(blynk_token, json["blynk_token"]);

        } else {
          Serial.println("failed to load json config");//แสดงข้อความใน Serial Monitor
        }
      }
    }
  } else {
    Serial.println("failed to mount FS");//แสดงข้อความใน Serial Monitor
  }
  //end read
  Serial.println(blynk_token);

  //*************************   จบการ อ่าน  เขียนค่า WiFi + Password ]ลงใน Node MCU ESP32   **********//









  //**************************        AP AUTO CONNECT   ********************************************//

  WiFiManagerParameter custom_blynk_token("blynk", "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(saveConfigCallback);

  wifiManager.addParameter(&custom_blynk_token);


  for (int i = 5; i > -1; i--) {  // นับเวลาถอยหลัง 5 วินาทีก่อนกดปุ่ม AP Config
    digitalWrite(Ledblynk, HIGH);
    delay(500);
    digitalWrite(Ledblynk, LOW);
    delay(500);
    Serial.print (String(i) + " ");//แสดงข้อความใน Serial Monitor
  }


  if (digitalRead(AP_Config) == LOW) {
    digitalWrite(Ledblynk, HIGH);
    Serial.println("Button Pressed");//แสดงข้อความใน Serial Monitor



    // wifiManager.resetSettings();//ให้ล้างค่า SSID และ Password ที่เคยบันทึกไว้
    wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); //load the flash-saved configs
    esp_wifi_init(&cfg); //initiate and allocate wifi resources (does not matter if connection fails)
    delay(2000); //wait a bit
    if (esp_wifi_restore() != ESP_OK)

    {
      Serial.println("WiFi is not initialized by esp_wifi_init ");
    } else {
      Serial.println("WiFi Configurations Cleared!");
    }
    //continue
    //delay(1000);
    //esp_restart(); //just my reset configs routine...


  }

  wifiManager.setTimeout(60);
  //ใช้ได้ 2 กรณี
  //1. เมื่อกดปุ่มเพื่อ Config ค่า AP แล้ว จะขึ้นชื่อ AP ที่เราตั้งขึ้น
  //   ช่วงนี้ให้เราทำการตั้งค่า SSID+Password หรืออื่นๆทั้งหมด ภายใน 60 วินาที ก่อน AP จะหมดเวลา
  //   ไม่เช่นนั้น เมื่อครบเวลา 60 วินาที MCU จะ Reset เริ่มต้นใหม่ ให้เราตั้งค่าอีกครั้งภายใน 60 วินาที
  //2. ช่วงไฟดับ Modem router + MCU จะดับทั้งคู่ และเมื่อมีไฟมา ทั้งคู่ก็เริ่มทำงานเช่นกัน
  //   โดยปกติ Modem router จะ Boot ช้ากว่า  MCU ทำให้ MCU กลับไปเป็น AP รอให้เราตั้งค่าใหม่
  //   ดังนั้น AP จะรอเวลาให้เราตั้งค่า 60 วินาที ถ้าไม่มีการตั้งค่าใดๆ เมื่อครบ 60 วินาที MCU จะ Reset อีกครั้ง
  //   ถ้า Modem router  Boot และใช้งานได้ภายใน 60 วินาที และหลังจากที่ MCU Resset และเริ่มทำงานใหม่
  //   ก็จะสามารถเชื่อมต่อกับ  Modem router ที่ Boot และใช้งานได้แล้ว  ได้  ระบบจะทำงานปกติ


  if (!wifiManager.autoConnect("PUYIOT ESP32 AP CONFIG")) {
    Serial.println("failed to connect and hit timeout");//แสดงข้อความใน Serial Monitor
    delay(3000);
    //reset and try again, or maybe put it to deep sleep
    ESP.restart();//แก้ เดิม ESP.reset(); ใน Esp8266
    delay(5000);

  }

  Serial.println("Connected.......OK!)");//แสดงข้อความใน Serial Monitor
  strcpy(blynk_token, custom_blynk_token.getValue());


  //save the custom parameters to FS
  if (shouldSaveConfig) {
    Serial.println("saving config");
    DynamicJsonBuffer jsonBuffer;
    JsonObject& json = jsonBuffer.createObject();
    json["blynk_token"] = blynk_token;
    File configFile = SPIFFS.open("/config.json", "w");

    if (!configFile) {
      Serial.println("failed to open config file for writing");//แสดงข้อความใน Serial Monitor

    }
    json.printTo(Serial);
    json.printTo(configFile);
    configFile.close();
    //end save
  }

  //**************************    จบ    AP AUTO CONNECT   *****************************************//




  Serial.println("local ip"); //แสดงข้อความใน Serial Monitor
  delay(100);
  Serial.println(WiFi.localIP());//แสดงข้อความใน Serial Monitor
  Serial.println(WiFi.gatewayIP());
  Serial.println(WiFi.subnetMask());
  Serial.println(WiFi.SSID());

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






  timer.setInterval(30000L, reconnecting);  //Function reconnect

  //ตั้งเวลาส่งข้อมูลให้ Blynk Server ทุกๆ 30 วินาที


}


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


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


void loop() {


  //-----------------------------------------------------------------------------------------------------------//
  if (Blynk.connected())
  {
    Blynk.run();
    digitalWrite(Ledblynk, HIGH);

  } else {

    digitalWrite(Ledblynk, LOW);
    delay(200);
    digitalWrite(Ledblynk, HIGH);
    delay(100);

  }
  //-----------------------------------------------------------------------------------------------------------//

  timer.run();//ให้เวลาของ Blynk ทำงาน

  delay(100);


}

//------------------------------------------------------------------------------------------------------------------------//
//*********************************************      จบ void Loop       **************************************************//
//------------------------------------------------------------------------------------------------------------------------//




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


BLYNK_CONNECTED()
{

  Blynk.syncAll();//ให้ซิงค์ข้อมูลทั้งหมดล่าสุดจาก Blynk Server
  
}

ผลลัพธ์ เดิม

ผมเปลี่ยน SSID ใหม่ ผลลัพธ์

ผมเปลี่ยน SSID ใหม่ เป็นตัวที่ 3 ผลลัพธ์

1

เรื่องของ Password ขอศึกษาดูก่อนครับ

อ้อ ส่วนที่ต้องเพิ่ม code เข้าไปครับ (ESP8266 น่าจะเพิ่ม Code บรรทัดนี้เหมือนกันครับ)

1 Likes

เก็บข้อมูล รอลองจริง

2

การแสดง Password น่าจะตัวนี้

1

เปลี่ยนเป็นภาษาไทย AP config

1

Serial.println(WiFi.SSID());
Serial.println(WiFi.psk());

# include  < ESP8266WiFi.h >           // ESP8266 Core WiFi Library (คุณมีอยู่แล้วในร่างของคุณ)

# include  < DNSServer.h >             //เซิร์ฟเวอร์ DNS ภายในที่ใช้สำหรับเปลี่ยนเส้นทางคำขอทั้งหมดไปยังพอร์ทัลการกำหนดค่า 
# include  < ESP8266WebServer.h >      // LocalServer ท้องถิ่นที่ใช้เพื่อให้บริการพอร์ทัลการกำหนดค่า 
# include  < WiFiManager.h >           // https: / /github.com/tzapu/WiFiManager WiFi Magic Configuration
  • เริ่มต้นไลบรารีในการตั้งค่าฟังก์ชั่นของคุณเพิ่ม

WiFiManager wifiManager;

  • นอกจากนี้ในฟังก์ชั่นการตั้งค่าเพิ่ม

//พารามิเตอร์แรกคือชื่อของจุดเชื่อมต่อที่สองคือรหัสผ่าน wifiManager.autoConnect ( " AP-NAME " , " AP-PASSWORD " );

หากคุณต้องการจุดเชื่อมต่อที่ไม่ปลอดภัย

wifiManager.autoConnect ( " AP-NAME " );

หรือถ้าคุณต้องการใช้และสร้างชื่อโดยอัตโนมัติจาก ‘ESP’ และใช้ Chip ID ของ esp

wifiManager.autoConnect ();

หลังจากที่คุณเขียนร่างของคุณและเริ่ม ESP มันจะพยายามเชื่อมต่อกับ WiFi ถ้ามันล้มเหลวมันเริ่มในโหมดจุดเข้าใช้งาน ขณะที่อยู่ในโหมด AP ให้เชื่อมต่อแล้วเปิดเบราว์เซอร์กับเกตเวย์ IP ค่าเริ่มต้น 192.168.4.1 กำหนดค่า wifi บันทึกและควรรีบูตและเชื่อมต่อ

เพิ่มเติม https://github.com/tzapu/WiFiManager

OK ทดสอบแล้วใช้งานได้ โดยสามารถแสดง SSID และ Password

เข้า SSID ตัวแรก

1

ผมเปลี่ยน SSID ใหม่ ผลลัพธ์

2

แม้ว่าเราจะ Reset Esp32 ใหม่ ก็สามารถแสดง SSID และ Password ได้ปกติ

เพิ่ม Code 2 บรรทัดนี้ครับ
3

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

ใช่ครับ ในส่วน Token Blynk เดิม ถ้าเราได้ Token Blynk ใหม่มา ก็วางลงไปในช่อง Token Blynk ได้เลยครับ โดยไม่ต้องแก้ Token Blynk เดิม ที่มีใน Sketch ของเรา

อันนี้ลองแก้ + เพิ่มเติม Ap config ของ WiFi Manager ดูเล่นๆ ครับ1

2

const char HTTP_HEAD_END[] PROGMEM = "</head><body><div style='text-align:left;display:inline-block;min-width:260px;'> <font face=Microsoft Sans Serif size=5 color=#e909a7> <b>PUY IOT</b> </font><br> <br> <br>";

1

1 Likes

น่าสนใจมากครับพี่ น่าสามารถเอาไปต่อยอดเป็น product ได้เลยนะครับ คือให้ ผู้ใช้สามารถตั้งค่าเองได้ ไม่ต้องฟิกโค้ตก่อนส่งไปใหม่ทุกครั้ง

ผมทำ WiFi Manager แบบนี้มาตั้งแต่เริ่ม Post ใน https://eleceasy.com/ แล้วครับ แต่ไม่รู้จะอธิบายให้สมาชิกท่านอื่น เข้าใจยังไงดี :sweat_smile:

1 Likes

ผมก็อ่านเข้าใจง่ายอยู่นะครับ พี่ ตัองอ่าน+ลองผิดลองถูกเยอะๆ ผมก็เคยคลุกวงในกับ wifi manager อยู่ช่วงหนึ่ง ก่อนจะขยับ ไปเล่น wifi multi เดียวคงต้องย้อนกลับมาเก็บคอนเซบกับ wifi manager ต่อ :grin:

https://base64.guru/converter/decode/image

@PUYIOT ขอโทษนะครับ พอดีผม verify ไม่ผ่าน error แบบนี้หมายความว่าไงครับ

ลบ library ที่วางซ้ำออกไปก่อนครับ

1 Likes

ได้แล้วคับ เย้… ขอบคุณคับ :smile: :smile:

ทดสอบ ESP32 WiFiManager ว่าใช้งานได้ครอบคลุมทุกเงื่อนไขหรือไม่ เป็นการทำให้สมาชิก https://eleceasy.com/ ที่สนใจเรื่องนี้ได้มั่นใจครับว่า มันใช้งานได้แน่นอน Code ทุก Post เกี่ยวกับเรื่องนี้ ผม Update ใหม่หมดแล้วนะครับ สมาชิกหรือผู้ที่แวะเข้ามาดูสามารถ Copy ใหม่ได้

2 Likes

ขอบคุณครับพี่ :grin:

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

1 Likes

AdvancedWebServer:11:73: error: WiFiManager.h: No such file or directory

Multiple libraries were found for “FS.h”
compilation terminated.

ลงไลบารี่แล้วยังขึ้น error อยู่เลยครับ