ESP32 WiFi Manager OnDemandConfig

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();
  }    
}

Leave a Comment

Your email address will not be published. Required fields are marked *