Bird
Raised Fist0
Raspberry Piprogramming~20 mins

Button press detection in Raspberry Pi - Practice Problems & Coding Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
Button Press Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ Predict Output
intermediate
2:00remaining
Detecting a button press with GPIO input

What will be the output of this Raspberry Pi Python code when the button connected to GPIO pin 17 is pressed?

Raspberry Pi
import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)
GPIO.setup(17, GPIO.IN, pull_up_down=GPIO.PUD_UP)

try:
    while True:
        if GPIO.input(17) == GPIO.LOW:
            print("Button pressed")
            break
        time.sleep(0.1)
finally:
    GPIO.cleanup()
ANo output, program runs forever
BGPIO.setup error
CButton pressed
DRuntimeError due to missing cleanup
Attempts:
2 left
💡 Hint

Remember that the button is connected with a pull-up resistor, so pressing it pulls the pin LOW.

❓ Predict Output
intermediate
2:00remaining
Detecting button release event

What will this code print when the button connected to GPIO pin 22 is released after being pressed?

Raspberry Pi
import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)
GPIO.setup(22, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)

try:
    while True:
        if GPIO.input(22) == GPIO.HIGH:
            print("Button released")
            break
        time.sleep(0.1)
finally:
    GPIO.cleanup()
ARuntimeError due to wrong pull_up_down setting
BButton released
CNo output, program runs forever
DButton pressed
Attempts:
2 left
💡 Hint

Check the pull-down resistor and what HIGH means for the button state.

🔧 Debug
advanced
2:00remaining
Why does this button press detection code not print anything?

Consider this code snippet intended to detect a button press on GPIO pin 5. Why does it never print "Pressed"?

Raspberry Pi
import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)
GPIO.setup(5, GPIO.IN)

while True:
    if GPIO.input(5) == GPIO.LOW:
        print("Pressed")
        break
    time.sleep(0.1)
AThe button pin lacks a pull-up or pull-down resistor, so input is floating
BGPIO.setup should use GPIO.OUT for button input
CThe code needs GPIO.cleanup() before the loop
Dtime.sleep(0.1) is too short to detect the press
Attempts:
2 left
💡 Hint

Think about what happens if the input pin is not stabilized with a resistor.

📝 Syntax
advanced
2:00remaining
Identify the syntax error in this button detection code

Which option correctly fixes the syntax error in this Raspberry Pi button detection code?

Raspberry Pi
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(18, GPIO.IN, pull_up_down=GPIO.PUD_UP)

if GPIO.input(18) == GPIO.LOW
    print("Button pressed")
AAdd a colon at the end of the if statement line
BChange GPIO.LOW to GPIO.HIGH
CRemove the parentheses from GPIO.input
DIndent the print statement at the same level as if
Attempts:
2 left
💡 Hint

Check the syntax of the if statement in Python.

🚀 Application
expert
2:00remaining
How many times will the message print if button bounces?

This code detects button presses on GPIO pin 23 and prints "Pressed" each time the input reads LOW. The button is known to bounce (rapidly change state) when pressed. How many times will "Pressed" print if the button is pressed once?

Raspberry Pi
import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)
GPIO.setup(23, GPIO.IN, pull_up_down=GPIO.PUD_UP)

for _ in range(10):
    if GPIO.input(23) == GPIO.LOW:
        print("Pressed")
    time.sleep(0.01)
AOnly once, because time.sleep(0.01) filters out bounces
BExactly once, because the loop runs 10 times but only one LOW reading occurs
CNever, because the pull_up_down setting is incorrect
DMultiple times, due to button bouncing causing repeated LOW readings
Attempts:
2 left
💡 Hint

Think about how button bouncing affects the input signal during rapid reads.

Practice

(1/5)
1. What does setting a Raspberry Pi GPIO pin as input with a pull-up resistor do when detecting a button press?
easy
A. It keeps the pin at HIGH until the button connects it to LOW when pressed.
B. It keeps the pin at LOW until the button connects it to HIGH when pressed.
C. It disables the pin to save power when the button is not pressed.
D. It makes the pin output a signal when the button is pressed.

Solution

  1. Step 1: Understand pull-up resistor behavior

    A pull-up resistor keeps the input pin at a HIGH voltage level by default.
  2. Step 2: Detect button press effect on pin

    When the button is pressed, it connects the pin to ground, making the input LOW.
  3. Final Answer:

    It keeps the pin at HIGH until the button connects it to LOW when pressed. -> Option A
  4. Quick Check:

    Pull-up resistor means default HIGH, press pulls LOW [OK]
Hint: Pull-up means default HIGH, press pulls pin LOW [OK]
Common Mistakes:
  • Thinking pull-up sets pin LOW by default
  • Confusing input with output pin modes
  • Assuming button press sets pin HIGH
