สวัสดีครับทุกท่าน สำหรับในหัวข้อนี้ ผมมีจุดประสงค์คือต้องการทำ WiFi Manager กับ ESP32 ในการเชื่อมต่อ WiFi โดยการกดปุ่ม Config และสามารถเชื่อมต่อกับแอพพลิเคชั่น Blynk ได้ ซึ่งเดิมผมใช้ระบบนี้กับ NODEMCU ESP 8266 ก็สามารถทำงานได้อย่างปกติ ดังนั้นจึงมีความต้องการที่จะนำมาใช้กับ ESP32 ด้วย
สำหรับตัว Code นั้นผมจะใช้ Code ชุดเดิมที่ใช้อยู่กับ NODEMCU ESP 8266 เพียงแต่มีการปรับแต่งและแก้ไขบ้างเพื่อให้สอดคล้องกับตัวอุปกรณ์ ESP32 โดยผมได้ศึกษาจากเว็บไซต์ต่างๆ ที่เกี่ยวข้องในเรื่องนี้ และได้นำมารวบรวม ประยุกต์ ปรับเปลี่ยน เพื่อให้สามารถใช้งานได้
โดยผมจะเรียงลำดับวิธีการทำงานดังนี้ครับ
-
เพิ่ม บอร์ดESP32 ใน arduino ide
https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
copy Link นี้ไปไว้ที่
-
ไปที่เมนูTools/ Board…/ Board Manager/ ผมเลือกติดตั้ง Version ล่าสุดครับ
-
แก้ code นิดหน่อยครับ ไปที่ C:\Users\ชื่อ USER ของเครื่องคอม \AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.4\libraries\WebServer\src\HTTP_Method.h
ในบรรทัดที่ 10 จาก HTTP_HEAD → HTTP_HEADER แล้ว Save ไฟล์ แค่นี้ครับ
- ArduinoJson, Blynk ผมเลือกรุ่นตามนี้ครับ
4.wifi manager ESP32 Download ที่ GitHub - tonyp7/esp32-wifi-manager: Captive Portal for ESP32 that can connect to a saved wireless network or start an access point where you can connect to existing wifis.
นำไปวางที่ตำแหน่ง C:\Users\ชื่อ USER ของเครื่องคอม\Documents\Arduino\libraries จะได้
- Code (Update 23_01_2563 23:55)
ทดสอบ ESP32 WiFiManager ว่าใช้งานได้ครอบคลุมทุกเงื่อนไขหรือไม่ เป็นการทำให้สมาชิก https://eleceasy.com/ ที่สนใจเรื่องนี้ได้มั่นใจครับว่า มันใช้งานได้แน่นอน Code ทุก Post เกี่ยวกับเรื่องนี้ ผม Update ใหม่หมดแล้วนะครับ สมาชิกหรือผู้ที่แวะเข้ามาดูสามารถ Copy ใหม่ได้
ทดสอบESP32 WiFiManager ใช้งานได้100% - YouTube
#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] = "rhsckR3XiXBq7qbxxx2EElqiHUgWfbqn";//ใส่ 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());
// 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);
}
}
ภาพการ Config ค่า
ยังไงก็ นำไปทดลองใช้กันดูนะครับ