First order of business is to import some libraries to help send/receive signals to/from the GPIO pins of the Raspberry Pi.
In [1]:
import RPi.GPIO as GPIO
import time
The following code will set the mode to a Broadcom pin layout (which seems to be what we want). We'll also go ahead and set up the LED output pin.
In [2]:
GPIO.setmode(GPIO.BCM)
outpin = 25
GPIO.setup(outpin, GPIO.OUT)
Buttons require us to 'listen' indefinitely for input to our GPIO pin. We use an infinite loop to do this. To stop the loop, you simply click Kernel/Interrupt in the menu above.
Once the button is wired to the pin designated below (inpin #) with the appropriate resistors, set up the port as an input port:
In [3]:
inpin = 18
GPIO.setup(inpin, GPIO.IN, pull_up_down=GPIO.PUD_UP) # the pull_up_down keeps us from worrying about pull-up resistors
In [4]:
prev_input = 1 # looking for a 'False' as the button press signal, so we start with a "True"
while True:
#take a reading
input = GPIO.input(inpin)
#if the last reading was low and this one high, print
if ((not prev_input) and input):
print("Button pressed")
#update previous input
prev_input = input
#slight pause to debounce
time.sleep(0.05)
So, now let's do something with that button press -- how about flashing our light, then taking a photo.
We'll first import the camera class...
In [5]:
from picamera import PiCamera, Color
from time import sleep
We'll wait to instantiate our camera object, just so we don't crash anything with a bunch of button presses.
In [8]:
def blink_and_shoot(idx):
""" idx: an index number for photos to be stored at /img/snapshot-[idx] """
# set up camera
with PiCamera() as camera:
#camera.resolution = (480, 320) # uncomment this line if you want smaller photos
camera.vflip = True
camera.hflip = True
camera.start_preview()
for i in range(3):
GPIO.output(outpin, True)
time.sleep(0.2)
GPIO.output(outpin, False)
#camera.image_effect = 'oilpaint' # just to make things interesting
sleep(0.5)
camera.capture('img/snapshot-%s.jpg' % idx)
camera.stop_preview()
Now for the infinite button loop to listen for a press:
In [9]:
prev_input = 1 # looking for a 'False' as the button press signal, so we start with a "True"
counter = 1
while True:
#take a reading
input = GPIO.input(inpin)
#if the last reading was low and this one high, print
if ((not prev_input) and input):
print("Taking photo%s" % counter)
blink_and_shoot(counter)
counter += 1
#update previous input
prev_input = input
#slight pause to debounce
time.sleep(0.05)
In [10]:
GPIO.cleanup()
In [ ]: