Skip to content

Commit 46550a4

Browse files
committed
Wrote Wearable Time Lapse Camera script in python
1 parent 5c2fcda commit 46550a4

File tree

1 file changed

+65
-0
lines changed

1 file changed

+65
-0
lines changed
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
#!/usr/bin/env python3
2+
3+
import os
4+
import re
5+
import time
6+
import board
7+
import digitalio
8+
9+
# Timelapse script, because timelapse options in raspistill don't power
10+
# down the camera between captures. Script also provides a camera busy LED
11+
# (v2 cameras don't include one) and a system halt button.
12+
# 'gpio' command requires WiringPi: sudo apt-get install wiringpi
13+
# Limitations: if DEST is FAT32 filesystem, max of 65535 files in directory;
14+
# if DEST is ext4 filesystem, may have performance issues above 10K files.
15+
# For intervals <2 sec, better just to use raspistill's timelapse feature.
16+
17+
# Configurable stuff...
18+
INTERVAL = 15 # Time between captures, in seconds
19+
WIDTH = 1280 # Image width in pixels
20+
HEIGHT = 720 # Image height in pixels
21+
QUALITY = 51 # JPEG image quality (0-100)
22+
DEST = "/home/pi/timelapse" # Destination directory (MUST NOT CONTAIN NUMBERS)
23+
PREFIX = "img" # Image prefix (MUST NOT CONTAIN NUMBERS)
24+
HALT_PIN = board.D21 # Halt button GPIO pin (other end to GND)
25+
LED_PIN = board.D5 # Status LED pin (v2 Pi cam lacks built-in LED)
26+
COMMAND = "libcamera-still -n --width {width} --height {height} -q {quality} --thumb none -t 250 -o {outfile}"
27+
#COMMAND = "raspistill -n -w {width -h {height} -q {quality} -th none -t 250 -o {outfile}"
28+
prevtime = 0 # Time of last capture (0 = do 1st image immediately)
29+
30+
def main():
31+
global prevtime
32+
halt = digitalio.DigitalInOut(HALT_PIN)
33+
halt.switch_to_input(pull=digitalio.Pull.UP)
34+
led = digitalio.DigitalInOut(LED_PIN)
35+
led.switch_to_output()
36+
37+
# Create destination directory (if not present)
38+
os.makedirs(DEST, exist_ok=True)
39+
40+
# Find index of last image (if any) in directory, start at this + 1
41+
files = os.listdir(DEST)
42+
numbers = [int(re.search(r'\d+', f).group()) for f in files if f.startswith(PREFIX) and re.search(r'\d+', f)]
43+
numbers.sort()
44+
frame = numbers[-1] + 1 if numbers else 1
45+
currenttime = time.monotonic()
46+
47+
while True:
48+
while time.monotonic() < prevtime + INTERVAL: # Until next image capture time
49+
currenttime = time.monotonic()
50+
# Check for halt button -- hold >= 2 sec
51+
while not halt.value:
52+
if time.monotonic() >= currenttime + 2:
53+
led.value = True
54+
os.system('shutdown -h now')
55+
outfile = f"{DEST}/{PREFIX}{frame:05}.jpg"
56+
# echo $OUTFILE
57+
led.value = True
58+
os.system(COMMAND.format(width=WIDTH, height=HEIGHT, quality=QUALITY, outfile=outfile))
59+
led.value = False
60+
frame += 1 # Increment image counter
61+
prevtime = currenttime # Save image cap time
62+
63+
64+
if __name__ == "__main__":
65+
main()

0 commit comments

Comments
 (0)