GPIO.add_event_detect und main while Schleife

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo Zusammen,
    auch ich versuche mit dem Raspberry Pi 2 und Python ein Internet Radio zu realisieren. Mit vier Tastern und einem Drehwinkelgeber steuere ich das Ganze.
    Den Drehwinkelgeber benutze ich für die Lautstärke und die vier Taster für 'Play', ' Pause', 'Next' und 'Press'. Mit jeder Betätigung der Taster bzw. Drehwinkelgeber lasse ich mir in der Konsole den aktuellen Sender, die aktuelle Lautstärke, Datum und Uhrzeit ausgeben. Das funktioniert auch soweit sehr gut. Jetzt würde ich allerdings die Ausgabe auch zyklisch, ohne Einwirkung von Außen, aktualisieren aber das will nicht so recht gelingen und mir gehen nach vielen Stunden probieren und Suchen im Web die Ideen aus.
    Mein Code sieht so aus:

    Um jetzt meine zyklische Aktualisierung zu realisieren habe ich die while Schleife am Ende folgendermaßen angepasst. Aufrufen der Funktion printInfoToDisplay alle 5s.

    Code
    try:
           while True:
                   printInfoToDisplay()
                   time.sleep(5)           # time delay 5s


    Sobald ich das aber einfüge reagiert das Programm nicht mehr auf die Taster bzw. den Drehwinkelgeber und ich verstehe nicht warum.

    Ich sag schon mal vielen Dank.

    Gruß Raymond79


  • Sobald ich das aber einfüge reagiert das Programm nicht mehr auf die Taster bzw. den Drehwinkelgeber und ich verstehe nicht warum.

    Wird die Callback-Methode aufgerufen, während sleep schläft? Ich glaube nicht, aber das ließe sich mit einem Minimal-Programm sicherlich ausprobieren. Möglicherweise gehen die Events während des sleep verloren.

    Ich würde bei einem solchen Programm Input (die Events vom GPIO) und den Output in getrennten Threads unterbringen. Dazu brauchst Du Threads, eine gesharte Ressource (wo der Input-Thread reinschreibt und der Output-Thread liest) und einen Lock über diese gesharte Ressource. Doku: https://docs.python.org/2/library/threading.html

    (tcp)

  • Die Interrupt Callbacks laufen bereits in einem separaten Thread. Es besteht also eigentlich kein Bedarf noch einen weiteren Thread zu erzeugen. Das Script selbst ist ein Thread und pro Callback wird ebenfalls ein Thread gestartet.

    Allerdings sollte man in den Callbacks so wenig wie möglich abhanden. Am besten du registrierst im Callback nur eine Änderung und veränderst dann eine Variable worauf andere Schleifen dann prüfen.

    Mittlerweile verwende ich queue um solche Änderungen außerhalb der Callbacks zu verarbeiten. Siehe dazu FAQ --> Nützliche Links / Linksammlung --> Interrupt --> #6
    Nutz auch mal die Forumsuche nach: TRON Radio
    Dort wird in Meinem Projekt auch das Python Module für mpc sowie pygame verwendet

  • Richtig, die callbacks laufen in einem eigenen Thread.

    Ich habe in der Zwischenzeit folgendes per Try&Error rausgefunden. In meiner Funktion printInfoToDisplay() leere ich mit dem folgenden Befehl die Konsole bevor ich die Informationen per Sprint-Befehl ausgeben lasse.

    Code
    os.system('clear')


    Sobald ich diese Zeile auskommentiere, funktioniert alles wie gewünscht. Hat jemand eine Ahnung warum dieser Befehl alles zum kippen bringt?

  • Vielleicht weil os.system etwas zurück gibt? Was passiert wenn du [code=php]_=os.system("clear")[/php] verwendest?

    Alternativ versuch mal das: http://stackoverflow.com/a/18937214


    PS: Dein Script läuft aber scho auf Linux also dem Pi? ;)

Jetzt mitmachen!

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