Logo Arduino

Belajar Arduino 5
Membaca Tombol: Input Digital dan Percabangan

oleh: Suryo Adhy Chandra, ST

Pada bab-bab sebelumnya, Arduino hanya mengeluarkan perintah: menyalakan lampu, mematikannya, lalu mengulang. Program semacam itu berjalan sama terus tanpa peduli apa yang terjadi di sekitarnya. Bab ini membahas kebalikannya, yaitu bagaimana Arduino membaca keadaan dari luar, dan mengambil keputusan berdasarkan bacaan itu.

1. Input digital dan dua keadaan

Pin digital pada Arduino hanya mengenal dua keadaan: HIGH yang berarti ada tegangan, dan LOW yang berarti tidak ada tegangan. Tombol adalah alat paling sederhana untuk menghasilkan dua keadaan itu: ditekan atau tidak ditekan.

int nilaiTombol = digitalRead(2); // membaca keadaan pin 2

2. Masalah pin mengambang

Ada satu hal yang membingungkan pemula. Kalau tombol hanya disambungkan begitu saja, maka ketika tombol tidak ditekan, pin tidak tersambung ke mana-mana. Keadaan ini disebut mengambang, dan bacaannya berubah-ubah sendiri antara HIGH dan LOW karena terpengaruh gangguan listrik di sekitarnya.

Akibatnya, lampu bisa menyala sendiri tanpa tombol disentuh. Ini bukan kerusakan, melainkan rangkaian yang belum lengkap.

Solusinya memakai resistor penarik. Arduino sudah menyediakannya di dalam, jadi kita tidak perlu menambah komponen. Cukup pakai INPUT_PULLUP alih-alih INPUT.
pinMode(2, INPUT_PULLUP);
Perhatikan, logikanya menjadi terbalik. Dengan INPUT_PULLUP, pin bernilai HIGH saat tombol tidak ditekan, dan LOW saat tombol ditekan. Ini sering membuat pemula mengira programnya salah, padahal justru sudah benar.

3. Rangkaian yang diperlukan

Tombol kaki pertama -> pin 2 Arduino Tombol kaki kedua -> GND Arduino LED kaki panjang -> pin 8 Arduino LED kaki pendek -> resistor 220 ohm -> GND Arduino

Resistor 220 ohm pada LED wajib dipasang. Tanpa resistor, arus yang mengalir terlalu besar dan LED akan cepat rusak, kadang hanya dalam hitungan detik.

4. Program pertama: lampu menyala saat tombol ditekan

const int PIN_TOMBOL = 2; const int PIN_LED = 8; void setup() { pinMode(PIN_TOMBOL, INPUT_PULLUP); pinMode(PIN_LED, OUTPUT); } void loop() { int nilaiTombol = digitalRead(PIN_TOMBOL); if (nilaiTombol == LOW) { // LOW berarti ditekan digitalWrite(PIN_LED, HIGH); } else { digitalWrite(PIN_LED, LOW); } }
Pemakaian const int untuk nomor pin bukan sekadar gaya penulisan. Kalau nanti kabelnya dipindah ke pin lain, cukup mengubah satu baris di atas, bukan mencari angka 2 di seluruh program.

5. Program kedua: tombol sebagai sakelar

Program di atas membuat lampu hanya menyala selama tombol ditahan. Bagaimana kalau kita ingin satu tekanan menyalakan, dan tekanan berikutnya mematikan? Di sinilah kita perlu mengingat keadaan sebelumnya.

const int PIN_TOMBOL = 2; const int PIN_LED = 8; bool lampuNyala = false; int keadaanSebelumnya = HIGH; void setup() { pinMode(PIN_TOMBOL, INPUT_PULLUP); pinMode(PIN_LED, OUTPUT); } void loop() { int keadaanSekarang = digitalRead(PIN_TOMBOL); // hanya bertindak saat tombol BARU ditekan if (keadaanSebelumnya == HIGH && keadaanSekarang == LOW) { lampuNyala = !lampuNyala; // membalik keadaan digitalWrite(PIN_LED, lampuNyala); delay(50); // menahan pantulan tombol } keadaanSebelumnya = keadaanSekarang; }

6. Kenapa perlu delay 50 milidetik

Tombol mekanis tidak berpindah keadaan dengan bersih. Saat ditekan, kontak logamnya memantul beberapa kali dalam waktu sangat singkat. Arduino yang membaca ribuan kali per detik akan menganggapnya sebagai beberapa tekanan berbeda.

Gejalanya khas: lampu berkedip tidak menentu saat tombol ditekan sekali. Jeda singkat setelah tekanan terbaca membuat pantulan itu terlewati. Cara ini disebut debounce, dan bab lanjutan biasanya membahas cara yang lebih halus tanpa memakai delay.

7. Kalau tidak berjalan, periksa ini dulu

8. Latihan

← Kembali Ke Daftar Materi Arduino