Kontrol LED dengan Push Button - Input Digital Arduino

Tutorial menggunakan push button untuk mengendalikan LED di Arduino, memahami konsep input digital, pull-up resistor, dan debouncing.

05-05-2025
04:53 18 Juni 2025
10 min read

Setelah berhasil membuat LED berkedip, langkah berikutnya adalah mempelajari cara mengontrol LED menggunakan input dari user. Push button adalah komponen input digital paling sederhana yang memungkinkan kita berinteraksi dengan Arduino. Mari pelajari cara menggunakan button untuk mengendalikan LED!

Apa itu Push Button?

Push button adalah saklar sesaat (momentary switch) yang hanya aktif selama ditekan. Berbeda dengan saklar biasa yang memiliki posisi tetap ON/OFF, push button akan kembali ke posisi semula setelah dilepas. Komponen ini sangat umum digunakan dalam berbagai perangkat elektronik.

Tujuan Pembelajaran

Setelah menyelesaikan tutorial ini, Anda akan memahami:

  • Konsep input digital pada Arduino
  • Cara menghubungkan push button ke Arduino
  • Fungsi digitalRead() untuk membaca status button
  • Konsep pull-up dan pull-down resistor
  • Internal pull-up resistor Arduino
  • Teknik debouncing untuk mengatasi noise
  • Berbagai pola kontrol LED menggunakan button

Komponen yang Diperlukan

Hardware Wajib

  • Arduino Uno (atau varian Arduino lainnya)
  • Push button (tactile switch 4 pin)
  • LED (5mm, warna bebas)
  • Resistor 220Ω (untuk LED)
  • Resistor 10kΩ (untuk pull-down, opsional)
  • Breadboard
  • Kabel jumper (male-to-male)
  • Kabel USB untuk programming

Software

  • Arduino IDE (sudah terinstall dan dikonfigurasi)

Memahami Push Button

Struktur Fisik Push Button

Push button umumnya memiliki 4 kaki yang tersusun dalam 2 pasang:

1 ---- 2
| |
| |
3 ---- 4
  • Kaki 1 dan 2 terhubung secara internal
  • Kaki 3 dan 4 terhubung secara internal
  • Saat button ditekan, semua kaki terhubung

Cara Kerja Push Button

  • Kondisi Normal: Tidak ada koneksi antara pasangan kaki
  • Saat Ditekan: Semua kaki terhubung, membentuk jalur listrik
  • Setelah Dilepas: Kembali ke kondisi normal (terputus)

Konsep Pull-up dan Pull-down Resistor

Mengapa Perlu Pull-up/Pull-down?

Tanpa pull-up atau pull-down resistor, pin input Arduino akan “mengambang” (floating) saat button tidak ditekan. Kondisi ini menyebabkan pembacaan yang tidak stabil.

Pull-down Resistor

VCC (5V) → Button → Arduino Pin
Resistor 10kΩ → GND
  • Button tidak ditekan: Pin membaca LOW (0V)
  • Button ditekan: Pin membaca HIGH (5V)

Pull-up Resistor

VCC (5V) → Resistor 10kΩ → Arduino Pin
Button → GND
  • Button tidak ditekan: Pin membaca HIGH (5V)
  • Button ditekan: Pin membaca LOW (0V)

Internal Pull-up Arduino

Arduino memiliki internal pull-up resistor (~20kΩ) yang bisa diaktifkan dengan kode:

pinMode(buttonPin, INPUT_PULLUP);

Rangkaian Dasar Button dan LED

Arduino Pin 2 → Button → GND
Arduino Pin 8 → Resistor 220Ω → LED → GND

Opsi 2: Menggunakan External Pull-down

5V → Button → Arduino Pin 2
Resistor 10kΩ → GND
Arduino Pin 8 → Resistor 220Ω → LED → GND

Program Dasar: Button Kontrol LED

1. Program Sederhana

// Pin definitions
const int buttonPin = 2;
const int ledPin = 8;
// Variables
int buttonState = 0;
void setup() {
// Initialize pins
pinMode(buttonPin, INPUT_PULLUP); // Button dengan internal pull-up
pinMode(ledPin, OUTPUT); // LED sebagai output
// Initialize serial untuk debugging
Serial.begin(9600);
}
void loop() {
// Baca status button
buttonState = digitalRead(buttonPin);
// Kontrol LED berdasarkan button
if (buttonState == LOW) { // Button ditekan (pull-up = LOW saat ditekan)
digitalWrite(ledPin, HIGH); // Nyalakan LED
Serial.println("Button pressed - LED ON");
} else {
digitalWrite(ledPin, LOW); // Matikan LED
Serial.println("Button released - LED OFF");
}
delay(50); // Delay kecil untuk stabilitas
}

