Programm funktioniert nur mit HDMI-Anschluss

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

    ich habe zurzeit das Problem, dass ich ein Programm am Raspberry mit folgender .service-Datei automatisch starten lasse:

    Jetzt ergibt sich aber das Problem, dass wenn ich den Pi ganz normal an den Bildschirm anschließe alles einwandfrei läuft und sich keine Probleme ergeben. Wenn ich aber versuche den Pi ohne HDMI-Anschluss zu starten, dann gibt tritt ein Fehler auf und ich kann nicht herausfinden wodurch.

    Ich habe auch schon das "Hdmi_force_hotplug=1" in die /boot/config.txt-Datei zu schreiben. Jedoch ist mir aufgefallen, dass wenn ich den Bildschirm im nachhinein anschließen will, dass auch nicht funktioniert.

    Gibt es da noch etwas zusätzliches, dass ich vergessen habe.

    Edit: Das Programm, dass durch die .service-Datei starten soll, startet in beiden Fällen (das wird durch eine LED angezeigt). Wird dann ein Knopf gedrückt, so wird das Hauptprogramm gestartet. Im Hauptprogramm erfolgt dann das einlesen von verschiedenen Sensoren und das schreiben auf einen USB-Stick.

    Dieses Programm läuft solange weiter, bist ein Knopf gedrückt wurde, oder ein Fehler aufgetreten ist (try/except-schleife)

    Danach wird der RPi automatisch heruntergefahren (egal ob abbruch durch error oder durch Knopfdruck). Wenn das HDMI-Kabel angeschlossen ist läuft es wie gesagt einwandfrei und man kann das ganze einfach per Knopfdruck beenden. Ist es nicht angeschlossen so wird das ganze durch das except abgebrochen.

    Ich hoffe, es kann mir jemand bei meinem Problem helfen.

    MfG

    Einmal editiert, zuletzt von PoH (25. Juni 2021 um 08:02)

  • Hallo,

    kannst du uns das Programm hier mal zeigen? Am besten in Code-Tags ( </> - Knopf).

    Gleich noch zur Info, Python2 wird seit über einem Jahr nicht mehr weiter entwickelt, du solltest nur noch Python3 verwenden.

    Normal werden Python2 Programme mit 'python' aufgerufen und Python3-Programme mit 'python3'.

    Ob das mit deinem Problem zusammenhängt kann ich nicht sagen, das ist mir gerade nur aufgefallen.

    Grüße

    Dennis

    🎧 With the music execution and the talk of revolution, it bleeds in me and it goes 🎧

  • Hier sind die beiden Programme.:

    Wie beschrieben läuft es normale bis zum try/except.

    Dass ich das Programm mit python2 starte hat den Hintergrund, dass in einer älteren Version eine Bibliothek verwendet habe, die nur für python2 vorhanden war, weshalb ich das mit der Syntax geschrieben habe und wenn ich es jetzt mit python3 starten will, dann funktioniert das ganze nicht.

  • Also ich benutze einen RPi4. Als Versorgung Steckt ein USV-Shield auf dem RPi, welches mit 14,4V gespeist wird (laut Hersteller 7-24V).

    Angeschlossen sind ein Knopf, eine LED, ein Aufsatz, der die Signale der Sensoren verstärkt und lesbar macht (AMA0) , ein UART zu TTL Adapter( angesprochen tty/USB0)der zu auch zu so einem Aufsatz für die Sensoren führt und eine RTC. Also nichts, das so ein Verhalten auslösen könnte.

    Ich frage mich, ob es einen Weg gibt, die Log-Files nach dem Herunterfahren anzuschauen. Ich möchte also die Fehlermeldung auslesen können, weshalb das main.py gestoppt wird. Gibt es dazu einen Weg.

    Wenn ich mir diese nämlich dann nach dem Neustarten und anschließen des HDMI-Kabels anschaue, dann finde ich keine, bzw. sind mir da einfach zu viele unterschiedliche Meldungen.

    • Offizieller Beitrag

    In der /var/log/syslog(.*) könntest Du Glück haben.

    Was ist die Ausgabe von

    Code
    cat /var/log/syslog | grep voltage

    ? Damit könnte z.B. meine Vermutung bestätigt oder verworfen werden, dass es am NT, bzw. instabiler Spannung liegt.

    • Offizieller Beitrag

    Ok, dann wird der Fehler vermutlich nicht an der Stromversorgung liegen.

    Kannst Du Dich per SSH mit dem RPi verbinden? Dann würde ich die Systemd Unit ersmal stoppen und disablen. Danach den RPi ohne HDMI neu starten und per SSH die setup.py starten und sehen was passiert.

  • Code
        dateiname = ("/media/pi/Messung" +datetime.now().strftime('%Y%m%d %H%M') + ".csv")     
        system('touch '+ dateiname)  #Datei erstellen
        system('sudo rm ' + dateiname)    #sichergehen, dass Datei nicht bereits vorhanden
        csv_file = open(dateiname,'a')    #Datei beschreiben

    Sicher dass dies so richtig ist ?

    1. Datei erstellen

    2. Datei löschen

    3. Datei append

    Ich bin mir jetzt nicht sicher, aber wird bei 'a' eine Datei erstellt wenn keine da ist ?

    Offizieller Schmier und Schmutzfink des Forum.
    Warum einfach wenn's auch schwer geht ?

    Kein Support per PN !
    Fragen bitte hier im Forum stellen. So hat jeder etwas davon.

  • Der_Imperator Ja, "a" legt die Datei an falls sie nicht existiert.

    PoH Standarderoor ist falsch geschrieben. Und ich habe da ein nacktes ``except`` gesehen, ohne eine konkrete Ausnahme. Damit behandelst Du *alle* Ausnahmen, auch solche mit denen Du gar nicht rechnest, und die Behandlung ”verschluckt” die Ausnahme einfach. Du bekommst gar nicht mit wo und warum das passiert.

    “Dawn, n.: The time when men of reason go to bed.” — Ambrose Bierce, “The Devil's Dictionary”

  • Hallo,

    Ich bin mir jetzt nicht sicher, aber wird bei 'a' eine Datei erstellt wenn keine da ist ?

    Ja es wird eine erstellt.

    Aber mit der Logik bin ich auch nicht einverstanden. Ich baue doch auch kein Haus, reiße es wieder ab schaue mich zur Sicherheit nochmal um, ob in der Nachbarschaft nicht doch irgendwo das Gleiche steht und dann baue ich es wieder auf. :conf:

    Man braucht auch nicht in einem Python-Programm ein zweites aufrufen. Wenn man die Logik in zwei Programme aufteilen will, dann kann man auf das zweite Programm mittels 'import' darauf zugreifen.

    Meine Kommentare beziehen sich dann gleich auf Python3, ich sehe keinen Grund wieso dein Programm Python2 benötigt.

    Zu setup.py:

    'as' ist zum umbenennen da, du nennst 'GPIO' aber nicht um. Richtig wäre from RPi import GPIO. Für die Ansteuerung von GPIO-Pins gibt es das neuere, aktuellere und schönere 'gpiozero'

    'system' von 'os' ist auch veraltet, wenn du mal etwas aus einem Python-Programm starten willst, dann gibt es dafür 'subprocess'. Das brauchen wir hier aber nicht.

    'os.path' wird importiert aber nicht genutzt. Solltest du so etwas mal wieder benötigen, kannst du das neuere und aktuellere 'pathlib' nutzen.

    Auf Modulebene sollte nur Code stehen, der Konstanten, Funktionen oder Klassen definiert. Das Hauptprogramm wird üblicherweise in einer Funktion Namens 'main' gesteuert.

    Du definierst den Pin 15, aber verwendest ihn nicht weiter im Programm.

    Wenn man etwas ausführen will, nach dem ein Ereignis passiert ist, dann braucht man nicht irgendwelche Strings ("main") an einen Namen binden. Für sowas würden sie Wahrheitswerte anbieten, also True oder False. Das Ganze kann man aber kürzen, wenn man mit einem Callback am Button arbeitet. Dann wird etwas ausgeführt, wenn der Button gedrückt wird.

    'i' wird definiert, aber auch nicht weiter behandelt.

    Wenn ich dein Programm richtig interpretiert habe, dann bleibt das übrig:

    'Main.py' ist nicht der beste Name, da das schon der Funktionsname des Hauptprogramms der meisten Python-Programme ist. Das kann Probleme mit sich bringen.

    'serial', 'sys', 'struct', 'fcntl', 'erno', 'traceback', 'struct' und 'csv' wird importiert, aber nicht genutzt. Schade eigentlich, 'csv' wäre nämlich sinnvoll.

    Das mit GPIO, os und Co. wiederhole ich nicht nochmal. Mich wundert es dass du sagst, das der Code funktioniert, in Zeile 36 steht i += da fehlt irgendwie eine Zahl mit der addiert wird.

    Für Python3 kannst du dir das zusammenpuzzeln der Strings mit '+' abgewöhnen. Aktuell nutzt man f-Strings oder die format-Methode.

    'pathlib' bietet die Möglichkeit Pfade nach Dateien zu durchsuchen, das kannst du nutzen um zu schauen ob deine Datei schon vorhanden ist *bevor* du sie erstellst.

    Dateien mit 'open' zu öffnen ist nicht sinnvoll, weil man schnell mal vergisst, die Datei wieder zu schließen, wie in deinem Code auch. Wenn du die Datei mit 'with' öffnest, wird sie automatisch wieder geschlossen, egal ob das Programm mit oder ohne Fehler durchläuft.

    Da du eine csv-Datei hast, solltest du das bereits importierte csv-Modul auch nutzen. Die Dokumentation beschreibt das beschreiben der Datei eigentlich echt gut.

    Dann stechen so Namen wie 'bool_MW_Erhalten' gleich ins Auge. Python hat einen StyleGuid, dort sind einige Schreibweisen definiert, an die man sich halten sollte. Namen werden klein_mit_Unterstrich geschrieben. Ausnahmen sind Konstanten, die schreibt man GANZ_GROSS und Klassen in CamelCase-Schreibweise.

    So vom zweiten Programm bleibt dann folgendes übrig, wenn ich es richtig verstanden habe. Die TODO's bitte abarbeiten.

    Jetzt kannst du dir überlegen ob es Sinn macht, beide Programme zu trennen oder nicht und je nach dem musst du entweder eins in das andere importieren oder halt das eine Programm durch den Code des anderen erweitern.

    Auch wenns nicht zur Lösung beiträgt, vielleicht hilft es auch denjenigen die mal über das Thema hier stolpern.

    Grüße

    Dennis

    Edit: Wollte die Frage von Der_Imperator nicht zwei mal beantworten, das kommt davon wenn man zwischen drin zu Abend isst ^^

    🎧 With the music execution and the talk of revolution, it bleeds in me and it goes 🎧

    • Offizieller Beitrag

    Dennis89 Nur ein kleiner Hinweis... Der TO verwendet

    GPIO.PUD_DOWN

    . Ich gehe davon aus, das es so funktioniert und die Taster dementsprechend verkabelt sind, auch wenn Pullup sinnvoller wäre.

    Deshalb müsste man bei gpiozero Button(pin, *, pull_up=False, ...) setzen. ;)

Jetzt mitmachen!

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