Bilder werden immer wieder überschrieben

  • Hallo zusammen!


    Ich bin neu hier und arbeite gerade an meiner Seminar-Arbeit für die Schule.
    Ich sitze jetzt schon mehrere Tage am Raspberry Pi und habe immer noch das selbe Problem:


    Ich schreibe ein Python-Programm, indem eine Kamera ein Bild machen soll, sobald der Bewegungssensor eine Bewegung erkannt hat.
    Soweit geht das auch noch, aber bei der nächsten Bewegung wird zwar nochmals ein Bild gemacht, das Alte jedoch überschrieben.



    Ich brauche das Programm, um die Brutzeit von Hühnern oder Vögel zu dokumentieren.


    Hier mein Programm:


    import RPi.GPIO as GPIO
    import time
    import picamera
    from time import sleep


    zeit = time.strftime("%d.%m.%Y %H:%M:%S"))


    GPIO.setmode(GPIO.BCM)
    GPIO_PIR = 4
    print "PIR-Modul gestartet (Strg-C to exit)"
    GPIO.setup(GPIO_PIR,GPIO.IN)
    Read = 0
    State = 0


    try:


    print "Warten, bis PIR im Ruhezustand ist..."
    while GPIO.input(GPIO_PIR) != 0:
    time.sleep(0.1)
    print "Bereit..."
    while True:
    Read = GPIO.input(GPIO_PIR)
    if Read == 1 and State == 0:
    print "Bewegung erkannt!"
    State = 1
    cam = picamera.PiCamera()
    cam.resolution = (640, 480)
    cam.start_preview()
    time.sleep(2)
    cam.stop_preview()
    cam.capture(zeit+'.jpg')
    cam.close()
    elif Read == 0 and State == 1:
    print "Bereit..."
    State = 0
    time.sleep(0.1)
    except KeyboardInterrupt:
    print "Ende..."
    GPIO.cleanup()


    Ich kenne mich in Python leider so gut wie gar nicht aus, im Informatik-Unterricht in der Schule programmieren wir nur mit BlueJ! Es ist zwar ähnlich, aber halt nicht gleich.
    Ich hab versucht, Python ein wenig zu lernen, aber im Moment reicht es einfach noch nicht aus. Ich besitze meinen Raspberry Pi erst seit ca. einem halben Jahr und habe mich zuvor noch nie mit der Welt der Raspberry Pis befasst.


    Ich würde mich sehr freuen, wenn mir jemand weiterhelfen könnte.


    Für jede Antwort bin ich dankbar!!! :danke_ATDE: :danke_ATDE: :danke_ATDE: :danke_ATDE: :danke_ATDE: :danke_ATDE: :danke_ATDE: :danke_ATDE: :danke_ATDE: :danke_ATDE:


    Liebe Grüße
    LittleChicken

  • Du hast die Variable zeit nur ganz oben im Programm einmal gesetzt. Die bleibt immer gleich und damit wird auch die Datei immer wieder überschreiben.


    Du solltest kurz vor oder nach dem Aufnehmen des Bildes die Variable zeit neu setzen, mit dem gleichen Befehl wie oben. Z.B. hinter "Bewegung erkannt".


    Grüße
    Gnom

    Oh, man kann hier unliebsame Nutzer blockieren. Wie praktisch!

  • Hallo Gnom,


    vielen Dank für Deine Hilfe. Jetzt klappt's super, ich bin echt so happy...


    Vielen vielen Dank für Deine Hilfe!!! :bravo2: :bravo2::danke_ATDE:


    Liebe Grüße
    LittleChicken

  • Hallo zusammen


    Habe das gleiche Problem. wie sieht der Code jetzt den aus? Wo kommt die Variable jetzt hin?


    Mein Code sieht so aus und da wird auch immer das Foto ueberschrieben.


    Bin schon jetzt fuer eure Antworten dankbar

  • Das Thema ist von 2017, da hättest du ein neues Thema aufmachen können.


    Aber ers tmal Willkommen im Forum.


    In Zeile 7 legst du die Uhrzeit fest und dann startest du mit 'while True' eine Dauerschleife. Das bedeutet dein 'filename' wird beim Programmstart gesetzt. Dann läuft deine Dauerschleife und macht ein Bild nach dem anderen (Wenn eine Bewegung erkannt wird) und jedes Bild bekommt den Name 'filename', weil nur noch die Schleife durchlaufen wird.


    Ach und KONSTANTEN schreibt man in Python mit Großbuchstaben (:


    Edit: Konstanten schreibt man zwar groß, aber 'filename' sollte hier ja nicht konstant sein.

    Wann kommen die letzten drei Zeilen eigentlich zum "Einsatz"?


    Grüße

    Dennis

    Wasn't ready to be no millionaire =O

    Edited once, last by Dennis89 ().

  • resses_jack Ergänzend zur Frage von Dennis89: Falls die Zeilen ausgeführt würden, stellt sich die gleiche Frage bei den drei Zeilen dann auch noch mal bei der letzten Zeile. Und natürlich auch noch wie denn über die erste Zeile hinausgekommen werden soll wo versucht wird `GPIO` zu verwenden was nirgends definiert ist.


    Das Programm Endet am Ende automatisch, da muss man kein `sys.exit()` hinschreiben. (`sys` wurde auch nicht importiert.)


    Und auch `cam` existiert nicht, sollte man tatsächlich bis zu der letzten Zeile kommen können.


    Die `PiCamera` ist ein Kontextmanager, kann also mit ``with`` verwendet werden. Und sollte es auch.


    Das Formatieren des Zeitstempels ist reichlich umständlich. Man kann die Zeichen zwischen den Werten auch mit in die Formatierung schreiben, dann braucht man nicht ständig {0:…} für jeden Teilwert.

    “It is my impression that it's possible to write good programs in C++, but nobody does.” — John Levine in comp.compilers

  • Hey Zusammen


    Vielen lieben dank für die tollen infos und Ergänzungen. Wie ihr sicher schwer erkennen könnt, bin ich noch gar nicht Sattelfest...


    Darum habe ich diesbezüglich noch ein paar Fragen :-)


    Was ist ein Kontextmanager? und was bedeutet der Befehl with?

    Ich verstehe jetzt leider nicht warum jetzt jedesmal eine neue Datei erstellt wird und beim vorigen Skript nicht, dort war doch hinter camera.capture auch das selbe hinterlegt? Oder doch nicht...:conf:


    Oh man, ich Entschuldige mich schon jetzt für diese sicher "banalen" Fragen....

  • Ich verstehe jetzt leider nicht warum jetzt jedesmal eine neue Datei erstellt wird und beim vorigen Skript

    Wo steht denn in dem Code von __blackjack__ 'datetime.now()' und wo steht das in deinem Code? Dazu les dir nochmal durch was ich über 'while True' geschrieben habe. Hier steht was 'datetime.now()' macht.


    Die anderen Fragen kann dir __blackjack__ fachmännischer erklären.


    PS: Ich finde den Dateiname "aha_..." auch viel besser ^^


    Grüße

    Dennis

    Wasn't ready to be no millionaire =O

  • resses_jack Kontextmanager sind Objekte die man mit ``with`` verwenden kann wo das Objekt bestimmt was am Anfang und am Ende von so einem ``with``-Block passiert, und zwar egal aus welchen Gründen der Programmfluss diesen Block verlässt. Also egal ob der einfach unten aus dem Block ”raus läuft”, oder der Block durch ``return``, ``break``, ``continue``, oder einer Ausnahme verlassen wird. Das Kamera-Objekt wird dann ”geschlossen” und die belegten Ressourcen wieder freigegeben.


    Und, ich weiss das kommt jetzt sicher völlig überraschend, ``with`` ist tatsächlich in der Python-Dokumentation dokumentiert. Wie alle anderen Python-Schlüsselworte auch. Die haben echt keins vergessen. Absolut unglaublich. 😎

    “It is my impression that it's possible to write good programs in C++, but nobody does.” — John Levine in comp.compilers

  • Und, ich weiss das kommt jetzt sicher völlig überraschend, ``with`` ist tatsächlich in der Python-Dokumentation dokumentiert. Wie alle anderen Python-Schlüsselworte auch. Die haben echt keins vergessen. Absolut unglaublich. 😎

    Ich weiss ich muss noch über die Bücher (;


    Ach ja eines noch. wie kriege ich KeyboardInterrupt in das Skript.


    Es gibt mir jedesmal eine syntax Fehler aus. möchte das Programm gerne mit Strg+C beenden.


    Ach ja noch zum Schluss. Kann mir einer von euch noch ein gutes Buch oder Onlinetool empfehlen damit ich diese Sprache besser verstehe und anwenden kann? Am besten in Deutsch.


    Danke schon jetzt

  • resses_jack Bücher? Also naja, man kann sich die Python-Dokumentation auch als PDF runterladen, ausdrucken, und als Buch binden… 🙂


    Also beenden kannst Du das Programm auch ohne Änderungen mit Strg+C.


    Falls Du dabei den Traceback von der `KeyboardInterrupt`-Ausnahme nicht haben möchtest, müsstest Du diese Ausnahme behandeln. Also am besten den ganzen Code in der `main()`-Funktion in einen ``try``-Block setzen und dann mit ``except`` die `KeyboardInterrupt`-Ausnahme behandeln und das mit einem ``pass`` falls da sonst nichts weiter passieren soll.

    “It is my impression that it's possible to write good programs in C++, but nobody does.” — John Levine in comp.compilers

  • Ich brauche das Programm, um die Brutzeit von Hühnern oder Vögel zu dokumentieren.

    Bevor die Eier hartgekocht sind, hier noch ein Beispiel, was ich glaube, was __blackjack__ meint.


    Kopiere es vielleicht nicht gleich in deinen Code. Lass es doch mal laufen, schaue was passiert, verändere es und schaue wieder und dann kannst du passend für deinen Code umschreiben.


    Grüße

    Dennis

    Wasn't ready to be no millionaire =O