Materi 6 dari 12 · Stasiun 3
Input digital: tombol dan pull-up
Setelah materi ini, kamu bisa:
- Bisa membaca tombol dengan digitalRead dan memakai pull-up atau pull-down.
- Bisa menjelaskan kenapa pin yang tidak tersambung ke mana pun terbaca acak.
- Bisa menjelaskan pantulan tombol (bouncing) dan cara sederhana mengatasinya.
Sebaiknya sudah belajar:
Papan yang bisa mendengar
Di materi Output digital: LED berkedip, papanmu berbicara lewat LED. Sekarang ia belajar mendengar, misalnya mengetahui kapan tombol ditekan.
Kedengarannya mudah, sambungkan tombol ke pin lalu baca. Tapi ada jebakan yang membuat banyak pemula bingung berjam-jam.
Tebak dulu
Satu kaki tombol disambung ke GPIO 4, kaki lain ke GND. Tidak ada komponen lain.
- Saat tombol tidak ditekan, digitalRead(4) menghasilkan...
- Selalu 1
- Selalu 0
- Acak, kadang 0 kadang 1
Jawaban
Acak, kadang 0 kadang 1. Saat dilepas, pin tidak tersambung ke mana pun (mengambang). Ia menangkap gangguan dari sekitar dan bisa terbaca apa saja. Coba sendiri.
Mengambang, pull-up, pull-down
Coba ketiga cara menyambung. Tahan tombol lalu lepas, dan perhatikan grafik pembacaan. Kartu terbuka setelah kamu mencoba ketiga cara, masing-masing ditekan dan dilepas.
Simulasi interaktif tersedia saat JavaScript aktif.
Tanpa resistor, pin mengambang dan terbaca acak. Resistor pull-up menarik pin ke 3,3 V saat tombol dilepas (terbaca 1), dan tombol menariknya ke GND saat ditekan (terbaca 0). Pull-down kebalikannya. ESP32 punya pull-up internal yang diaktifkan dengan INPUT_PULLUP.
Program tombol dan LED
const membuat nama tetap untuk nomor pin. Kalau pin pindah, cukup ubah satu baris.
const int TOMBOL = 4;
const int LED = 2;
void setup() {
pinMode(TOMBOL, INPUT_PULLUP);
pinMode(LED, OUTPUT);
}
void loop() {
if (digitalRead(TOMBOL) == LOW) {
digitalWrite(LED, HIGH);
} else {
digitalWrite(LED, LOW);
}
} - Baris 4: Aktifkan pull-up internal. Tidak perlu resistor luar.
- Baris 8: Dengan pull-up, ditekan = LOW. Terbalik dari dugaan banyak orang, jadi perhatikan baik-baik.
Tombol yang memantul
Saat ditekan, kontak logam di dalam tombol memantul beberapa kali dalam beberapa milidetik. ESP32 cukup cepat untuk melihat setiap pantulan sebagai tekanan terpisah.
Kalau programmu menghitung berapa kali tombol ditekan, satu tekanan bisa terhitung 3 atau 5 kali.
Cara paling sederhana mengatasinya (debounce): setelah mendeteksi perubahan, tunggu sekitar 20–50 ms, lalu baca lagi. Kalau masih sama, barulah dianggap tekanan sungguhan.
Cek pemahaman
- Pin memakai INPUT_PULLUP. Tombol ditekan. digitalRead menghasilkan...
- HIGH (1)
- LOW (0)
- Acak
Jawaban
LOW (0). Tombol menyambung pin ke GND, jadi LOW.
- GPIO mana yang TIDAK punya pull-up internal di ESP32 klasik?
- GPIO 4
- GPIO 34
- GPIO 18
Jawaban
GPIO 34. GPIO 34–39 hanya masukan dan tidak punya pull-up atau pull-down internal (lihat Papan ESP32 / Arduino dan pin-nya). Kalau dipakai untuk tombol, pasang resistor luar.
Benar atau salah?
- "Pin yang tidak tersambung ke apa pun terbaca 0."
- Benar
- Salah
Jawaban
Salah. Pin mengambang terbaca acak. Selalu pakai pull-up atau pull-down.
- "Tombol yang dilepas otomatis bernilai 0 V."
- Benar
- Salah
Jawaban
Salah. Tombol yang dilepas hanya memutus jalur. Tegangan pin ditentukan oleh resistor pull-up (3,3 V) atau pull-down (0 V), bukan oleh tombol.
Selesai
- Pin masukan tanpa resistor mengambang dan terbaca acak.
- Pull-up membuat dilepas = 1, ditekan = 0. Pull-down kebalikannya. INPUT_PULLUP mengaktifkan pull-up internal.
- Tombol memantul. Tunggu 20–50 ms sebelum memastikan.
Pancingan
Tombol hanya punya dua keadaan. Bagaimana membaca sensor yang nilainya berubah halus, seperti LDR dan termistor? Itu ADC: membaca sensor analog.
Berikutnya
Referensi
- Arduino Language Reference, pinMode() dan digitalRead().
- Espressif, ESP32 Series Datasheet dan ESP-IDF GPIO, bagian pull-up internal dan pin hanya-masukan.
- J. Ganssle, A Guide to Debouncing, 2004 (artikel tentang pantulan kontak).
Draf AI. Belum direview manusia.
Kode materi p5 · versi 0.1 · 2026-10-06