2 while Schleifen zu gleich???

  • Hallo,

    1) Ich habe eine Pi Kamera mit Bewegungsmelder
    2) ein 16x2 LCD Display das Messwerte von zwei Temperatursensoren anzeigt

    Problem:
    Habe für beide Projekte jeweils ein Programm geschrieben und möchte nun ein "Gesamtprogramm" schreiben das beide Projekte beinhaltet

    Durch das 1) Projekt soll der Bewegungsmelder warten bis er eine Bewegung registriert (5 Fotos werden dann gemacht, dauert ungefähr 5sek.)

    Durch das 2) Projekt wird alle 5 sek zwischen - Messwert außen - Messwert innen - Zeit/Datum gewechselt

    Ich möchte jetzt nur nicht das wenn einmal die Kamera auslöst sich der Messwert dann verzögert weil erst die Schleife die die Fotos macht zu Ende läuft und erst dann die Temperatur angezeigt wird sondern die Messwerte sollen immer im konstanten Zeitabstand kommen obwohl die Kamera bei Bewegung auslöst :danke_ATDE:

  • Hallo.
    Das würde ich denke ich anders angehen, und zwar mit nem zyklischen Timer Interrupt für die LCD Werte.
    Also grob:


    Dein Timer int setzt nur ein Flag das du in der main() abfragst, wen ja, resette es und setze den Timer int neu
    dh.h spätestes nach jedem Bild bekommst neue Werte

    Einmal editiert, zuletzt von root (2. Mai 2015 um 21:00)

  • Hallo.
    hm... da sind die chten Pythoner gefragt.
    Iwas gibt es da bei Python mit Prozessauslagerung..... aber da will ich nichts falsches sagen.

    gruß root

  • Kann man da nicht einfach zwei Python-Programme nebeneinander laufen lassen? Wäre spontan die simpelste Lösung, die mir dazu einfiele...

    Alternativ würde ich das Schießen der Fotos in einen eigenen "Prozess" (ich weiß grade nicht wie Python das nennt; bitte nicht auf denselben Begriff in Python gleichsetzen!) im Hintergrund laufenlassen, und bei jedem Schleifendurchlauf soll geprüft werden, ob der "Prozess" noch läuft - wenn er das nicht tut, soll er die Bewegungserkennung ausführen.

    Wär eigentlich auch ein ideales Beispiel für den Umgang mit Klassen und Objekten, aber das ist etwas, womit man sowohl Anfänger als auch langjährige Programmierer, die von Objektorientierung noch nie was gehört haben, leider problemlos überfordern kann^^...

  • Den Bewegungsmelder lässt du einfach über Interrupt laufen - dadurch wird dieser Teil in einem separaten Thread behandelt - und den Rest lässte so laufen...

    Wenn du es unbedingt in einem Script zusammen fassen möchtest bleibt dir nichts anderes als Threads oder Multiprocessing. Denn das Script selbst ist nur ein einziger Thread welcher von "Beschäftigungen" blockiert wird, es kann also nichts ohne Extras parallel ausgeführt/abgearbeitet werden.

  • Hallo meigrafd, lasse mich gerne korrigieren und Du kannst Python, aber


    Den Bewegungsmelder lässt du einfach über Interrupt laufen - dadurch wird dieser Teil in einem separaten Thread behandelt - und den Rest lässte so laufen...


    der Bewegungsmelder wird sicher nen Int auslösen, und was ist mit dem gefordertem 10sec Video ? ...das alles im Int laufen lassen ? würde ich mir nie zutrauen, denn dann beist sich die Katze in den Schwanz.
    Solange die Int Routine läuft, geht in der main() nichts.

    gruß root

    Einmal editiert, zuletzt von root (3. Mai 2015 um 00:38)


  • der Bewegungsmelder wird sicher nen Int auslösen, und was ist mit dem gefordertem 10sec Video ? ...das alles im Int laufen lassen ? würde ich mir nie zutrauen, denn dann beist sich die Katze in den Schwanz.
    Solange die Int Routine läuft, geht in der main() nichts.

    ...Bevor du derartige Mutmaßungen einfach so in den Raum schleuderst wärs toll wenn du es entweder mal ausprobierst oder dich zumindest vorher ein bisschen einliest... Ansonsten halte dich bitte zurück. Sowas sorgt nur unnötig für Verwirrung...


    Je nach Aufbau des Scripts (kenne seinen nicht) ist das auf Basis von Interrupt - wie erwähnt - kein Problem in einem einzigen Script zu behandeln, da - wie erwähnt - durch den Interrupt des RPI.GPIO Modules ein separater Thread erzeugt wird, also quasi unabhängig vom Rest läuft, der dann bei bedarf auf die vorher geladenen Funktionen zugreift, unabhängig davon was in späteren Zeilen des Scripts stattfindet.

    Das kann jeder testen indem er ein Script mit Interrupt erzeugt und am Ende des Scripts eine "while True:" mit einem print rein packt.
    Wenn an dem was 'root' sagte etwas dran wäre dürfe dann weder der Interrupt noch print funktionieren - tut es aber.

    Ein Video aufzeichnen, was durch den Interrupt ausgelöst wurde, ist ebenfalls kein Problem. Haben wir hier in den letzten Wochen ebenfalls realisiert - ebenso wie "Aufnahmeverlängerung" wenn innerhalb der Aufnahmezeit erneut Bewegung stattfindet. Alles in nur einer Scriptdatei.

    Strickt man diesen Galgen weiter liegt also nahe dass auch das anzeigen von "irgend was" auf einem LCD-Display im selben Script kein Problem darstellt - dieser Part wird einfach dort wo die while Schleife das Script am laufen hält, eingefügt.


    Werft mal ein Blick in den FAQ Bereich und guckt dann in der "Linksammlung" nach "Interrupt"


    Und wenn alle Stricke des Galgens reißen gibts ja noch threading oder multiprocessing - wie erwähnt.


  • Wenn an dem was 'root' sagte etwas dran wäre dürfe dann weder der Interrupt noch print funktionieren - tut es aber.


    evtl. solltest mal genau durchlesen, was ich eigentlich geschrieben habe.(sowas in der Art hatten wir glaube ich schon mal...das mit dem lesen).

    aber ok. Thema für mich erledigt.

  • evtl. solltest mal genau durchlesen, was ich eigentlich geschrieben habe.

    Das geb ich dann auch gleich mal an dich zurück.

    Obwohl du selber zugibst von Python keine Ahnung zu haben, finde ich's immer wieder interessant wie du dennoch glaubst Abläufe in Python beurteilen zu können.

    Auch wenn ich aus der Vergangenheit weiß das du jetzt beleidigt bist und nichts mehr dazu schreibst - ich hab dein Post gelesen:


    der Bewegungsmelder wird sicher nen Int auslösen, und was ist mit dem gefordertem 10sec Video ? ...das alles im Int laufen lassen ? würde ich mir nie zutrauen, denn dann beist sich die Katze in den Schwanz.

    Solange die Int Routine läuft, geht in der main() nichts.

    Wie ich bereits vor diesem Post von dir schrieb, läuft der Interrupt in einem anderen Thread. Weißt du was ein Thread ist? So von wegen Unabhängig vom Rest und so?

    Auch erklärte ich anschließend noch mals dass trotz aktueller Abarbeitung der Interrupt-Callback-Funktion weiterhin eine Ausgabe über eine while-Schleife am Ende des Script erfolgt (völlig egal ob die in einer main() Funktion steht). Und anders herum funktioniert das freilich auch.

    Damit wäre also eigentlich deine Aussage wiederlegt.

    Bevor du mir also an den Kopf wirfst Dein geschriebenes nicht richtig gelesen zu haben, schlage ich vor Du probierst das mal praktisch aus - vielleicht verstehst du das besser als meinen Text.


    Ist aber halt schon komisch wie sowas dann funktionieren kann:

    Spoiler anzeigen

    [code=php]#!/usr/bin/env python
    #
    # (c) by meigrafd
    #
    # records for 20sec after motion detected and resets timer after new motion while record.
    #
    from __future__ import absolute_import, division, print_function
    import time
    import RPi.GPIO as IO

    PIR_Kontakt=17

    record_to_file = '/tmp/video.mkv'

    IO.setmode(IO.BCM)
    IO.setup(PIR_Kontakt, IO.IN)
    dictionary = {}
    dictionary['motion'] = False
    dictionary['counter'] = 0


    def INT_PIR(channel):
    dictionary['motion'] = True

    if __name__ == '__main__':
    try:
    print('Programmstart')
    IO.add_event_detect(PIR_Kontakt, IO.RISING, callback=INT_PIR, bouncetime=100)

    with picamera.PiCamera() as camera:
    camera.resolution = (800,600)
    camera.framerate = 24
    while True:
    if dictionary['motion'] == True:
    dictionary['motion'] = False

    if dictionary['counter'] == 0:
    print('Beginn der Videoaufzeichnung')
    camera.start_preview()
    time.sleep(2)
    camera.start_recording(record_to_file, format='h264', quality=30)

    dictionary['counter'] = 21

    if dictionary['counter'] > 0:
    dictionary['counter'] -= 1

    if dictionary['counter'] == 1:
    print('Ende der Videoaufzeichnung')
    camera.stop_recording()

    time.sleep(1)

    except (KeyboardInterrupt, SystemExit):
    GPIO.cleanup()
    [/php]Deiner Aussage nach kann sowas hier nicht funktionieren... Obwohl das Script mit dem Aufnehmen beschäftigt ist wird weiterhin der Int(errupt) erkannt und nimmt Einfluss auf die Schleife


    davon abgesehen beinhaltete mein erster Post in diesem Thread hier aber auch noch einen weiteren Hinweiß, der von dir aber ignoriert zu werden scheint :s


  • ... wie du dennoch glaubst Abläufe in Python beurteilen zu können.


    Habe ich nie behauptet ... siehe oben..(wie war das mit dem lesen ?)


    Auch wenn ich aus der Vergangenheit weiß das du jetzt beleidigt bist und nichts mehr dazu schreibst -


    nö, warum soll ich beledigt sein ...:lol:


    ich hab dein Post gelesen:


    dann wage ich zu bezweifeln dass du den Sinn kapiert hast.

    aber genug der Kasperei.

    Einmal editiert, zuletzt von root (3. Mai 2015 um 02:35)

  • Solange die Int Routine läuft, geht in der main() nichts.

    Script:

    Spoiler anzeigen

    [/spoiler]


    2.Script:

    Spoiler anzeigen

    [/spoiler]


    Kannst Du bitte erklären wieso das geht, obwohl Du doch meintest sowas ginge nicht?

    :denker:


    ..im out..

  • Eigentlich wollte ich nichts mehr dazu sagen...aber es ist tatsächlich war...
    ...er liest nicht.


    Kannst Du bitte erklären wieso das geht, obwohl Du doch meintest sowas ginge nicht?

    Könnte ich, ja sogar bis das script crasht... hab aber keine Lust dazu, liest es eh falsch...
    Evtl. sagt dir valgrind was.
    Muss man bischen Erfahrung sammeln um die Ergebnisse richtig zu interpretieren.
    Nimm dein high-tech script 2, und lasse es laufen.
    Bau ne 2. Verbindung zu Pi auf, und starte valgrind zyklisch so alle Minute.
    ...evtl. steigst dann dahinter.

  • Hi,

    mir würde spontan das Modul _thread einfallen. (python 2: nur thread)

    Thread's können unabhängig voneinander laufen, durch sogenanntes Multithreading ist man als Pythoncoder also in der Lage, einen Thread (z.B. zum Messen vom Datum, einen für Uhrzeit und ein weiterer zum Aufnehmen der Bilder) zu initialisieren.

    Sollte ein Thread durch ein Interrupt jeglicher Natur unterbrochen werden, könnte man dies entweder durch eine Exception abfangen, und dem Programm dann anweisen, was es tun soll, oder aber einen neuen thread anstoßen.

    Das wäre spontan sicherlich die einfachere und schlanke Lösung, für OOP zu klein.

    MfG

    sls

    “Don’t comment bad code - rewrite it.”

    Brian Kernighan

Jetzt mitmachen!

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