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

Blok 1: Jaga Koneksi MQTT

  if (!client.connected()) {
    digitalWrite(BUZZER, LOW);
    reconnect();
  }
  client.loop();

Blok 2: Logika Jeda Waktu (Cooldown)

  if (delayMeas)
  {
    if ((currentMillis - previousMillis) >= interval)
    {
      previousMillis = currentMillis;
      delayMeas = false;
      delay(1800);
    }
  }

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
    }

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) ...

Ringkasan Alur loop()

  1. Cek Koneksi: Apakah MQTT OK? Jika tidak, coba hubungkan.
  2. Dengar Pesan: Apakah ada perintah dari server?
  3. Cek Jeda: Apakah sedang cooldown?
    • Ya: Tunggu hingga cooldown selesai.
    • Tidak: Lanjut ke langkah 4.
  4. Cek Kartu: Apakah ada kartu yang valid?
    • Tidak: Ulangi dari langkah 1.
    • Ya: Lanjut ke langkah 5.
  5. Proses & Kirim: Baca UID, format jadi JSON, kirim ke server.
  6. Feedback: Beri bunyi dan kedipan LED.
  7. Aktifkan Cooldown: Nyalakan delayMeas = true;.
  8. 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.