We use a pull-up resistor to make sure the button input reads a clear HIGH or LOW. This stops the input from floating and giving random values.
Button reading with pull-up resistor in Arduino
Start learning this pattern below
Jump into concepts and practice - no test required
pinMode(buttonPin, INPUT_PULLUP);
int buttonState = digitalRead(buttonPin);INPUT_PULLUP activates the Arduino's internal pull-up resistor.
The button connects the pin to ground when pressed, so pressed means LOW.
const int buttonPin = 2; void setup() { pinMode(buttonPin, INPUT_PULLUP); } void loop() { int buttonState = digitalRead(buttonPin); if (buttonState == LOW) { // Button is pressed } else { // Button is not pressed } }
const int buttonPin = 7; void setup() { pinMode(buttonPin, INPUT_PULLUP); Serial.begin(9600); } void loop() { int buttonState = digitalRead(buttonPin); Serial.println(buttonState); delay(500); }
This program reads a button connected to pin 4 using the internal pull-up resistor. It prints "Button pressed" when the button is pressed and "Button released" when it is not.
const int buttonPin = 4; void setup() { pinMode(buttonPin, INPUT_PULLUP); Serial.begin(9600); } void loop() { int buttonState = digitalRead(buttonPin); if (buttonState == LOW) { Serial.println("Button pressed"); } else { Serial.println("Button released"); } delay(1000); }
The button must connect the pin to ground when pressed for this to work correctly.
Using INPUT_PULLUP saves you from adding a physical resistor.
Remember: pressed button reads LOW, released reads HIGH with pull-up.
Use INPUT_PULLUP to enable the internal pull-up resistor on a pin.
Button press connects the pin to ground, so pressed means LOW.
This method prevents random readings from a floating input pin.
Practice
pinMode(pin, INPUT_PULLUP) do in Arduino when reading a button?Solution
Step 1: Understand pinMode with INPUT_PULLUP
UsingINPUT_PULLUPactivates the internal pull-up resistor on the pin, so it reads HIGH by default.Step 2: Effect on button reading
When the button is pressed, it connects the pin to ground, making the reading LOW. When not pressed, the pull-up resistor keeps it HIGH.Final Answer:
Enables the internal pull-up resistor to keep the pin HIGH when button is not pressed -> Option AQuick Check:
INPUT_PULLUP means pin reads HIGH unless grounded [OK]
- Thinking INPUT_PULLUP sets pin as output
- Assuming pin reads LOW when button is not pressed
- Confusing pull-up with pull-down resistor
Solution
Step 1: Recall correct pinMode usage
The correct way to enable internal pull-up resistor ispinMode(pin, INPUT_PULLUP);.Step 2: Check each option
pinMode(7, OUTPUT_PULLUP); uses OUTPUT_PULLUP which does not exist. pinMode(7, INPUT_PULLDOWN); uses INPUT_PULLDOWN which Arduino does not support internally. pinMode(7, INPUT); digitalWrite(7, LOW); sets pin as INPUT but digitalWrite LOW disables pull-up (equivalent to plain INPUT, floating pin), does not enable internal pull-up resistor.Final Answer:
pinMode(7, INPUT_PULLUP); -> Option CQuick Check:
Use INPUT_PULLUP to enable pull-up resistor [OK]
- Using OUTPUT_PULLUP which is invalid
- Trying INPUT_PULLDOWN which Arduino lacks
- digitalWrite(7, LOW) after INPUT (floating input, no pull-up)
void setup() {
pinMode(4, INPUT_PULLUP);
Serial.begin(9600);
}
void loop() {
int state = digitalRead(4);
Serial.println(state);
delay(500);
}Solution
Step 1: Understand INPUT_PULLUP behavior
With INPUT_PULLUP, the pin reads HIGH (1) when button is not pressed and LOW (0) when pressed because button connects pin to ground.Step 2: Analyze Serial output
The code prints the pin state every 500ms. When pressed, it prints 0; when released, it prints 1.Final Answer:
Prints 0 when button pressed, 1 when released -> Option DQuick Check:
Pressed = LOW (0), Released = HIGH (1) [OK]
- Assuming pressed reads HIGH (1)
- Confusing pull-up with pull-down logic
- Ignoring that button grounds the pin when pressed
void setup() {
pinMode(2, INPUT);
Serial.begin(9600);
}
void loop() {
int val = digitalRead(2);
Serial.println(val);
delay(200);
}Solution
Step 1: Check pinMode configuration
The code usespinMode(2, INPUT);which does not enable the internal pull-up resistor, so the pin may float and give unreliable readings.Step 2: Correct usage for button with pull-up
To use the internal pull-up resistor, the pinMode should beINPUT_PULLUP. This prevents floating and ensures stable readings.Final Answer:
Missing INPUT_PULLUP mode to enable pull-up resistor -> Option AQuick Check:
Use INPUT_PULLUP to avoid floating input [OK]
- Using INPUT without pull-up resistor
- Moving Serial.begin to loop unnecessarily
- Thinking delay affects button reading correctness
Solution
Step 1: Set pin modes correctly
Pin 8 must be input with internal pull-up resistor:INPUT_PULLUP. Pin 13 is output for LED.Step 2: Understand button logic with pull-up
Button press connects pin 8 to ground, sodigitalRead(8)returns LOW when pressed.Step 3: Write correct if condition
Turn LED on when button is pressed (pin reads LOW), so condition isif(digitalRead(8) == LOW).Final Answer:
pinMode(8, INPUT_PULLUP); pinMode(13, OUTPUT); if(digitalRead(8) == LOW) digitalWrite(13, HIGH); else digitalWrite(13, LOW); -> Option BQuick Check:
Pressed = LOW, LED ON when LOW [OK]
- Checking for HIGH instead of LOW on button press
- Setting button pin as OUTPUT
- Not enabling INPUT_PULLUP resistor
