Kendali LED dengan Tombol Tekan ESP32 (Toggle)
Setiap kali tombol ditekan, keadaan LED berubah: jika menyala jadi mati, jika mati jadi menyala. Pola toggle klasik. Dengan debounce, kita membersihkan derau mekanis tombol tekan agar satu tekanan menghasilkan satu kali toggle.

Video
Skema rangkaian

Kode sumber
1// ─────────────────────────────────────────
2// BlueGrays · bluegrays.com
3// Kendali LED dengan Tombol Tekan ESP32 (Toggle)
4// ─────────────────────────────────────────
5// Setiap tekanan tombol membalik LED: nyala menjadi mati, mati menjadi
6// nyala. Debounce 50 ms memastikan satu tekanan menghasilkan tepat satu
7// pergantian.
8//
9// Pin:
10// GPIO 5 -> LED merah (dengan resistor 220 ohm)
11// GPIO 4 -> Tombol (kaki lainnya ke GND)
12
13const int LED_PIN = 5; // Output LED
14const int BUTTON_PIN = 4; // Input tombol
15
16bool ledState = false; // Apakah LED sekarang nyala
17bool lastButton = HIGH; // Pembacaan tombol sebelumnya
18bool stableButton = HIGH; // Status tombol stabil (sudah di-debounce)
19unsigned long lastChange = 0; // Waktu terakhir pembacaan berubah (ms)
20const unsigned long DEBOUNCE = 50; // Waktu debounce (ms)
21
22void setup() {
23 pinMode(LED_PIN, OUTPUT);
24 pinMode(BUTTON_PIN, INPUT_PULLUP); // Membaca HIGH ketika tidak ditekan
25}
26
27void loop() {
28 bool buttonState = digitalRead(BUTTON_PIN);
29
30 // Mulai ulang timer setiap kali pembacaan berubah
31 if (buttonState != lastButton) lastChange = millis();
32
33 // Pembacaan yang tetap sama selama DEBOUNCE ms dianggap stabil. LED berganti satu kali, hanya
34 // ketika status stabil menjadi LOW (tekanan baru).
35 if (millis() - lastChange > DEBOUNCE && buttonState != stableButton) {
36 stableButton = buttonState;
37 if (stableButton == LOW) {
38 ledState = !ledState;
39 digitalWrite(LED_PIN, ledState);
40 }
41 }
42 lastButton = buttonState;
43}
44
FAQ
Berapa lama sebaiknya waktu debounce?
Untuk sebagian besar tombol, 20–50 ms sudah cukup. Jika jedanya terlalu singkat, pantulan tombol tetap terdeteksi; jika terlalu lama, tekanan cepat yang beruntun akan terlewat.
Keadaan mana yang sebaiknya aku tangkap untuk toggle?
Tangkap hanya momen tombol "ditekan" (perubahan dari HIGH ke LOW, jika kamu memakai INPUT_PULLUP). Agar LED tidak terus berganti selama tombol ditahan, simpan keadaan tombol sebelumnya di sebuah variabel.
Apakah benar memakai `delay()` untuk debounce?
Untuk proyek sederhana bisa, tetapi delay() menghentikan eksekusi loop() yang sedang berjalan, sehingga operasi lain di alur yang sama tertunda. Tugas lain di ESP32 tetap bisa berjalan. Pengaturan waktu berbasis millis() cocok untuk menjalankan operasi di dalam loop() tanpa memblokir.
Bisakah LED mengingat keadaan terakhirnya setelah dimatikan lalu dinyalakan lagi?
Bisa, di ESP32 kamu bisa memakai library Preferences untuk menulis keadaannya ke memori nonvolatil dan membacanya ketika mulai. Dengan begitu, meskipun listrik padam lalu menyala lagi, LED akan mulai dalam keadaan terakhirnya.
