Belajar mengelola waktu dengan presisi menggunakan millis() serta menangani input tombol digital secara handal menggunakan teknik debounce.
Sejauh ini kita sudah sering menggunakan delay(). Fungsi ini memang mudah digunakan: delay(1000) membuat Arduino menunggu 1 detik. Tapi tahukah kamu bahwa delay() memiliki masalah besar saat kita membuat program yang lebih kompleks?
delay() itu seperti kamu sedang memanaskan makanan di microwave selama 5 menit, dan kamu berdiri di depan microwave, diam mematung tanpa melakukan hal lain sampai selesai. Bagaimana jika saat itu ada telepon berdering? Kamu tidak bisa mengangkatnya karena kamu sedang "nge-delay" (membeku). Arduino juga sama! Saat Arduino sedang delay(), ia tidak bisa melakukan hal lain—termasuk membaca tombol yang kamu tekan. Inilah yang kita sebut dengan Blocking Code.Solusi untuk masalah "membeku" tadi adalah menggunakan fungsi millis(). Bayangkan Arduino sekarang memiliki "jam tangan" (stopwatch) tersembunyi yang terus menghitung milidetik (1/1000 detik) sejak Arduino dinyalakan.
Alih-alih membeku, kita membiarkan Arduino melakukan hal lain (seperti mengecek tombol), sambil sesekali melirik "jam tangan" untuk mengecek apakah waktunya sudah tiba untuk melakukan tugas (misalnya menyalakan LED). Teknik ini disebut Non-blocking Code.
millis() menghitung waktu terus-menerus, nilainya akan menjadi sangat besar. Kita harus menyimpannya dalam tipe data unsigned long (bilangan bulat positif besar). Setelah sekitar 50 hari Arduino menyala terus-menerus, nilai millis() akan mencapai batas maksimum dan kembali ke 0. Ini disebut Overflow. Tapi untuk projek sekolah kita, 50 hari itu waktu yang sangat lama!Komponen mekanis seperti tombol atau sakelar (push button) tidaklah sempura. Di dalamnya terdapat logam yang saling bersentuhan. Saat kita menekannya sekali, secara mikroskopis lempengan logam tersebut akan memantul (bouncing) sebelum akhirnya menempel dengan stabil.
Untuk mengatasinya, kita butuh teknik yang disebut Debounce. Secara logika: "Jika tombol terdeteksi ditekan, tunggu dulu sekitar 50 milidetik (sampai pantulan logam stabil), baru anggap itu sebagai 1 tekanan yang sah." Dan kita menggunakan millis() untuk ini!
Mari kita buat program untuk menghitung berapa kali tombol ditekan. Setiap kali ditekan (dengan debounce yang benar), jumlah tekanan bertambah dan ditampilkan di Serial Monitor, plus LED built-in berkedip sesaat sebagai tanda (feedback).
Solusi:Waktu DEBOUNCE_MS mungkin terlalu kecil untuk tombolmu. Coba naikkan ke 100 atau 150.
Solusi:Pastikan baud rate di Serial Monitor sudah diset ke 9600, sama dengan Serial.begin(9600).
Kapan kita harus pakai delay() dan kapan harus millis()? Berikut adalah aturannya:
Ubah kode Project LED Counter di atas menjadi sebuah Stopwatch Digital sederhana di Serial Monitor dengan ketentuan:
millis() dan cetak "Mulai!""Waktu berlalu: ... milidetik"Petunjuk: Kamu butuh sebuah variabel boolean untuk melacak apakah stopwatch sedang berjalan (true) atau sedang berhenti (false).
Luangkan 2–3 menit untuk menjawab pertanyaan di bawah secara jujur.
Apa yang paling mengejutkan atau menarik hari ini?
Hal baru apa tentang cara kerja tombol yang mengejutkanmu hari ini?
Apa yang masih membingungkan atau ingin kamu pahami lebih dalam?
Bagian mana dari logika if bertingkat pada kode debounce yang masih membingungkan?
Apa yang ingin kamu coba atau pelajari minggu depan?
Ide projek apa yang sekarang bisa kamu buat karena sudah bisa membaca tombol dan waktu dengan presisi?
Refleksi tidak dinilai — ini adalah ruang jujurmu untuk berpikir.