Pi Cam mit Bewegungsmelder

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo,
    Bin dabei ein Programm zu schreiben das wenn es eine Bewegung erkennt 5 Bilder schießt und dies in einer Endlosschleife

    z.B.
    Bewegung
    -5 Bilder
    nach den 5 Bildern noch immer eine Bewegung
    -nochmal 5 Bilder
    keine Bewegung mehr
    -der Sensor wartet auf eine neue Bewegung

    so sieht das Programm zurzeit aus:

    Das Problem ist:
    starten des Programms
    -wartet auf erste Bewegung
    Bewegung
    -schießt 5 Bilder
    wartet auf nächste Bewegung
    -zweite Bewegung
    Programm bricht ab:helpnew: :


    :danke_ATDE:

    • Offizieller Beitrag

    Dann werf das

    Code
    cam = picamera.PiCamera()
    cam.resolution = (1920, 1080)

    mal innerhalb deiner While True Schleife. Es scheint als wenn cam.capture_continuous nach abarbeitung die Instanz schliesst.

    Der Unterschied zwischen Genie und Wahnsinn definiert sich im Erfolg.

  • Davon abgesehen sind Leerzeichen und # im Dateinamen schlecht. Lass # weg und ersetze Leerzeichen mit Underscores: _

    Die Reihenfolge des Codes ist aber glaub ich auch etwas komisch, 'ausgelöst' wird erst beim "finally" ausgegeben wenn der Vorgang aber bereits beendet wurde. Das zeigt also kein "auslösen" an.
    Diese "try" Geschichte ist eigentlich zum abfangen von Fehlern bzw Events gedacht - dafür wird es bei dir aber kein bisschen genutzt.

    Das 'with cam' am Anfang der Schleife wird der Handler am Ende automatisch geschlossen - was hier auch dein Problem ist. Dieses Statement solltest du außerhalb der while(True) anbringen oder wie dbv schrieb auch das initialisieren des handler objekts innerhalb der while(True) vornehmen.

    Und damit das ganze sauberer ist solltest du wie gesagt "try" usw richtig platzieren - auch so dass nach beenden durch STRG+C GPIO.cleanup() ausgeführt wird und die GPIOs wieder auf default zurückgesetzt werden.


    Versuch es also mal damit:

    Spoiler anzeigen

    [code=php]
    #!/usr/bin/python
    import picamera
    import time
    import RPi.GPIO as GPIO

    GPIO.setmode(GPIO.BCM)

    GPIO.setup(27, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) #Bewegungsmelder
    GPIO.setup(24, GPIO.OUT) #LED

    x=1

    try:
    cam = picamera.PiCamera()
    cam.led = False
    cam.resolution = (1920, 1080)
    cam.start_preview()
    # Camera warm-up time
    time.sleep(2)
    with cam:
    while(True):
    if (GPIO.input(27) == GPIO.HIGH):
    print 'ausgeloest: ' + str(x)
    x += 1
    for i, filename in enumerate(cam.capture_continuous('{timestamp:%H:%M:%S_%d-%m-%y}_{counter:04d}.jpg')):
    print filename
    GPIO.output(24, GPIO.HIGH)
    time.sleep(0.1)
    GPIO.output(24, GPIO.LOW)
    if i == 5-1:
    break
    except Exception, error:
    print 'Error: ' + str(error)
    except (KeyboardInterrupt, SystemExit):
    print ' Quit'
    GPIO.cleanup()
    [/php]

    Oder damit:

    Spoiler anzeigen


    [code=php]#!/usr/bin/python
    import picamera
    import time
    import RPi.GPIO as GPIO

    GPIO.setmode(GPIO.BCM)

    GPIO.setup(27, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) #Bewegungsmelder
    GPIO.setup(24, GPIO.OUT) #LED

    x=1

    try:
    while(True):
    if (GPIO.input(27) == GPIO.HIGH):
    print 'ausgeloest: ' + str(x)
    x += 1
    cam = picamera.PiCamera()
    cam.led = False
    cam.resolution = (1920, 1080)
    cam.start_preview()
    # Camera warm-up time
    time.sleep(2)
    with cam:
    for i, filename in enumerate(cam.capture_continuous('{timestamp:%H:%M:%S_%d-%m-%y}_{counter:04d}.jpg')):
    print filename
    GPIO.output(24,GPIO.HIGH)
    time.sleep(0.1)
    GPIO.output(24,GPIO.LOW)
    if i == 5-1:
    break
    cam.stop_preview()
    time.sleep(0.5)
    except Exception, error:
    print 'Error: ' + str(error)
    except (KeyboardInterrupt, SystemExit):
    print ' Quit'
    GPIO.cleanup()[/php]

    Es wäre aber denk ich besser stattdessen Interrupts zu nutzen, da zum einen ein time.sleep am Ende der While wichtig ist damit das Script nicht 100% CPU Last erzeugt, aber dadurch kann (unwahrscheinlich aber möglich) ein Schaltvorgang des PIR's verpasst werden - was im Fall durch Interrupt nicht der Fall wäre da das unabhängig des Scripts stattfindet (in einem eigenen Thread). Siehe dazu: Bild per raspistill in Python

  • Wenn der Code nur 1x läuft und danach nicht wieder, sondern erst nach Neustart, dann liegt das meist sicher daran, dass dieser Befehl fehlte:

    camera.close()

    So wird versucht, eine neue Kamerainstanz aufzubauen, bevor die alte geschlossen wurde.
    Und das geht eben nicht.

    Ich hatte das gleiche Problem und auch keine Lösung gefunden, weil das in all den anderen Beiträgen nicht notiert worden war.

    Gruß

    Wokf

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!