Arduino

Debounce Tombol Arduino dan ESP32 Tanpa delay(): Contoh Kode

Proyek Arduino dengan tombol dan LED

Debounce adalah cara mengabaikan getaran kontak tombol supaya satu kali tekan hanya terbaca satu kali. Saat ditekan, kontak mekanis tombol memantul beberapa kali dalam hitungan milidetik, dan mikrokontroler yang cepat membacanya sebagai beberapa kali tekan. Cara paling rapi adalah debounce dengan millis(), tanpa delay(), sehingga program tetap bisa mengerjakan hal lain.

Kenapa tombol "memantul"?

Di dalam tombol, dua keping logam bersentuhan. Saat ditekan, keping itu tidak langsung menempel diam, tapi bergetar sangat singkat: sambung, lepas, sambung lagi. Kita tidak merasakannya, tapi mikrokontroler yang membaca ribuan kali per detik melihat beberapa perubahan. Akibatnya, LED yang seharusnya toggle sekali malah nyala-mati-nyala.

Cara mudah tapi kurang baik: delay()

Menambahkan delay(50) setelah membaca tombol memang menghilangkan pantulan, tapi selama 50 ms program berhenti total. Kalau program juga membaca sensor, mengirim data WiFi, atau menangani beberapa tombol, delay membuat semuanya tersendat.

Debounce dengan millis()

Idenya: catat waktu terakhir pembacaan tombol berubah. Hanya terima perubahan kalau kondisinya sudah stabil lebih lama dari waktu debounce, misalnya 50 ms.

const int TOMBOL = 4;
const int LED = 2;
const unsigned long DEBOUNCE_MS = 50;

int kondisiStabil = HIGH;        // pakai INPUT_PULLUP: HIGH = dilepas
int bacaanTerakhir = HIGH;
unsigned long waktuBerubah = 0;
bool ledNyala = false;

void setup() {
  pinMode(TOMBOL, INPUT_PULLUP);
  pinMode(LED, OUTPUT);
}

void loop() {
  int bacaan = digitalRead(TOMBOL);
  if (bacaan != bacaanTerakhir) {          // ada perubahan, mulai hitung
    waktuBerubah = millis();
    bacaanTerakhir = bacaan;
  }
  if (millis() - waktuBerubah > DEBOUNCE_MS && bacaan != kondisiStabil) {
    kondisiStabil = bacaan;                // perubahan sudah stabil
    if (kondisiStabil == LOW) {            // baru saja ditekan
      ledNyala = !ledNyala;
      digitalWrite(LED, ledNyala);
    }
  }
  // program lain tetap berjalan di sini tanpa terhenti
}

Banyak tombol sekaligus

Untuk beberapa tombol, simpan variabel di atas dalam array atau struct per tombol. Proyek Kontrol 5 LED dengan Tombol di Proyek Siap Pakai SALTECH memakai cara ini untuk lima tombol dan lima LED sekaligus.

Debounce dengan hardware

Pantulan juga bisa diredam dengan rangkaian RC: resistor dan kapasitor kecil (misalnya 10 kΩ dan 100 nF) di jalur tombol, kadang ditambah Schmitt trigger. Cara ini berguna untuk tombol yang memicu interrupt atau di lingkungan berisik. Untuk kebanyakan proyek, debounce di program sudah cukup dan tidak menambah komponen.

Berapa waktu debounce yang tepat?

  • 20–50 ms cocok untuk kebanyakan tombol tactile.
  • Tombol besar atau saklar mekanis murah kadang butuh lebih lama.
  • Kalau tombol terasa "tidak responsif", kecilkan waktunya. Kalau masih terbaca ganda, besarkan.

Kesimpulan

Tombol selalu memantul, jadi selalu butuh debounce. Pakai millis() supaya program tetap responsif, simpan status per tombol, dan tambahkan debounce hardware bila perlu. Mau kode yang sudah rapi dan teruji? Cek Proyek Siap Pakai.

Pertanyaan yang sering muncul

Apakah ada library debounce?

Ada beberapa library Arduino untuk debounce tombol. Tapi memahami cara manualnya membantu saat kamu butuh logika khusus, seperti tekan lama atau tekan dua kali.

Apakah debounce perlu untuk sensor digital?

Tergantung sensornya. Sensor dengan kontak mekanis (reed switch, limit switch) biasanya butuh debounce. Sensor elektronik umumnya tidak.

Tanya via WhatsApp