Skip to content

Instantly share code, notes, and snippets.

@corny
Last active October 7, 2017 20:30
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save corny/7914db307fb10adacd1919c95fa3733d to your computer and use it in GitHub Desktop.
Save corny/7914db307fb10adacd1919c95fa3733d to your computer and use it in GitHub Desktop.
Raspberry Pi + Picamera = Photobox
#!/usr/bin/env python3
import bottle
import datetime
import picamera
import RPi.GPIO as GPIO
import sys
import signal
import threading
import time
previewRes = (640,480)
captureRes = (2592,1944)
buttonPin = 12
flashPin = 22
countdown = 5
abort = False
cv = threading.Condition()
# Initialize camera
camera = picamera.PiCamera(framerate=30)
camera.annotate_text_size = 160
# Initialize GPIOs
GPIO.setmode(GPIO.BOARD)
GPIO.setup(buttonPin, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(flashPin, GPIO.OUT)
def runCamera():
camera.start_preview()
while not abort:
print("starting preview")
camera.resolution = previewRes
with cv:
cv.wait()
if abort:
break
# Take a picture without annotation
threading.Thread(name='flashing', target=flash).start()
camera.annotate_text = ""
camera.resolution = captureRes
filename = 'box-{}.jpg'.format(datetime.datetime.utcnow().isoformat())
print("saving picture as {}".format(filename))
camera.capture(filename)
def runButton():
while not abort:
input_state = GPIO.input(buttonPin)
if input_state == False:
print('button Pressed')
takePicture(count=True)
time.sleep(0.2)
def flash():
print("flashing")
GPIO.output(flashPin, GPIO.HIGH)
time.sleep(0.5)
GPIO.output(flashPin, GPIO.LOW)
def takePicture(count=False):
if count:
for i in range(countdown):
if abort:
return
text = str(countdown-i)
camera.annotate_text = text
print('countdown: {}'.format(text))
time.sleep(1)
with cv:
cv.notify()
def shutdown():
print("shutting down")
global abort
abort = True
takePicture()
def stdinLoop():
while not abort:
ch = sys.stdin.read(1)
if ch == 'c':
# auslösen mit Countdown
takePicture(count=True)
if ch == 'p':
# sofort auslösen
takePicture()
elif ch == 'f':
# Flash
flash()
def signal_handler(signal, frame):
print('signal received:', signal)
shutdown()
if __name__ == "__main__":
signal.signal(signal.SIGTERM, signal_handler)
signal.signal(signal.SIGINT, signal_handler)
# Create threads
threads = [
threading.Thread(target=runCamera),
threading.Thread(target=runButton),
]
# Start threads
for t in threads:
t.start()
# CLI
threading.Thread(target=stdinLoop, daemon=True).start()
# Wait for signal
signal.pause()
print("waiting for threads")
for t in threads:
t.join()
GPIO.cleanup()
print("exiting main thread")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment