Kamera mit Bewegungsmeldungssensor und Raspberry Pi

Um mit der Raspberry Pi Kamera Fotos aufzunehmen, die aber nur bei einer bestimmten Bewegung ausgelöst werden, kann man sich mittels eines PIR-Sensors bedienen.

Verwendete Bauteile

Anschlüsse und Aufbau

In den folgenden Versuchen habe ich das Modul HC-SR501 verwendet und dabei die Anschlüsse folgendermaßen mit dem Raspberry Pi verbunden:

HC-SR501 RaspberryPi 3 Model B+
GND GND (z.B. Pin #6)
OUT GPIO 23 (Pin #16)
VCC 5V (Pin #2 oder #4)

Testen des PIR-Sensors

Das folgende Python-Script soll den PIR-Sensor und dessen Empfindlichkeit testen, ohne dass jedoch ein Foto aufgenommen wird.

import RPi.GPIO as GPIO
import time
from datetime import datetime

PIN_SENSOR = 23

GPIO.setmode(GPIO.BCM)
GPIO.setup(PIN_SENSOR, GPIO.IN)

def motionEvent(channel):
    dt = datetime.utcfromtimestamp(time.time()).strftime('%Y-%m-%d %H:%M:%S')
    print('Motion detected! (%s)' % dt)

try:
    GPIO.add_event_detect(PIN_SENSOR , GPIO.RISING, callback=motionEvent)
    while True:
        time.sleep(100)
except KeyboardInterrupt:
    print "Exit."
GPIO.cleanup()

Foto bei Bewegung speichern

Falls noch nicht geschehen, muss zunächst das picamera-Modul für Python installiert werden:
$ sudo apt-get update
$ sudo apt-get install python-picamera python3-picamera
$ python -c "import picamera"
$ python3 -c "import picamera"

Das folgende Python-Script verarbeitet die vom PIR-Sensor erkannte Bewegung (z.B. eines Menschen) und speichert ein Foto auf die angegebene Stelle der SD-Karte.

import RPi.GPIO as GPIO
import time
from datetime import datetime
from picamera import PiCamera

PIN_SENSOR = 23

GPIO.setmode(GPIO.BCM)
GPIO.setup(PIN_SENSOR, GPIO.IN)

camera = PiCamera()

def motionEvent(channel):
    global imgNo
    dt = datetime.utcfromtimestamp(time.time()).strftime('%Y-%m-%d %H%M%S')
    imgPath = './image_' + dt + '.jpg'
    print(imgPath)
    camera.resolution = (1600, 1200)
    camera.capture(imgPath)

try:
    GPIO.add_event_detect(PIN_SENSOR , GPIO.RISING, callback=motionEvent)
    while True:
        time.sleep(100)
except KeyboardInterrupt:
    print "Exit."
GPIO.cleanup()
zurück