What does GPIO.add_event_detect do in Raspberry Pi programming?
It sets up an interrupt to watch a GPIO pin for a specific event, like a button press, so the program can react immediately without constantly checking the pin.
Click to reveal answer
beginner
Why use interrupts with buttons instead of checking the button state in a loop?
Interrupts let the program respond instantly when the button is pressed, saving CPU time and making the program more efficient and responsive.
Click to reveal answer
intermediate
What are the common event types you can detect with GPIO.add_event_detect?
You can detect GPIO.RISING (button press going from low to high), GPIO.FALLING (high to low), or GPIO.BOTH (any change).
Click to reveal answer
intermediate
How do you attach a function to run when a button press is detected using GPIO.add_event_detect?
Use the callback parameter to give the function name. This function runs automatically when the event happens.
Click to reveal answer
intermediate
What is 'debounce' and why is it important when using button interrupts?
Debounce is a short delay to ignore extra signals caused by the button's mechanical bounce, preventing multiple unwanted triggers.
Click to reveal answer
What parameter do you use with GPIO.add_event_detect to specify the event type?
AGPIO.RISING
BGPIO.PIN
CGPIO.MODE
DGPIO.CALLBACK
✗ Incorrect
GPIO.RISING, GPIO.FALLING, or GPIO.BOTH specify the event type to detect.
Which argument lets you run a function automatically when a button event is detected?
Acallback
Bevent
Cpin
Dmode
✗ Incorrect
The callback argument is used to assign a function to run on the event.
Why is debouncing needed when using button interrupts?
ATo detect long presses
BTo speed up the program
CTo change the button's voltage
DTo prevent multiple triggers from one press
✗ Incorrect
Debouncing prevents multiple triggers caused by the button's mechanical bounce.
What happens if you don't use interrupts and check button state in a loop?
AThe program runs faster
BThe button won't work
CThe program wastes CPU time constantly checking
DThe button triggers automatically
✗ Incorrect
Polling wastes CPU time and can make the program less responsive.
Which event type detects when a button is released (goes from high to low)?
AGPIO.RISING
BGPIO.FALLING
CGPIO.BOTH
DGPIO.NONE
✗ Incorrect
GPIO.FALLING detects when the signal goes from high to low, like a button release.
Explain how to set up a button interrupt using GPIO.add_event_detect on a Raspberry Pi.
Think about the steps to watch a pin and run code when the button changes state.
You got /4 concepts.
Describe why using interrupts with buttons is better than checking the button state in a loop.
Consider how the program behaves when waiting for a button press.
You got /4 concepts.
Practice
(1/5)
1.
What is the main purpose of using GPIO.add_event_detect with a button on a Raspberry Pi?
easy
A. To increase the voltage on the button pin
B. To set the button pin as an output
C. To disable the button input temporarily
D. To detect button presses instantly without constantly checking in a loop
Solution
Step 1: Understand what GPIO.add_event_detect does
This function listens for changes on a GPIO pin and triggers a callback or event without needing to check the pin repeatedly.
Step 2: Compare options to the function's purpose
Only To detect button presses instantly without constantly checking in a loop correctly describes the purpose: detecting button presses instantly without polling.
Final Answer:
To detect button presses instantly without constantly checking in a loop -> Option D
The first argument to GPIO.add_event_detect is the pin number as an integer, here 17.
Step 2: Check the options for correct type
17 uses integer 17, which is correct. '17' uses a string which is invalid. Options C and D are incorrect because they are not pin numbers.
Final Answer:
17 -> Option A
Quick Check:
Pin number must be integer 17 [OK]
Hint: Pin numbers are integers, not strings or functions [OK]
Common Mistakes:
Using pin number as a string
Passing edge type or callback as pin number
Missing required arguments
3.
Consider this code snippet:
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
GPIO.setup(18, GPIO.IN, pull_up_down=GPIO.PUD_UP)
button_pressed = False
def button_callback(channel):
global button_pressed
button_pressed = True
GPIO.add_event_detect(18, GPIO.FALLING, callback=button_callback, bouncetime=200)
print("Waiting for button press...")
while not button_pressed:
time.sleep(0.1)
print("Button was pressed!")
GPIO.cleanup()
What will be printed when the button connected to pin 18 is pressed?
medium
A. Waiting for button press...
B. Button was pressed!\nWaiting for button press...
C. Waiting for button press...\nButton was pressed!
D. No output
Solution
Step 1: Understand program flow before button press
The program prints "Waiting for button press..." and then waits in a loop until button_pressed becomes True.
Step 2: Effect of button press and callback
When the button is pressed, the callback sets button_pressed = True, breaking the loop and printing "Button was pressed!" before cleanup.
Final Answer:
Waiting for button press...
Button was pressed! -> Option C
Quick Check:
Prints before and after button press [OK]
Hint: Callback sets flag; loop waits; prints before and after press [OK]
Common Mistakes:
Thinking callback prints directly
Ignoring the loop waiting for flag
Assuming no output before press
4.
What is wrong with this code snippet that tries to detect a button press on GPIO pin 22?
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(22, GPIO.IN)
def on_press(channel):
print("Button pressed")
GPIO.add_event_detect(22, GPIO.RISING, callback=on_press)
while True:
pass
GPIO.cleanup()
medium
A. Missing pull-up or pull-down resistor setup on pin 22
B. Callback function should return a value
C. GPIO.cleanup() is called before the loop ends
D. Using GPIO.RISING instead of GPIO.FALLING is invalid
Solution
Step 1: Check pin setup for input
The code sets pin 22 as input but does not specify pull-up or pull-down resistors, which can cause floating input and unreliable detection.
Step 2: Review other options
Callback functions do not need to return values. The cleanup call is unreachable but not an error. Both RISING and FALLING edges are valid depending on wiring.
Final Answer:
Missing pull-up or pull-down resistor setup on pin 22 -> Option A
Quick Check:
Input pins need pull resistors to avoid floating [OK]
Hint: Always set pull-up/down resistors for input pins [OK]
Common Mistakes:
Ignoring pull-up/down resistor setup
Expecting callback to return a value
Misunderstanding edge types
5.
You want to detect both button press and release events on GPIO pin 5 using interrupts. Which code snippet correctly sets up event detection for both edges and avoids multiple triggers due to button bounce?
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(5, GPIO.IN, pull_up_down=GPIO.PUD_UP)
def button_event(channel):
if GPIO.input(channel) == GPIO.LOW:
print("Button pressed")
else:
print("Button released")
# Which line correctly adds event detection?
hard
A. GPIO.add_event_detect(5, GPIO.RISING, callback=button_event)
B. GPIO.add_event_detect(5, GPIO.BOTH, callback=button_event, bouncetime=300)
C. GPIO.add_event_detect(5, GPIO.FALLING, callback=button_event, bouncetime=50)
D. GPIO.add_event_detect(5, GPIO.BOTH, callback=button_event)
Solution
Step 1: Identify edge detection for press and release
To detect both press and release, use GPIO.BOTH to catch rising and falling edges.