Last active
October 7, 2017 20:30
-
-
Save corny/7914db307fb10adacd1919c95fa3733d to your computer and use it in GitHub Desktop.
Raspberry Pi + Picamera = Photobox
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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