Setelah mencoba menggunakan WiFi Manager pada tutorial sebelumnya, sekarang kita akan coba gunakan fasilitas OnDemandConfig.
Fasilitas ini memungkinkan kita masuk ke Config Mode pada saat aplikasi berjalan, misalnya kita mau ganti WiFi/SSID nya.
Pada contoh di bawah ini, saya menggunakan Switch yang terhubung ke GPIO13. Saat Switch ini terhubung ke GND, maka akan masuk ke OnDemanConfig. Sengaja SSID saat masuk ke OnDemandConfig diubah sebagai identifikasi saja bahwa masuk ke OnDemanConfig.
Program lengkap nya adalah sebagai berikut :
Untuk Button dapat didownload disini . Library Button ini sudah dilengkapi dengan debounce
#include <WiFiManager.h> // https://github.com/tzapu/WiFiManager
#include "Button.h"
const char* ntpServer = "pool.ntp.org";
const long gmtOffset_sec = 3600*7;
const int daylightOffset_sec = 0;
#define CONFIG_PIN 13
Button ConfigButton(CONFIG_PIN);
String Hari[7] = {"Minggu", "Senin ", "Selasa", "Rabu", "Kamis", "Jumat", "Sabtu"};
String Bulan[12] = {"Januari", "Februari ", "Maret", "April", "Mei", "Juni", "Juli", "Agustus", "September", "Oktober", "November", "Desember"};
char Tanggal[50] = "";
char Jam[20] = "";
#define DELAY_TAMPIL 5000
unsigned long lastGetTime = 0;
void printLocalTime(){
struct tm timeinfo;
if(!getLocalTime(&timeinfo)){
Serial.println("Failed to obtain time");
return;
}
// Year dalam timestruct dihitung sejak 1900
sprintf(Tanggal, "%s,%d %s %d ",Hari[timeinfo.tm_wday],timeinfo.tm_mday,Bulan[timeinfo.tm_mon],timeinfo.tm_year+1900);
sprintf(Jam, "%02d:%02d:%02d ",timeinfo.tm_hour,timeinfo.tm_min,timeinfo.tm_sec);
Serial.print("Tanggal Format Indonesia : ");
Serial.println(Tanggal);
Serial.print("Jam Format Indonesia : ");
Serial.println(Jam);
Serial.println("=====================");
}
void configModeCallback (WiFiManager *myWiFiManager) {
Serial.println("===================================");
Serial.println("Masuk ke mode konfigurasi");
Serial.print("IP Address yang bisa diakses : ");
Serial.println(WiFi.softAPIP());
Serial.print("WiFi/SSID : ");
Serial.println(myWiFiManager->getConfigPortalSSID());
Serial.println("===================================");
}
void setup() {
bool res;
Serial.begin(115200);
pinMode(CONFIG_PIN, INPUT_PULLUP);
//WiFiManager, Local intialization. Once its business is done, there is no need to keep it around
WiFiManager wm;
// reset settings - wipe stored credentials for testing
// these are stored by the esp library
// wm.resetSettings();
// Callback ini dipakai jika ingin melakukan sesuatu sebelum
// menjalankan AutoConnect
// Sebagai contoh, sebelum connect, kita akan tampilkan IP Addressnya
wm.setAPCallback(configModeCallback);
// Ambil SSID dan password dari EEPROM, lalu coba connect
// Jika SSID dan password tidak ada atau tidak bisa connect,
// maka board akan bertindak sebagai access point dengan SSID
// "Wemos D1 Mini AP" dengan pass = "132457"
// dan terus looping disini sampai menunggu konfigurasi
res = wm.autoConnect("ESP32 Server","123456789");
if(!res) {
Serial.println("Tidak bisa terhubung ke WiFi");
// ESP.restart();
}
else {
// Jika berhasil connect ke WiFi
Serial.println("WiFi siap digunakan");
Serial.print("IP Address :");
Serial.println(WiFi.localIP());
// Inisialiasi dan ambil waktu dari NTP Server
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
printLocalTime();
}
}
void ConfigPortal(){
WiFiManager wm;
if (!wm.startConfigPortal("ConfigESP32")) {
Serial.println("failed to connect and hit timeout");
delay(3000);
//reset and try again, or maybe put it to deep sleep
ESP.restart();
delay(5000);
}
//if you get here you have connected to the WiFi
Serial.println("Terhubung ke Jaringan");
}
void loop() {
// SETIAP 5 DETIK PRINT WAKTU
if ((millis() - lastGetTime) >= DELAY_TAMPIL){
lastGetTime = millis();
printLocalTime();
}
// JIKA TOMBOL CONFIG DITEKAN, MAKA AKAN MASUK KE MODE CONFIG
if (ConfigButton.pressed()) {
ConfigPortal();
}
}