2. Which of the following is the correct Python code snippet to set GPIO pin 17 as input with a pull-up resistor on Raspberry Pi?
easy
A. GPIO.setup(17, GPIO.IN, pull_up_down=GPIO.PUD_UP)
B. GPIO.setup(17, GPIO.OUT, pull_up_down=GPIO.PUD_UP)
C. GPIO.setup(17, GPIO.IN)
D. GPIO.setup(17, GPIO.OUT)

Solution

  1. Step 1: Identify pin mode for button input

    Button pins must be set as input to read their state.
  2. Step 2: Add pull-up resistor parameter

    Use pull_up_down=GPIO.PUD_UP to enable internal pull-up resistor.
  3. Final Answer:

    GPIO.setup(17, GPIO.IN, pull_up_down=GPIO.PUD_UP) -> Option A
  4. Quick Check:

    Input pin with pull-up resistor = GPIO.IN + PUD_UP [OK]
Hint: Input pin with pull-up uses GPIO.IN and PUD_UP [OK]
Common Mistakes:
  • Using GPIO.OUT instead of GPIO.IN
  • Omitting pull_up_down parameter
  • Setting pull-up resistor on output pin
3. What will be the output of this Python code snippet when the button connected to GPIO 18 is pressed?
import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)
GPIO.setup(18, GPIO.IN, pull_up_down=GPIO.PUD_UP)

if GPIO.input(18) == GPIO.LOW:
    print("Button Pressed")
else:
    print("Button Not Pressed")
medium
A. No output
B. Button Not Pressed
C. SyntaxError
D. Button Pressed

Solution

  1. Step 1: Understand pin setup and input reading

    Pin 18 is set as input with pull-up resistor, so default is HIGH.
  2. Step 2: Check condition when button is pressed

    Pressing button pulls pin LOW, so condition GPIO.input(18) == GPIO.LOW is True.
  3. Final Answer:

    Button Pressed -> Option D
  4. Quick Check:

    Pressed button pulls pin LOW, prints "Button Pressed" [OK]
Hint: Pressed button reads LOW on pull-up input pin [OK]
Common Mistakes:
  • Assuming pressed button reads HIGH
  • Confusing pull-up with pull-down resistor
  • Expecting syntax or runtime errors
4. Identify the error in this Raspberry Pi button press detection code:
import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)
GPIO.setup(23, GPIO.IN, pull_up_down=GPIO.PUD_UP)

while True:
    if GPIO.input(23) == GPIO.HIGH:
        print("Button Pressed")
    time.sleep(0.1)
medium
A. time.sleep(0.1) should be before the if statement.
B. The pull_up_down parameter is missing in GPIO.setup.
C. The code should check for GPIO.LOW to detect button press.
D. GPIO.setmode(GPIO.BCM) is incorrect and should be GPIO.BOARD.

Solution

  1. Step 1: Review button wiring and logic

    With pull-up resistor, button press pulls pin LOW, not HIGH.
  2. Step 2: Check condition in if statement

    Code incorrectly checks for GPIO.HIGH to detect press; should check GPIO.LOW.
  3. Final Answer:

    The code should check for GPIO.LOW to detect button press. -> Option C
  4. Quick Check:

    Pull-up input reads LOW when pressed, so check GPIO.LOW [OK]
Hint: Pressed button reads LOW on pull-up input pin [OK]
Common Mistakes:
  • Checking for HIGH instead of LOW on button press
  • Forgetting pull_up_down parameter
  • Misplacing sleep causing missed presses
5. You want to detect a button press on GPIO 21 and print "Pressed" only once per press, avoiding multiple prints while the button is held down. Which code snippet correctly implements this behavior?
import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)
GPIO.setup(21, GPIO.IN, pull_up_down=GPIO.PUD_UP)

pressed = False
while True:
    if GPIO.input(21) == GPIO.LOW and not pressed:
        print("Pressed")
        pressed = True
    elif GPIO.input(21) == GPIO.HIGH:
        pressed = False
    time.sleep(0.05)
hard
A. This code never prints anything because pressed is always True.
B. This code prints "Pressed" once per press and avoids repeats while held.
C. This code prints "Pressed" continuously while button is held down.
D. This code causes a syntax error due to missing colon.

Solution

  1. Step 1: Understand the pressed flag usage

    The variable 'pressed' tracks if the button press was already detected to avoid repeats.
  2. Step 2: Analyze the if-elif logic

    When button is LOW and not pressed, it prints once and sets pressed True; when released (HIGH), resets pressed to False.
  3. Final Answer:

    This code prints "Pressed" once per press and avoids repeats while held. -> Option B
  4. Quick Check:

    pressed flag prevents multiple prints during hold [OK]
Hint: Use a flag variable to print once per press [OK]
Common Mistakes:
  • Printing inside loop without flag causes repeated prints
  • Not resetting flag on button release
  • Syntax errors from missing colons or indentation
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard