Penjelasan Program Absensi RFID dan ESP32 (Uji Kompetensi Edition) - 8. loop
Tujuan Utama: Fungsi loop() dijalankan secara terus-menerus berulang-ulang setelah setup() selesai. Ini adalah siklus utama di mana ESP32 melakukan tugasnya sehari-hari: menunggu kartu, membaca, mengirim data, dan menjaga koneksinya.
Bayangkan ini seperti seorang penjaga pintu yang sangat disiplin. Ia melakukan rutinitasnya yang sama berulang-ulang tanpa henti.
Pembahasan Kode Baris per Baris
void loop() {
digitalWrite(BUZZER, LOW);
unsigned long currentMillis = millis();
digitalWrite(BUZZER, LOW);: Langkah pertama di setiap siklus: memastikan buzzer mati. Ini adalah langkah keamanan untuk mencegah buzzer menyala terus-menerus jika ada kesalahan di siklus sebelumnya.unsigned long currentMillis = millis();: Menangkap waktu saat ini. Nilai ini akan digunakan untuk semua pengecekan yang berhubungan dengan waktu di siklus ini.
Blok 1: Jaga Koneksi MQTT
if (!client.connected()) {
digitalWrite(BUZZER, LOW);
reconnect();
}
client.loop();
if (!client.connected()) { reconnect(); }: Ini adalah sistem keandalan. Di setiap siklus, program mengecek: "Apakah saya masih terhubung ke server MQTT?". Jika tidak, ia akan segera menjalankan fungsireconnect()untuk mencoba menyambung kembali.client.loop();: Ini adalah "telinga" untuk pesan MQTT. Fungsi ini WAJIB dipanggil secara berkala. Ia memungkinkan libraryPubSubClientuntuk memeriksa apakah ada pesan masuk dari server. Jika ada, ia akan memanggil fungsicallback(). Tanpa baris ini, perangkat tidak akan pernah bisa menerima perintah restart/reset.
Blok 2: Logika Jeda Waktu (Cooldown)
if (delayMeas)
{
if ((currentMillis - previousMillis) >= interval)
{
previousMillis = currentMillis;
delayMeas = false;
delay(1800);
}
}
if (delayMeas): Pertama, program mengecek saklar jeda. Jika saklar menyala (true), artinya kita sedang dalam masa cooldown setelah pembacaan kartu.if ((currentMillis - previousMillis) >= interval): Jika sedang cooldown, program menghitung apakah durasi cooldown (2 detik) sudah lewat.delayMeas = false;: Jika sudah 2 detik, matikan saklar jeda. Sekarang sistem siap untuk membaca kartu lagi.delay(1800);: Jeda tambahan 1.8 detik. Ini mungkin untuk memberikan waktu cukup bagi pengguna untuk menarik kartunya.
Intinya: Jika delayMeas true, program tidak akan melakukan apa-apa selain menunggu waktu cooldown selesai.
Blok 3: Logika Utama Pembacaan RFID
Ini adalah bagian yang paling penting, yang hanya dijalankan jika tidak ada cooldown (delayMeas adalah false).
else // <-- Perhatikan 'else' ini. Ini dijalankan jika 'delayMeas' adalah 'false'.
{
if ( ! mfrc522.PICC_IsNewCardPresent()) {
digitalWrite(BUZZER, LOW);
delay(550);
return; // Keluar dari loop dan coba lagi dari awal
}
if ( ! mfrc522.PICC_ReadCardSerial()) {
digitalWrite(BUZZER, LOW);
delay(900);
return; // Keluar dari loop dan coba lagi dari awal
}
if ( ! mfrc522.PICC_IsNewCardPresent()): Pemeriksaan 1: "Apakah ada kartu baru di depan pembaca?" Jika tidak, program akan menunggu sebentar (delay(550)) danreturn(menghentikan siklus ini dan memulai siklus baru dari atas).if ( ! mfrc522.PICC_ReadCardSerial()): Pemeriksaan 2: "Oke, ada kartu. Tapi bisakah saya membaca nomor seri (UID)-nya?" Kadang ada kartu yang terdeteksi tapi tidak bisa dibaca. Jika gagal baca, program juga akan menunggu danreturn.
Jika kedua pemeriksaan di atas lolos (tidak return), berarti kita punya kartu yang valid!
Blok 4: Proses dan Pengiriman Data
// ... (kode untuk memformat UID menjadi JSON di 'msg1') ...
Serial.print("Publish message: ");
Serial.println(msg1);
if((client.publish(mqtt_keywords1, msg1) == true) ){
tone(BUZZER,3000,500);
delay(1000);
}
msg[0] = char(0);
delayMeas = true;
// ... (kode untuk kedipan LED) ...
client.publish(...): Mengirim data! Paket JSON (msg1) yang berisi UID dan MAC address dikirim ke server MQTT melalui topikmqtt_keywords1.if(... == true): Program memeriksa apakah pengiriman berhasil.tone(BUZZER,3000,500);: Jika berhasil, buzzer akan berbunyi "beep" selama 500ms sebagai feedback sukses.msg[0] = char(0);: Membersihkan buffer stringmsguntuk persiapan pembacaan berikutnya.delayMeas = true;: INI LANGKAH KRUSIAL! Saklar jeda dinyalakan. Ini mencegah loop berikutnya untuk langsung membaca kartu yang sama. Sekarang program akan masuk ke "Blok 2" (Cooldown) selama 2 detik.- Kedipan LED: Memberikan feedback visual bahwa proses berhasil.
Ringkasan Alur loop()
- Cek Koneksi: Apakah MQTT OK? Jika tidak, coba hubungkan.
- Dengar Pesan: Apakah ada perintah dari server?
- Cek Jeda: Apakah sedang cooldown?
- Ya: Tunggu hingga cooldown selesai.
- Tidak: Lanjut ke langkah 4.
- Cek Kartu: Apakah ada kartu yang valid?
- Tidak: Ulangi dari langkah 1.
- Ya: Lanjut ke langkah 5.
- Proses & Kirim: Baca UID, format jadi JSON, kirim ke server.
- Feedback: Beri bunyi dan kedipan LED.
- Aktifkan Cooldown: Nyalakan
delayMeas = true;. - Ulangi dari Langkah 1.
Struktur if/else yang mengelilingi logika cooldown dan pembacaan kartu memastikan bahwa hanya satu dari dua hal tersebut yang terjadi dalam satu siklus, membuat program berjalan dengan logis dan teratur.