Penjelasan Program Absensi RFID dan ESP32 (Uji Kompetensi Edition) - 4. wifi_setup
Ini adalah salah satu fungsi paling penting yang membuat proyek ini menjadi sangat user-friendly.
Tujuan Utama: Fungsi ini bertanggung jawab untuk menghubungkan ESP32 ke jaringan Wi-Fi. Namun, ia melakukan ini dengan cara yang sangat cerdas: jika belum ada pengaturan, ia akan memudahkan pengguna untuk mengaturnya melalui browser.
Bayangkan fungsi ini sebagai "Teknisi Jaringan Otomatis" yang ada di dalam perangkat Anda.
Pembahasan Blok per Blok
Blok 1: Membuat Identitas Unik (Client ID)
WiFi.macAddress(MAC_array);
for (int i = 0; i < sizeof(MAC_array) - 1; ++i) {
sprintf(MAC_char, "%s%02x:", MAC_char, MAC_array[i]);
}
sprintf(MAC_char, "%s%02x", MAC_char, MAC_array[sizeof(MAC_array) - 1]);
- Fungsi: Mengambil alamat MAC hardware ESP32 dan memformatnya menjadi string yang mudah dibaca (misal:
a4:cf:12:5b:9c:7f). - Mengapa Ini Penting? Alamat MAC ini digunakan sebagai Client ID saat terhubung ke server MQTT. Setiap perangkat di jaringan MQTT harus memiliki ID yang unik. Dengan menggunakan MAC, kita dijamin tidak akan ada dua perangkat absensi yang memiliki ID yang sama, bahkan jika ada puluhan unit yang di-deploy.
Blok 2: Membuat Formulir Konfigurasi
WiFiManagerParameter custom_mqtt_server("server", "mqtt server", mqtt_server, 40);
String(mqtt_port).toCharArray(smqtt_port, 5);
WiFiManagerParameter custom_mqtt_port("port", "mqtt port", smqtt_port, 5);
// ... dan seterusnya untuk user, password, keyword1, keyword2
- Fungsi: Membuat bidang-bidang isian (form fields) yang akan muncul di halaman konfigurasi web.
- Penjelasan: Setiap baris
WiFiManagerParameteradalah seperti mendesain satu pertanyaan dalam formulir."server": Nama internal dari bidang ini (sepertiiddi HTML)."mqtt server": Label yang akan dilihat pengguna di halaman web.mqtt_server: Nilai default yang akan terisi otomatis. Ini sangat berguna saat pengguna ingin mengedit pengaturan yang sudah ada.40: Panjang maksimal karakter yang bisa diinput.
- Kasus Khusus
mqtt_port: KarenaWiFiManagerParametermembutuhkan teks (char*), sedangkanmqtt_portadalah angka (int), kita perlu mengubahnya terlebih dahulu menjadi string denganString(...).toCharArray(...).
Blok 3: Mengonfigurasi dan Menjalankan WiFiManager
WiFiManager wifiManager;
wifiManager.setSaveConfigCallback(saveConfigCallback);
wifiManager.addParameter(&custom_mqtt_server);
wifiManager.addParameter(&custom_mqtt_port);
// ... dan seterusnya
WiFiManager wifiManager;: Membuat objek "Teknisi Jaringan Otomatis".wifiManager.setSaveConfigCallback(saveConfigCallback);: Memberikan instruksi penting: "HeiwifiManager, jika pengguna menekan tombol Save, tolong jalankan fungsisaveConfigCallbackya". Fungsi inilah yang akan menandai bahwa pengaturan perlu disimpan ke fileconfig.json.wifiManager.addParameter(&custom_mqtt_server);: Ini adalah perintah untuk "memasang" setiap bidang isian yang sudah kita rancang di Blok 2 ke dalam halaman web. TanpaaddParameter, form tidak akan muncul.
Blok 4: Memulai Proses Koneksi
if (!wifiManager.autoConnect("AbesensiRFID", "password")) {
Serial.println("failed to connect and hit timeout");
delay(3000);
ESP.reset();
delay(5000);
}
wifiManager.autoConnect("AbesensiRFID", "password"): Ini adalah perintah utama yang memulai semuanya.autoConnectakan melakukan hal berikut:- Coba membaca pengaturan Wi-Fi yang tersimpan dan terhubung.
- Jika tidak ada pengaturan atau gagal terhubung, ia akan membuat hotspot Wi-Fi (Access Point) dengan nama
AbesensiRFIDdan passwordpassword.
if (!wifiManager.autoConnect(...)): Kondisiifini akan menjaditruejikaautoConnectgagal. Ini terjadi jika, misalnya, pengguna terhubung ke hotspotAbesensiRFIDtetapi tidak menyelesaikan konfigurasi dalam waktu tertentu (timeout).ESP.reset();: Jika terjadi timeout, program akan me-restart ESP32. Ini adalah cara untuk memulai ulang proses konfigurasi dari awal.
Blok 5: Menampilkan Status Koneksi
Serial.println("");
Serial.println("WiFi connected To:");
Serial.println(WiFi.SSID());
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
printMACAddress();
- Fungsi: Blok ini hanya akan dijalankan jika koneksi berhasil.
- Penjelasan: Ia mencetak informasi penting ke Serial Monitor untuk tujuan debugging dan konfirmasi:
- Nama SSID Wi-Fi yang berhasil dihubungi.
- Alamat IP yang didapatkan dari router.
- Alamat MAC perangkat.
Alur Kerja dari Perspektif Pengguna
Skenario 1: Penggunaan Pertama Kali
- ESP32 dinyalakan.
setup_wifi()dijalankan.autoConnect()tidak menemukan pengaturan Wi-Fi yang tersimpan.- ESP32 membuat hotspot bernama
AbesensiRFID. - Pengguna terhubung ke hotspot ini dengan password
password. - Browser pengguna otomatis terbuka ke halaman konfigurasi yang berisi semua form (server, port, user, dll).
- Pengguna mengisi form dan klik Save.
saveConfigCallbackdipanggil,shouldSaveConfigmenjaditrue.- ESP32 terhubung ke Wi-Fi yang baru disetel.
- Program mencetak status sukses dan melanjutkan ke
loop().
Skenario 2: Penggunaan Normal (Setelah Konfigurasi)
- ESP32 dinyalakan.
setup_wifi()dijalankan.autoConnect()menemukan pengaturan Wi-Fi yang tersimpan diconfig.json.- ESP32 langsung terhubung ke Wi-Fi tanpa membuat hotspot.
- Program mencetak status sukses dan melanjutkan ke
loop().
Dengan desain ini, setup_wifi() membuat perangkat IoT Anda menjadi plug-and-play dan sangat mudah dikonfigurasi oleh siapa saja.