Penjelasan Kode

pinMode(buttonPin, INPUT_PULLUP)

  • Mengatur pin sebagai input dengan internal pull-up aktif
  • Saat button tidak ditekan: pin membaca HIGH
  • Saat button ditekan: pin membaca LOW

digitalRead(buttonPin)

  • Membaca status digital pin (HIGH atau LOW)
  • Return value: HIGH (1) atau LOW (0)

Logika Kontrol

  • buttonState == LOW: Button sedang ditekan
  • buttonState == HIGH: Button tidak ditekan

Program Lanjutan: Toggle LED

2. LED Toggle dengan Button

const int buttonPin = 2;
const int ledPin = 8;
int buttonState = 0;
int lastButtonState = 0;
bool ledState = false;
void setup() {
pinMode(buttonPin, INPUT_PULLUP);
pinMode(ledPin, OUTPUT);
Serial.begin(9600);
}
void loop() {
buttonState = digitalRead(buttonPin);
// Deteksi perubahan dari HIGH ke LOW (button ditekan)
if (buttonState == LOW && lastButtonState == HIGH) {
ledState = !ledState; // Toggle LED state
digitalWrite(ledPin, ledState);
if (ledState) {
Serial.println("LED ON");
} else {
Serial.println("LED OFF");
}
delay(50); // Debounce delay
}
lastButtonState = buttonState;
}

Penjelasan Toggle Logic

State Tracking

  • lastButtonState: Menyimpan status button sebelumnya
  • ledState: Menyimpan status LED saat ini

Edge Detection

  • buttonState == LOW && lastButtonState == HIGH: Deteksi saat button baru ditekan
  • Hanya mengubah LED saat transisi dari tidak ditekan ke ditekan

Debouncing - Mengatasi Noise Button

Masalah Bouncing

Button mekanis tidak perfect - saat ditekan atau dilepas, kontak dapat “memantul” beberapa kali dalam waktu yang sangat singkat (beberapa millisecond). Hal ini menyebabkan Arduino membaca multiple press dalam sekali tekan.

Solusi Software Debouncing

const int buttonPin = 2;
const int ledPin = 8;
int buttonState = 0;
int lastButtonState = 0;
bool ledState = false;
unsigned long lastDebounceTime = 0;
unsigned long debounceDelay = 50; // 50ms debounce time
void setup() {
pinMode(buttonPin, INPUT_PULLUP);
pinMode(ledPin, OUTPUT);
Serial.begin(9600);
}
void loop() {
int reading = digitalRead(buttonPin);
// Jika button state berubah (karena noise atau press)
if (reading != lastButtonState) {
lastDebounceTime = millis(); // Reset timer
}
// Jika reading stabil selama debounceDelay
if ((millis() - lastDebounceTime) > debounceDelay) {
// Jika button state benar-benar berubah
if (reading != buttonState) {
buttonState = reading;
// Hanya toggle saat button ditekan
if (buttonState == LOW) {
ledState = !ledState;
digitalWrite(ledPin, ledState);
Serial.print("LED toggled: ");
Serial.println(ledState ? "ON" : "OFF");
}
}
}
lastButtonState = reading;
}

Variasi Program Button Control

3. Multiple Button Control

const int button1Pin = 2;
const int button2Pin = 3;
const int led1Pin = 8;
const int led2Pin = 9;
bool button1State = false;
bool button2State = false;
bool lastButton1State = false;
bool lastButton2State = false;
bool led1State = false;
bool led2State = false;
void setup() {
pinMode(button1Pin, INPUT_PULLUP);
pinMode(button2Pin, INPUT_PULLUP);
pinMode(led1Pin, OUTPUT);
pinMode(led2Pin, OUTPUT);
Serial.begin(9600);
}
void loop() {
// Baca button states
button1State = digitalRead(button1Pin);
button2State = digitalRead(button2Pin);
// Button 1 toggle LED 1
if (button1State == LOW && lastButton1State == HIGH) {
led1State = !led1State;
digitalWrite(led1Pin, led1State);
Serial.println("LED 1 toggled");
delay(50);
}
// Button 2 toggle LED 2
if (button2State == LOW && lastButton2State == HIGH) {
led2State = !led2State;
digitalWrite(led2Pin, led2State);
Serial.println("LED 2 toggled");
delay(50);
}
lastButton1State = button1State;
lastButton2State = button2State;
}

4. Button dengan Multiple LED Patterns

