Penjelasan Program Absensi RFID dan ESP32 (Uji Kompetensi Edition) - 7. variable
Mereka adalah variabel global yang dideklarasikan di luar fungsi setup() dan loop(), dan mereka bekerja sama untuk mengontrol alur program, terutama yang berhubungan dengan waktu.
1. unsigned long previousMillis = 0;
- Tipe Data:
unsigned long - Fungsi: Variabel ini berfungsi sebagai "penanda waktu" (timestamp). Ia digunakan untuk menyimpan nilai waktu (dalam milidetik) pada saat sebuah peristiwa terjadi.
Penjelasan Detail:
- Kenapa
unsigned long? Fungsimillis()(yang menghitung waktu sejak ESP32 menyala) menghasilkan angka yang sangat besar. Tipe dataunsigned longmampu menyimpan angka positif yang sangat besar (hingga 4 miliar lebih), sehingga cocok untuk menyimpan nilai darimillis(). Jika menggunakanint, program akan cepat error karena angkanya terlalu besar. - Cara Kerja: Variabel ini adalah kunci dari teknik "Blink Without Delay". Ia menyimpan waktu terakhir sebuah peristiwa terjadi. Program kemudian akan membandingkan waktu saat ini (
millis()) dengan waktu yang tersimpan dipreviousMillisuntuk mengetahui apakah interval waktu tertentu sudah lewat.
Analogi: Bayangkan Anda sedang merebus telur. Anda melihat jam dan mencatat waktu saat Anda memasukkan telur (previousMillis = millis()). Lalu, Anda sesekali melihat jam lagi (millis()) dan membandingkannya dengan catatan awal Anda untuk tahu apakah sudah 7 menit.
2. bool delayMeas = false;
- Tipe Data:
bool(Boolean) - Fungsi: Variabel ini berfungsi sebagai "saklar" atau "tanda" (flag) yang mengontrol keadaan program: apakah sedang dalam masa jeda atau tidak.
Penjelasan Detail:
- Kenapa
bool? Tipe databoolhanya memiliki dua nilai:trueataufalse. Ini sempurna untuk mewakili dua keadaan:false: Tidak ada jeda. Program diizinkan untuk mencoba membaca kartu RFID.true: Sedang jeda. Program dilarang membaca kartu dan harus menunggu hingga waktu jeda selesai.
- Cara Kerja:
- Saat program dimulai,
delayMeasadalahfalse, sehingga siap membaca kartu. - Setelah sebuah kartu berhasil dibaca, variabel ini diubah menjadi
true(delayMeas = true;). - Di loop berikutnya, program akan melihat
delayMeasbernilaitruedan menjalankan kode untuk pengecekan waktu jeda (yang menggunakanpreviousMillis). - Setelah jeda waktu selesai,
delayMeasdikembalikan lagi kefalse(delayMeas = false;), dan program siap membaca kartu lagi.
- Saat program dimulai,
Analogi: Ini seperti lampu lalu lintas. false adalah lampu hijau (boleh lewat/baca kartu), dan true adalah lampu merah (harus berhenti/tunggu).
3. int value = 0;
- Tipe Data:
int(Integer/Bilangan Bulat) - Fungsi: Tidak ada fungsi apa-apa dalam kode ini.
Penjelasan Detail:
Jika Anda teliti memeriksa seluruh kode yang Anda berikan, variabel value tidak pernah digunakan di mana pun setelah dideklarasikan.
- Kemungkinan Penyebab: Ini adalah sisa kode (leftover code) dari versi sebelumnya. Mungkin pada awalnya, programmer mengikuti contoh dasar seperti "Blink Without Delay" di mana variabel
valuedigunakan untuk mengubah status LED (misalnya, dariHIGHkeLOW). Saat kode dikembangkan menjadi sistem absensi, variabel ini lupa dihapus. - Dampak: Variabel ini tidak berpengaruh apa pun pada program. Ia hanya sedikit memakan memori (2 byte) dan membuat kode sedikit kurang rapi.
- Rekomendasi: Anda bisa menghapus baris ini dengan aman untuk membersihkan kode.
Hubungan Ketiganya dalam Program
previousMillis dan delayMeas bekerja sama untuk menciptakan sistem jeda yang tidak memblokir program:
- Kartu dibaca.
delayMeasdiubah menjaditrue. Lampu merah menyala.- Waktu saat ini disimpan di
previousMillis. Pencatatan waktu dimulai. - Di loop berikutnya, program melihat lampu merah (
delayMeas == true), lalu mengecek apakah(waktu sekarang - waktu pencatatan) sudah 2 detik?. - Jika belum, loop berlanjut ke pengecekan lain (seperti
client.loop()). - Jika sudah 2 detik,
delayMeasdiubah kembali menjadifalse. Lampu hijau menyala. Sistem siap membaca kartu lagi.
Kesimpulan
Fungsi reconnect() adalah sistem keandalan yang dirancang dengan sangat baik:
- Terus Mencoba: Tidak akan menyerah sampai berhasil.
- Feedback Jelas: Memberi tahu pengguna (melalui LED/Buzzer) dan developer (melalui Serial Monitor) tentang statusnya.
- Penanganan Error Cerdas: Membedakan antara kesalahan fatal (yang membutuhkan restart) dan kesalahan sementara (yang hanya perlu jeda).
- Melengkapi Kembali: Memastikan untuk berlangganan ulang ke topik penting setelah berhasil terhubung kembali.