Temperaturen zyklisch anzeigen

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
aalozo
User
Beiträge: 2
Registriert: Freitag 20. November 2015, 09:40

Hallo ich bin absoluter Anfänger und hoffe auf Eure Hilfe.
Folgendes Problem, ich habe mir Script geschrieben in dem über 1-Wire drei Temperatur ausgelesen wird und auf der GUI dargestellt wird.
Das funktioniert auch ganz gut, nun möchte ich die einzelnen Werte, da nach weitere Sensoren folgen sollen, zyklisch auf der GUI anzeigen lassen.
Versuche nun das Problem seit Tagen zu lösen, kann man die Label überschreiben oder löschen beziehungsweise muss das Fenster immer wieder neu erzeugt werden.

Für Euch sicher ein leichtes, für mich ein grosses Problem, schon mal dank im vorraus.

Code: Alles auswählen

import time
from Tkinter import *



deviceFile1 = '/sys/bus/w1/devices/28-03156396f9ff/w1_slave'
deviceFile2 = '/sys/bus/w1/devices/28-0315639b22ff/w1_slave'
deviceFile3 = '/sys/bus/w1/devices/28-021563812bff/w1_slave'

#Temperatur1
def readTemp1():
    try:
        with open (deviceFile1)as f:
            f.readline()               #erste Zeile ignorieren
            s=f.readline()             #zweite Zeile
        n=s.find('t=')                 #dort 't=' suchen
        if(n>0):
            t=float(s[n+2:])/1000
        lbl1.configure(text= '%.1f C' % t)
        fenster.after(3000, readTemp1)
        print ('Temp1: %.3f C°' % t)
    except IOError:
        print('Verbindungsfehler')
        lbl1.configure(text= 'Verbindungsfehler' )

#Temperatur2
        
def readTemp2():
    try:
        with open (deviceFile2)as f:
            f.readline()               #erste Zeile ignorieren
            s=f.readline()             #zweite Zeile
        n=s.find('t=')                 #dort 't=' suchen
        if(n>0):
            t=float(s[n+2:])/1000
        lbl2.configure(text= '%.1f C' % t)
        fenster.after(3000, readTemp2)
        print ('Temp2: %.3f C°' % t)
    except IOError:
        print('Verbindungsfehler')
        lbl2.configure(text= 'Verbindungsfehler' )

#Temperatur3

def readTemp3():
    try:
        with open (deviceFile3)as f:
            f.readline()               #erste Zeile ignorieren
            s=f.readline()             #zweite Zeile
        n=s.find('t=')                 #dort 't=' suchen
        if(n>0):
            t=float(s[n+2:])/1000
        lbl3.configure(text= '%.1f C' % t)
        fenster.after(3000, readTemp3)
        print ('Temp3: %.3f C°' % t)
    except IOError:
        print('Verbindungsfehler')
        lbl3.configure(text= 'Verbindungsfehler' )



#Fenster
        
fenster=Tk()                           #Erzeugen Basis-Fenster
fenster.title('Temparaturen DS18b20')  #Fenster Titel
fenster.geometry('320x200')            #Fenster Groesse


#Temp1

t1=Label(                                       #Text Temp Aufruf
    text="Temp-Essen",                 #Text Temp Eingabe
    font=('arial',17))                       #Text Temp Font, Groesse
t1.pack()                                        # Desinger t1


lbl1=Label(                                       #Wert Label
    font=("arial ",17))                      #Wert Font, Groesse
lbl1.pack()                                       # Desinger lbl1

readTemp1()                       # Wert lesen

#Trenner
t4=Label(
    text='______________________________________________________________________________________________',
    font=('arial',1))
t4.pack()

#Temp2

t2=Label(                                       #Text Temp Aufruf
   text="Temp-Wohnen",                 #Text Temp Eingabe
   font=('arial',17))              #Text Temp Font, Groesse
t2.pack()                         #Text Temp Desinger

lbl2=Label(                                      #Wert Label
    font=("arial ",17))            #Wert Font, Groesse

lbl2.pack()
readTemp2()

#Trenner
t5=Label(
    text='______________________________________________________________________________________________',
    font=('arial ',1))
    

t5.pack()

#Temp3

t3=Label(
    text='Temp-Aussen',
    font=('arial',17))
t3.pack()

lbl3=Label(                                      #Wert Label
   font=("arial ",17))            #Wert Font, Groesse

lbl3.pack()
readTemp3()
   
mainloop()
__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

Also zuerst faellt mal auf, dass du drei mal identischen Code hast. Den kann man einfacher machen, indem man eine "readTemp"-Funktion baut, welche den konkreten Sensor als Parameter uebergeben bekommt.

Zweitens sollte diese Funktion *nur* die Temperatur auslesen, und zurueckgeben. Die Vermischung mit der GUI macht das Leben naemlich deutlich schwerer.

Drittens ist das anlegen von durchnumerierten Variablen ein Anzeichen dafuer, dass man eigentlich eine andere Datenstruktur haben will - in deinem Fall eine Liste.

Das man in Tkinter-GUIs "after" benutzen muss, um Dinge "parallel" laufen zu lassen, weisst du ja schon.

Dann noch ein bisschen itertools Magie druebergestreut, und du bist fast fertig. Ein kleiner (ungetesteter!) Schubs, der das wesentliche zeigt:

Code: Alles auswählen

from itertools import cycle

UPDATE_INTERVAL = 3000
SENSORS = ['/sys/bus/w1/devices/28-03156396f9ff/w1_slave', ...]

SENSOR_ITERATOR = cycle(SENSORS) # Endlossschleife ueber die Sensoren


def sensorUpdate():
      sensor = SENSOR_ITERATOR.next()
      temperature = readTemp(sensor)
      # update des Labels kommt hier
      fenster.after(UPDATE_INTERVAL, sensorUpdate)
     
aalozo
User
Beiträge: 2
Registriert: Freitag 20. November 2015, 09:40

Vielen Dank Dir erstmal, ich werde versuchen dieses so umzusetzen.
Wie gesagt ich bin noch absoluter Anfänger.
Antworten