const int buttonPin = 2;
const int led1Pin = 8;
const int led2Pin = 9;
const int led3Pin = 10;
int buttonState = 0;
int lastButtonState = 0;
int ledPattern = 0; // 0: all off, 1: pattern 1, 2: pattern 2, 3: pattern 3
void setup() {
pinMode(buttonPin, INPUT_PULLUP);
pinMode(led1Pin, OUTPUT);
pinMode(led2Pin, OUTPUT);
pinMode(led3Pin, OUTPUT);
Serial.begin(9600);
}
void loop() {
buttonState = digitalRead(buttonPin);
if (buttonState == LOW && lastButtonState == HIGH) {
ledPattern++;
if (ledPattern > 3) ledPattern = 0;
updateLEDPattern();
delay(50);
}
lastButtonState = buttonState;
}
void updateLEDPattern() {
switch (ledPattern) {
case 0: // All OFF
digitalWrite(led1Pin, LOW);
digitalWrite(led2Pin, LOW);
digitalWrite(led3Pin, LOW);
Serial.println("Pattern: All OFF");
break;
case 1: // Only LED 1
digitalWrite(led1Pin, HIGH);
digitalWrite(led2Pin, LOW);
digitalWrite(led3Pin, LOW);
Serial.println("Pattern: LED 1 ON");
break;
case 2: // LED 1 and 2
digitalWrite(led1Pin, HIGH);
digitalWrite(led2Pin, HIGH);
digitalWrite(led3Pin, LOW);
Serial.println("Pattern: LED 1,2 ON");
break;
case 3: // All ON
digitalWrite(led1Pin, HIGH);
digitalWrite(led2Pin, HIGH);
digitalWrite(led3Pin, HIGH);
Serial.println("Pattern: All ON");
break;
}
}

Advanced: Long Press Detection

5. Short Press vs Long Press

const int buttonPin = 2;
const int ledPin = 8;
int buttonState = 0;
int lastButtonState = HIGH;
bool ledState = false;
unsigned long buttonPressTime = 0;
unsigned long buttonReleaseTime = 0;
const unsigned long longPressTime = 1000; // 1 second
void setup() {
pinMode(buttonPin, INPUT_PULLUP);
pinMode(ledPin, OUTPUT);
Serial.begin(9600);
}
void loop() {
buttonState = digitalRead(buttonPin);
// Button just pressed
if (buttonState == LOW && lastButtonState == HIGH) {
buttonPressTime = millis();
}
// Button just released
if (buttonState == HIGH && lastButtonState == LOW) {
buttonReleaseTime = millis();
unsigned long pressDuration = buttonReleaseTime - buttonPressTime;
if (pressDuration < longPressTime) {
// Short press - toggle LED
ledState = !ledState;
digitalWrite(ledPin, ledState);
Serial.println("Short press - LED toggled");
} else {
// Long press - blink LED 3 times
Serial.println("Long press - LED blink 3x");
for (int i = 0; i < 3; i++) {
digitalWrite(ledPin, HIGH);
delay(200);
digitalWrite(ledPin, LOW);
delay(200);
}
digitalWrite(ledPin, ledState); // Restore original state
}
}
lastButtonState = buttonState;
}

Interrupt-Based Button Control

6. Menggunakan Interrupt

const int buttonPin = 2; // Pin 2 atau 3 untuk interrupt
const int ledPin = 8;
volatile bool buttonPressed = false;
bool ledState = false;
void setup() {
pinMode(buttonPin, INPUT_PULLUP);
pinMode(ledPin, OUTPUT);
Serial.begin(9600);
// Attach interrupt - FALLING karena menggunakan pull-up
attachInterrupt(digitalPinToInterrupt(buttonPin), buttonISR, FALLING);
}
void loop() {
if (buttonPressed) {
buttonPressed = false; // Reset flag
ledState = !ledState;
digitalWrite(ledPin, ledState);
Serial.print("Interrupt triggered - LED: ");
Serial.println(ledState ? "ON" : "OFF");
delay(200); // Debounce delay
}
}
void buttonISR() {
buttonPressed = true;
}

Troubleshooting Button Control

Button Tidak Responsif

Kemungkinan Penyebab:

  • Wiring salah atau kabel putus
  • Button rusak
  • Pin salah dikonfigurasi

Solusi:

  • Periksa koneksi dengan multimeter
  • Test button dengan LED dan resistor langsung
  • Pastikan pinMode() sudah benar

LED Berkedip Sendiri

Kemungkinan Penyebab:

  • Tidak menggunakan pull-up/pull-down resistor
  • Noise pada jalur power
  • Floating input pin

