RaspberryPi auf LCD-bildschirm Temperatur ausgeben

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
sagschni
User
Beiträge: 4
Registriert: Mittwoch 13. März 2013, 14:53

Ich habe (wie zu vermuten) ein Problem.
Ich habe ein RaspberryPi an welches ich, wie in der Anleitung http://www.schnatterente.net/technik/ra ... 80-display beschrieben, einen Display gebastelt habe. Ich habe auch das Skript benutzt, welches auf der Seite zu finden ist.
Das Display funktioniert einwandfrei. Es soll die Aufgabe erfüllen, die aktuelle Temperatur und Prozessorlast aus zu geben. So weit, so gut. Ich habe das Skript umgeändert. nur leider hab ich nur Kenntnisse in Php und javascript. In Python jedoch nicht. Ich hab schon ein bisschen gegoogelt, aber keinen Lösungsweg gefunden.

Der Code, den ich geändert habe:

Code: Alles auswählen

def main():

        import os
        TEMP = os.system('/opt/vc/bin/vcgencmd measure_temp')

        display_init()

        lcd_byte(DISPLAY_LINE_1, DISPLAY_CMD)
        lcd_string(TEMP)
        lcd_byte(DISPLAY_LINE_2, DISPLAY_CMD)
        lcd_string("Prozessorlast")
Jedoch kommt als Fehler:

Code: Alles auswählen

temp=45.5'C
Traceback (most recent call last):
  File "displaytest.py", line 96, in <module>
    main()
  File "displaytest.py", line 37, in main
    lcd_string(TEMP)
  File "displaytest.py", line 54, in lcd_string
    message = message.ljust(DISPLAY_WIDTH," ")  
AttributeError: 'int' object has no attribute 'ljust'
Wo liegt das Problem?
Die Prozessorlast habe ich vorher noch nicht eingebaut, soll ja erstmal das eine funktionieren.

Vielen Dank im voraus :)
BlackJack

@sagschni: `os.system()` gibt den numerischen Exitcode vom (via Shell) gestarteten Programm zurück und nicht wie Du anscheinend vermutest die Ausgabe die von dem Programm auf der Standardausgabe geschrieben wird.

Schau Dir mal das `subprocess`-Modul an.

Und den Style Guide for Python Code wegen der Einrücktiefe und Schreibweise von `TEMP`.
sagschni
User
Beiträge: 4
Registriert: Mittwoch 13. März 2013, 14:53

Ich glaube da bin ich zu verwöhnt von Php :) In dem Skript wurde nur mit Tabs gearbeitet, also kein leerzeichen-tab mix, was somit erstmal passen sollte vermutlich. Die Variable werde ich zur Fehlervermeidung einfach in ein allgemein genutztes "i" umbenennen.

Nach einer kurzen Information über subprocess, sehe ich es richtig, dass es dann lauten müsste:

Code: Alles auswählen

i = subprocess.Popen('/opt/vc/bin/vcgencmd measure_temp')
BlackJack

@sagschni: Nein. Da war die Information wohl zu kurz. Du musst die Argumente als Liste angeben und die Ausgabe des externen Programms umleiten und dann auch auslesen. Oder die passende Funktion aus dem Modul verwenden, die das alles für Dich macht.

Und `i` ist auch kein guter Name — weder allgemein für einen numerischen Rückgabewert und schon gar nicht für ein `Popen`-Exemplar. `i`, `j`, und `k` sind typische ganzzahlige Laufvariablen in vielen Programmiersprachen und in der Mathematik. Die sollte man nicht an etwas anderes binden.
sagschni
User
Beiträge: 4
Registriert: Mittwoch 13. März 2013, 14:53

ja da hast du wohl recht, "i" verwendet man normalerweise nur in schleifen u.ä., sollte ja nur mal zum testen sein, um Fehler aus zu schließen :)
gut, dann bennenen wir die Variable nun in "temp" um.

So durch die weitere Hilfe von Google bin ich nu darauf gestoßen:

Code: Alles auswählen

temp = subprocess.check_output('/opt/vc/bin/vcgencmd measure_temp', shell=True)
Dies war die Lösung, es funktioniert... zumindest zeigt es mir an "temp=45.5'C" und dann noch ein chinesisches Zeichen. Suboptimal. Wenigstens geht der Befehl erstmal, vielen Dank.

Sicherlich gibt es auch für das seltsame Zeichen eine einfache Lösung, oder? Also dass er richtig "°C" ausgibt
BlackJack

@sagschni: Lass das ``shell=True`` weg und lies mal in der Dokumentation nach wie `Popen` — und damit auch `check_output()` — die Argumente übergeben bekommen sollte.

„Chinesisches Zeichen” kann ich auf der Konsole nicht nachvollziehen. Kann es ein, dass das Display vielleicht das Zeilenendezeichen nicht mag was noch hinter dem 'C' steht?
sagschni
User
Beiträge: 4
Registriert: Mittwoch 13. März 2013, 14:53

Okay, jetzt bin ich glücklich und zufrieden.
mittels

Code: Alles auswählen

output = subprocess.check_output('/opt/vc/bin/vcgencmd measure_temp', shell=True)
        temperature = output[:-3]
        temp = str(temperature) + chr(223) + 'C'
hat alles nun seine Richtigkeit.

vielen vielen dank :)
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Alles seine Richtigkeit. Naja. Eher so:

Code: Alles auswählen

output = subprocess.check_output(['/opt/vc/bin/vcgencmd', 'measure_temp'])
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten