Input Digital & Waktu

Belajar mengelola waktu dengan presisi menggunakan millis() serta menangani input tombol digital secara handal menggunakan teknik debounce.

90 Menit
Modul 5: Pemrograman Arduino Dasar
Pertemuan 11

TPTujuan Pembelajaran

  1. Peserta didik dapat menggunakan millis() sebagai alternatif delay() yang non-blocking
  2. Peserta didik dapat membaca input tombol dengan benar menggunakan debounce
  3. Peserta didik dapat menghitung waktu berlalu menggunakan millis() untuk timing presisi
  4. Peserta didik dapat membangun LED counter: menghitung jumlah kali tombol ditekan

Masalah dengan delay(): Program yang Membeku

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?

millis(): Jam Tangan Arduino

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.

Perbandingan Eksekusi delay() vs millis()

Debounce: Mengatasi Tombol yang 'Berisik'

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!

Project: LED Counter dengan Tombol

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

LedCounter_Debounce.ino
cpp
const int BTN_PIN = 7;
const int LED_PIN = 13;

int hitungan = 0;
bool tombolSebelumnya = HIGH;
unsigned long waktuTekanTerakhir = 0;
const unsigned long DEBOUNCE_MS = 50;

void setup() {
  pinMode(BTN_PIN, INPUT_PULLUP);
  pinMode(LED_PIN, OUTPUT);
  Serial.begin(9600);
  Serial.println("Counter Tombol - Mulai Tekan!");
}

void loop() {
  bool tombolSekarang = digitalRead(BTN_PIN);
  unsigned long sekarang = millis();
  
  if (tombolSebelumnya == HIGH && tombolSekarang == LOW) {
    if (sekarang - waktuTekanTerakhir > DEBOUNCE_MS) {
      hitungan++;
      waktuTekanTerakhir = sekarang;
      
      // Flash LED sebagai feedback visual
      digitalWrite(LED_PIN, HIGH);
      delay(50);
      digitalWrite(LED_PIN, LOW);
      
      Serial.print("Tombol ditekan ke-");
      Serial.print(hitungan);
      Serial.println(" kali");
    }
  }
  tombolSebelumnya = tombolSekarang;
}
Serial Monitor Output
Counter Tombol - Mulai Tekan! Tombol ditekan ke-1 kali Tombol ditekan ke-2 kali Tombol ditekan ke-3 kali Tombol ditekan ke-4 kali

Troubleshooting

Masalah:Tombol ditekan sekali, angka bertambah 3 atau 4.

Solusi:Waktu DEBOUNCE_MS mungkin terlalu kecil untuk tombolmu. Coba naikkan ke 100 atau 150.


Masalah:Tidak ada tulisan di Serial Monitor.

Solusi:Pastikan baud rate di Serial Monitor sudah diset ke 9600, sama dengan Serial.begin(9600).

Timing Presisi: millis() vs delay()

Kapan kita harus pakai delay() dan kapan harus millis()? Berikut adalah aturannya:

Gunakan delay() jika:

  • Programnya sederhana (hanya nyala-mati berurutan).
  • Waktu tunggu sangat singkat (misal kurang dari 50ms).
  • Tidak ada tombol atau sensor yang perlu dibaca secara instan.

Gunakan millis() jika:

  • Ada tugas ganda (multitasking).
  • Membaca input dari user (tombol, keypad).
  • Membutuhkan pengukuran waktu (stopwatch, timer).

Cek Pemahaman

Tipe data apa yang WAJIB digunakan untuk menyimpan hasil dari fungsi millis()?

Mudah

Mengapa kita memerlukan teknik 'Debounce' pada tombol mekanik?

Sedang

Latihan: Stopwatch Digital

Tantangan Stopwatch Sederhana

Ubah kode Project LED Counter di atas menjadi sebuah Stopwatch Digital sederhana di Serial Monitor dengan ketentuan:

  1. Saat tombol ditekan, catat nilai waktu saat itu dari millis() dan cetak "Mulai!"
  2. Saat tombol ditekan KEDUA KALINYA, hitung selisih waktu dari tekanan pertama ke tekanan kedua.
  3. Cetak selisih waktunya di Serial Monitor: "Waktu berlalu: ... milidetik"

Petunjuk: Kamu butuh sebuah variabel boolean untuk melacak apakah stopwatch sedang berjalan (true) atau sedang berhenti (false).

Ringkasan & Refleksi

Apa yang telah kita pelajari?
  • delay() bersifat blocking; membuat Arduino berhenti bekerja dan tidak bisa membaca input.
  • millis() bersifat non-blocking; ia adalah "jam tangan" Arduino yang menghitung waktu sejak dinyalakan.
  • Tipe data untuk menyimpan waktu millis() adalah unsigned long.
  • Debounce diperlukan untuk mengatasi fenomena bouncing pada tombol mekanik agar satu tekanan tidak terhitung berulang kali.

RRefleksi Belajar

Luangkan 2–3 menit untuk menjawab pertanyaan di bawah secara jujur.

Kejutan & Penemuan

Apa yang paling mengejutkan atau menarik hari ini?

Hal baru apa tentang cara kerja tombol yang mengejutkanmu hari ini?

Masih Membingungkan

Apa yang masih membingungkan atau ingin kamu pahami lebih dalam?

Bagian mana dari logika if bertingkat pada kode debounce yang masih membingungkan?

Rencana Selanjutnya

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.