Solusi:

  • Gunakan INPUT_PULLUP
  • Tambahkan capacitor 100nF di VCC dan GND
  • Periksa grounding

Multiple Trigger saat Sekali Press

Kemungkinan Penyebab:

  • Button bouncing
  • Debounce delay terlalu pendek

Solusi:

  • Implementasi software debouncing
  • Tambah delay 50-100ms
  • Gunakan hardware debouncing (RC circuit)

Serial Monitor Spam

Kemungkinan Penyebab:

  • Serial.println() di dalam loop() tanpa kondisi
  • Tidak ada delay

Solusi:

  • Hanya print saat ada perubahan state
  • Tambahkan delay atau kondisi

Best Practices

1. Code Organization

// Pin definitions
const int BUTTON_PIN = 2;
const int LED_PIN = 8;
// Constants
const unsigned long DEBOUNCE_DELAY = 50;
const unsigned long LONG_PRESS_TIME = 1000;
// Variables
struct ButtonState {
int current;
int last;
unsigned long lastDebounceTime;
unsigned long pressTime;
bool isPressed;
};
ButtonState button = {HIGH, HIGH, 0, 0, false};
bool ledState = false;
void setup() {
initializePins();
Serial.begin(9600);
}
void loop() {
updateButton();
if (button.isPressed) {
handleButtonPress();
}
}
void initializePins() {
pinMode(BUTTON_PIN, INPUT_PULLUP);
pinMode(LED_PIN, OUTPUT);
}
void updateButton() {
int reading = digitalRead(BUTTON_PIN);
if (reading != button.last) {
button.lastDebounceTime = millis();
}
if ((millis() - button.lastDebounceTime) > DEBOUNCE_DELAY) {
if (reading != button.current) {
button.current = reading;
button.isPressed = (button.current == LOW);
}
}
button.last = reading;
}
void handleButtonPress() {
ledState = !ledState;
digitalWrite(LED_PIN, ledState);
Serial.println(ledState ? "LED ON" : "LED OFF");
}

2. Using State Machine

enum SystemState {
IDLE,
BUTTON_PRESSED,
LED_ON,
LED_OFF
};
SystemState currentState = IDLE;
void loop() {
switch (currentState) {
case IDLE:
if (digitalRead(BUTTON_PIN) == LOW) {
currentState = BUTTON_PRESSED;
}
break;
case BUTTON_PRESSED:
if (digitalRead(BUTTON_PIN) == HIGH) {
currentState = ledState ? LED_OFF : LED_ON;
}
break;
case LED_ON:
digitalWrite(LED_PIN, HIGH);
ledState = true;
currentState = IDLE;
break;
case LED_OFF:
digitalWrite(LED_PIN, LOW);
ledState = false;
currentState = IDLE;
break;
}
}

Proyek Tantangan

LevelNama ProyekDeskripsi
PemulaLampu KamarButton untuk nyalakan/matikan LED
PemulaCounter LEDSetiap press button, tambah jumlah LED yang nyala
PemulaBlink Speed ControlButton untuk mengubah kecepatan blink
MenengahMood LightMultiple button untuk different LED colors
MenengahSecurity LightLong press untuk aktivasi, short press untuk deaktivasi
MenengahDigital DiceButton untuk roll, LED matrix show result
LanjutanSmart SwitchButton dengan timer auto-off
LanjutanGesture LockSequence button press untuk unlock
LanjutanInteractive GameButton-based reaction time game

Kesimpulan

Kontrol LED dengan push button adalah langkah penting dalam mempelajari interaksi antara input dan output di Arduino. Konsep yang dipelajari di sini - seperti digital input, debouncing, dan state management - akan sangat berguna dalam proyek-proyek yang lebih kompleks.

Yang terpenting adalah memahami bahwa button mekanis bukanlah komponen yang perfect. Mereka memerlukan penanganan khusus untuk bouncing dan noise. Dengan teknik debouncing yang tepat, dapat dibuat interface yang responsif dan reliable.

Eksperimen dengan berbagai kombinasi button dan LED akan membantu memahami konsep digital I/O dengan lebih baik. Jangan ragu untuk mencoba variasi program dan melihat bagaimana perubahan kode mempengaruhi behavior sistem.

Langkah Selanjutnya

Setelah menguasai button control, siap untuk:

  1. Analog Input: Membaca sensor analog seperti potensiometer
  2. PWM Output: Mengatur brightness LED dengan PWM
  3. Multiple Input/Output: Menggabungkan beberapa sensor dan actuator
  4. Serial Communication: Interface dengan komputer atau device lain
  5. Timer dan Interrupt: Teknik advanced untuk real-time control

Resource Tambahan