Now that I have GPIO outputs working nicely for Home Assistant using either a Raspberry Pi or an Orange Pi, I want to get GPIO inputs working as well. Naively, that’s pretty easy to do in python on the Raspberry Pi:
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(17, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
while True:
print('Reading...')
if GPIO.input(17) == GPIO.HIGH:
print('Pressed')
else:
print('Released')
time.sleep(1)
That code is of course horrid. Its horrid because its polling the state of the button, and its quite likely that I can sneak a button press in during one of those sleeps and it will never be noticed. Instead we can use edge detection callbacks to be informed of button presses as they happen:
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(17, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
def event_callback(channel):
print('Event detected: %s' % GPIO.input(17))
GPIO.add_event_detect(17, GPIO.BOTH, callback=event_callback, bouncetime=50)
while True:
time.sleep(1)
This second program provides helpful output like this:
pi@raspberrypi:~ $ <strong>python gpio_button_edge_detect.py</strong>
Event detected: 1
Event detected: 0
Which is me pressing the button once (it go high when pressed, and then low again when released). This is of course with a button wired to GPIO17 with a current limiting resistor between the button and the 3.3v rail.