Button Debouncing
Last updated
Last updated
Ketika kita menggunakan komponen push button atau switch mechanical, maka akan ada fenomena yang bernama button bounce atau bahasa Indonesianya mantul-mantul. Button bounce terjadi pada kontak fisik dari push button atau switch tersebut. Hal ini terjadi karena kontak fisik dari push button atau switch terbuat dari metal sehingga memiliki elastisitas.
Button bounce menyebabkan noise pada sinyal input untuk GPIO seperti pada gambar berikut ini. Fenomena ini bisa terjadi selama beberapa micro sampai mili detik sampai nilai button tersebut stabil. Noise ini dapat menyebabkan kesalahan pembacaan oleh GPIO terutama pada aplikasi pembacaan jumlah penekanan button. Satu kali penekanan button oleh user, dapat terbaca berkali-kali oleh mikrokontroler.
Solusi untuk masalah ini disebut button debouncing. Ada banyak metode debouncing yang bisa digunakan, mulai dari debouncing dengan hardware sampai debouncing dengan software. Pada tutorial ini akan dibahas mengenai debouncing dengan software.
Metode debouncing dengan software dilakukan dengan menggunakan timer untuk menunggu sampai nilai GPIO stabil, kemudian nilai tersebut yang akan dibaca. Proses debouncing ini digambarkan pada gambar berikut ini.
Rangkaian yang dibuat yaitu sebagai berikut. ESP32 dan modul OLED dihubungkan dengan bus I2C. Pin yang digunakan yaitu pin 32 untuk SCL dan pin 33 untuk SDA. Button dihubungkan dengan pin 22 dan GND.
Pada contoh progam ini, kita akan melakukan pembacaan push button tanpa debouncing. Program ini berisi dua bagian kode untuk OLED display dan button. Bagian pembacaan button yaitu pada line 45. Pada line 47, jika nilai button adalah LOW
, maka nilai variabel counter
akan dinaikkan sebanyak satu.
Gambar berikut ini menampilkan hasil penekanan tombol tanpa debouncing. Setiap kali penekanan, counter bertambah lebih dari satu.
Pada contoh progam ini, kita akan melakukan pembacaan push button dengan debouncing. Berikut ini cara kerjanya:
Pada line 49, kita melakukan pembacaan push button kemudian disimpan pada variable lokal bernama reading
. Nilai variable ini menyimpan pembacaan button secara real-time dan tanpa debouncing.
Pada line 52-56, kita melakukan perbandingan antara nilai button yang terbaca saat ini (reading
) dan nilai button yang terbaca pada iterasi loop sebelumnya (last_button_state
). Jika nilainya berbeda, maka ini berarti nilai GPIO masih berubah-ubah atau belum stabil (masih berada dalam tahap noise bounce). Jika masih dalam tahap bounce, maka timer akan selalu di-reset (di-update dengan nilai millis terbaru).
Pada line 59-77, kondisi if
tersebut akan terpenuhi ketika noise bounce sudah terlewati dan timer debouncing sudah memenuhi waktu yang ditetapkan di variable debounce_delay
. Jika kondisi ini terpenuhi, maka ini dianggap terjadi penekanan button yang valid. Selanjutnya kita melakukan update state button pada variable button_state
, kemudian jika state bernilai LOW, maka nilai variabel counter
akan dinaikkan sebanyak satu.
Pada line 81, kita menyimpan nilai pembacaan button saat ini untuk iterasi loop berikutnya.
Gambar berikut ini menampilkan hasil penekanan tombol dengan debouncing. Setiap kali penekanan, counter bertambah hanya satu.