Hilfe bei Programmcode

L I V E Stammtisch ab 20:30 Uhr im Chat
  • Hallo liebe Programmiergemeinde,

    ich habe hier ein kleines Programm geschrieben. Es funtioniert soweit wie gewünscht, jedoch bin ich kein Profi und würde mich freuen wenn mal einer von euch drüber schauen kann und mir noch ein paar hilfreiche Tipps geben kann. Was könnte z.B. zu Problemen führen ? Wie kann es effektiver gestaltet werden?

    Zur Funktion:

    Der Raspberry baut eine Netzwerkverbindung auf und wartet auf die Übertragung von Daten. Wenn "PLAY" übertragen wird soll je nach dem ob der Schalter am GPIO 2 geschalten ist Audiofile 1 oder 2 zwei abspielen. Danach wird ein Relais auf GPIO 26 gesetzt und die globale Variable "status = True". Nachdem status = true ist läuft mit time.sleep eine Zeit ab die ungefähr die der Audiospur entspricht ab und das Relais fällt wieder ab. Da das Audiofile jederzeit gestoppt werden muss habe ich das "Zeitrelais" über threading realisiert.

    Wie bereits geschrieben würde mich sehr über ein paar Tipps freuen. Zudem ich das Programm zur Zeit nicht beeenden kann ohne den Raspberry neu zu starten. Ich habe es jetzt mit PYthon 2.7 realisiert.

    Danke schon mal im Vorraus.

    Habe noch was vergessen. Das Programm soll unendlich mal hintereinander abspielbar sein. Es läuft quasi per autostart an und soll den ganzen Tag laufen.

  • Hallo,

    Zitat


    Da das Audiofile jederzeit gestoppt werden muss habe ich das "Zeitrelais" über threading realisiert.

    Das macht irgendwie keinen Sinn, also da besteht - basierend auf deinem Code - null Zusammenhang. Wenn du die Audiodatei stoppst passiert mit dem Relais nichts. Das wird lediglich auf low gesetzt, wenn Musik startet und dann nach 60 Sekunden wieder auf high. Wenn in den 60 Sekunden STOP kommt bleibt das Releis auf high - zuminest so lange, bis a) entweder 60 Sekunden um sind oder b) PLAY gesendet wird.

    Zum Code:

    Vergiß einfach, das es `global`gibt. Das braucht man in 99,9% aller Fälle nicht und deiner gehört nicht zu den vergleibenden 0,1%. Mit einem Thread kommuniziert man über z.B. eine Queue. Wenn man zwischen verschiedenen Threads einen globalen Status teilen will, dann macht man das i.d.R. über ein Objekt.

    Abgesehen davon ginge das hier auch ohen einen Thread, alles in einer Schleife. Merke dir einfach die Zeit, wenn PLAY kam, prüfe im Schleifendurchlauf, on die 60 Sekunden um sind und schalte dann GPIO 26 wieder.

    Funktionsnamen schreibt man per Konvention immer klein, also `main` statt `Main`.

    Kommentare sollen zusätzliche Informationen geben, nicht das erklären, was so wie so offensichtlich ist. Damit sind alle deine Kommentare überflüssig.

    Gibt es einen bestimmten Grund, warum du noch Python 2.7 nutzt statt Python 3.x? Der Support läuft 2020 auch und dein Code lässt auch nichts erkennen, was Python 2.7 zwingend nötig macht.

    Gruß, noisefloor

  • Außerdem verwendest du print mit Klammern, was zwar gültiger Python 2 Code ist, aber ganz danach aussieht, als ob dir der Unterschied zwischen Funktion und Statement nicht bekannt ist.

    Vergleiche mit True, False und None erfolgen besser mit is und is not, nicht == oder !=. Auch hier besser nochmals die Unterschiede nachschauen.

    Einrückungen sollten ohne Ausnahme 4 Leerzeichen pro Ebene sein, das ist bei dir nicht immer der Fall.

  • Hallo,

    erst einmal Danke für die Tipps.

    Das Problem an der Sache liegt in Zeile 40, recvfrom(1024) wartet so lange bis neue Daten kommen und geht dann erst durch die Schleife. Somit brauch ich das Threading um gleichzeitig eine Zeit für mein Relais ablaufen zu lassen. Den so lange keine Daten kommen durchläuft das Programm die Schleife nicht. Ich hab leider keine andere Idee wie sonst. Würde sehr gern ohne Threads arbeiten.

Jetzt mitmachen!

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