How to use a push button on Arduino

In this tutorial we use only one schematic and we make button work in 4 different ways with coding; hold, toggle switch, hold specific time and double click. You can use these examples in your projects and combine them if you need to.

Schema

– Button
– Red led
– 220 ohm resistor

 

Hold button

Led is on as long you press button

const int buttonPin = 8;  // Button pin
const int ledPin = 7;     // Led pin
void setup() 
{
pinMode(buttonPin, INPUT_PULLUP);
pinMode(ledPin, OUTPUT);
}
void loop() 
{
// If button is pressed.
if (digitalRead(buttonPin) == LOW) 
{
// Light up led
digitalWrite(ledPin, HIGH);
}
else
{
// If button is up. Turn led off
digitalWrite(ledPin, LOW);
}
delay(100);
}

 

Toggle button

You press button once and led lights up, you press it again and it goes off

const int buttonPin = 8;    // Button pin
const int ledPin = 7;       // Led pin
bool status = false;        // Current led status
void setup() 
{
pinMode(buttonPin, INPUT_PULLUP);
pinMode(ledPin, OUTPUT);
}
void loop() 
{
// If button is pressed
if (digitalRead(buttonPin) == LOW) 
{
// Change led state variable
status = !status;  
// Change led state
digitalWrite(ledPin, status); 
} 
while(digitalRead(buttonPin) == false); 
delay(100); // Small delay 
}

1sec hold

You hold button 1sec and leds light up, you hold button again 1sec and led goes off

const int button = 8;
const int led = 7;
bool button_pressed = false;
bool wait_button_release = false;
bool led_on = false;
bool led_state_change = false;
unsigned long time;
int keypress_duration = 1000; // How long button has to be pressed to light up led. (In milliseconds. 1000ms = 1second)
void setup() 
{
pinMode(button, INPUT_PULLUP);
pinMode(led, OUTPUT);
}
void loop() 
{
// If button is pressed
if (digitalRead(button) == LOW) 
{
if(!wait_button_release)
{
if(!button_pressed)
{
button_pressed = true;
time = millis();
}
else
{
if(millis() - time >= keypress_duration)
{
// Do something
led_on = !led_on;
led_state_change = true;
wait_button_release = true;
}
}
}
}
else
{
wait_button_release = false;
button_pressed = false;
time = 0;
}
if(led_state_change)
{
if(led_on)
{
digitalWrite(led, HIGH);
}
else
{
digitalWrite(led, LOW);
}
led_state_change = false;
}
}

Double-click

You double click button and led goes on, and when you double click button again it goes off

const int buttonPin = 8;
const int ledPin = 7;
int buttonState;                        // The current reading from the input pin
int lastButtonState = HIGH;             // The previous reading from the input pin
bool firstPress = false;
bool led_on = false;
bool led_state_change = false;
unsigned long last_press_time;
unsigned long doubleclick_delay = 600;  // Two clicks has to be happen inside 600milliseconds, so we can detect is as doubleclick
unsigned long lastDebounceTime = 0;     // The last time the output pin was toggled
unsigned long debounceDelay = 50;       // The debounce time; increase if the output flickers
void setup() 
{
pinMode(buttonPin, INPUT_PULLUP);
pinMode(ledPin, OUTPUT);
}
void loop() 
{
int buttonReading = digitalRead(buttonPin);
if (buttonReading != lastButtonState) 
{
lastDebounceTime = millis();
}
if ((millis() - lastDebounceTime) > debounceDelay) 
{
if (buttonReading != buttonState) 
{
buttonState = buttonReading;
if (buttonState == LOW) 
{
if( (millis() - last_press_time >= doubleclick_delay) )
{
firstPress = false;
}
if(firstPress)
{
if( (millis() - last_press_time <= doubleclick_delay) )
{
// Do something
led_on = !led_on;
led_state_change = true;
}
firstPress = false;
}
else
{
last_press_time = millis();
firstPress = true;
}
}
}
}
if(led_state_change)
{
if(led_on)
{
digitalWrite(ledPin, HIGH);
}
else
{
digitalWrite(ledPin, LOW);
}
led_state_change = false;
}
lastButtonState = buttonReading;
}