millis(), kenapa delay() itu musuh, dan cara membuat program yang responsif.
delay(): Program "Tidur"
Saat delay(1000) berjalan, MCU tidak melakukan apa-apa selama 1 detik.
Tombol tidak bisa dibaca, sensor tidak bisa diukur, LED lain tidak bisa diubah.
Solusinya: kode non-blocking β program terus berputar, dan setiap putaran mengcek apakah waktunya sudah tiba untuk melakukan sesuatu.
millis(): Jam Internal MCU
millis() mengembalikan jumlah milidetik sejak program mulai,
sebagai unsigned long. Di simulator, setiap putaran loop()
menambah 1 ms, dan setiap delay(ms) melompatkan ms sebanyak itu.
millis() akan wrap (kembali ke 0) setelah Β±49,7 hari.
Cara aman menghitung selang waktu (tahan wrap):
if (millis() == 1000) β bisa terlewat, dan gagal saat wrap.
Tombol mekanik terbuat dari dua lempeng logam. Saat ditekan, lempeng itu memantul (bouncing) beberapa kali dalam Β±50 ms sebelum stabil. Bagi MCU, satu penekanan terbaca sebagai belasan perubahan HIGH/LOW.
Solusi software: saat mendeteksi perubahan, tunggu 50 ms lalu baca lagi. Jika masih sama β penekanan asli.
Tanpa debounce, getar 50 ms di atas akan terhitung sebagai banyak penekanan.
Dengan delay(50) + baca ulang, satu penekanan hanya terhitung satu kali.
Program yang "melakukan banyak hal terjadwal" biasanya ditulis sebagai state machine: program punya state (keadaan), dan setiap putaran loop memeriksa state + kondisi untuk berpindah.
micros() untuk Pengukuran Presisi
micros() seperti millis() tapi dalam mikidetik β dipakai untuk
mengukur durasi pulsa (misal sensor ultrasonik, encoder).
delayMicroseconds(us) untuk jeda sangat pendek (misal pulsa TRIG 10 Β΅s).
Detail sensor ultrasonik dibahas di Sensor-Sensor Umum.
if (millis() - terakhir >= 1000) aman terhadap wrap, sedangkan if (millis() > 1000) tidak.