Temperatur-Regelung mit Temp-Wert Eingabe über 'Slider'

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
TOWA
User
Beiträge: 4
Registriert: Sonntag 26. November 2017, 20:06

Sonntag 26. November 2017, 21:19

Hallo
Ich habe mir vor einem Monat einen Raspberry Pi 3 zugelegt, Damit versuche ich eine Heizungsregelung zu realisieren. Also 8 Räume Temperatur und ein Raum Luftfeuchtigkeit regeln.Die GUI ist schon fast fertig und läuft. Die Uhrzeit und 11 Temperaturen werden bereits angezeigt.Von Python habe ich vor einem Monat das erste mal was gehört. Aber mit recherchieren, abgucken und viel ausprobieren bin ich mit Tkinter eigentlich ganz gut zurecht gekommen. Mein Derzeitiges Problem ist die Temperatur-Regelung. Der Ansatz ist die gemessene Raumtemperatur mit einer Variablen die mit einem
'Slider' eingestellt wird zu vergleichen. Wenn ich bei 'if temp >= show :' anstelle show eine Zahl eingebe dann geht das wunderbar, was mich zu dem Ergebnis bringt das show hier zu verwenden nicht der richtige Weg ist.
Das hier ist natürlich nur der temp-Regeler. Ich teste das immer separat, und wenn es dann geht wird es ins Hauptprogramm integriert.
Ich hoffe das was alle Anfänger hier hoffen. Das es nur eine "Kleinigkeit"ist und das mir jemand den entsprechenden Denkanstoß geben kann mit dem ich das Problem lösen kann.

from Tkinter import *
root = Tk()
ausgabe = Label(root, bg="gold" , width=60, height=20)
ausgabe1 = Label(root, bg="gold" , width=60, height=20)
ausgabe.grid(row=0, column=0, padx=0, pady=0)
ausgabe1.grid(row=0, column=1, padx=0, pady=0)
ausgabe2 = Label(root, bg="gold" , width=60, height=20)
ausgabe2.grid(row=0, column=2, padx=0, pady=0)

def show(val):
show= w1.get()
print(show)

w1 = Scale(ausgabe1, from_=5, to=42, command=show)
w1.pack()

def temp():
f = open('/sys/bus/w1/devices/28-0417301cdfff/w1_slave')
f.readline()
s = f.readline()
n=s.find('t=')
t=float(s[n+2:]) / 1000
ausgabe2.config(text= '%.0f °C' % t)
print t

if temp >= show :
ausgabe.config( text="warm")

else:
ausgabe.config(text="kalt")

root.after(3000,temp3)

temp()
root.mainloop()
__deets__
User
Beiträge: 2680
Registriert: Mittwoch 14. Oktober 2015, 14:29

Sonntag 26. November 2017, 21:43

Naja, show ist ja nun eine Funktion. Eine Zahl mit einer Funktion zu vergleichen bringt ja nichts.

Du musst stattdessen mit w1.get() vergleichen.
Sirius3
User
Beiträge: 7594
Registriert: Sonntag 21. Oktober 2012, 17:20

Sonntag 26. November 2017, 21:49

@TOWA: `show` ist eine Funktion, die also mit einer Zahl zu vergleichen, ist wenig sinnvoll. `temp3` existiert nicht. *-Importe sollte man vermeiden und ohne Objektorientierung kann man keine komplexeren Gui-Programme schreiben.

Code: Alles auswählen

import Tkinter as tk

def read_temperature():
    with open('/sys/bus/w1/devices/28-0417301cdfff/w1_slave') as data:
        result = data.read().split('t=')[-1]
    return float(result) / 1000

def update_temperature(scale, label_temperature, label_warm_cold):
    temperature = read_temperature()
    reference = float(scale.get())
    label_temperature.config(text='%.0f °C' % temperature)
    text = "warm" if temperature <= reference else "kalt"
    label_warm_cold.config(text=text)
    scale.after(3000, update_temperature, scale, label_temperature, label_warm_cold)

def main():
    root = tk.Tk()
    label_warm_cold = tk.Label(root, bg="gold" , width=60,  height=20)
    ausgabe1 = tk.Label(root, bg="gold" , width=60,  height=20)
    label_warm_cold.grid(row=0,  column=0,  padx=0,  pady=0)
    ausgabe1.grid(row=0,  column=1,  padx=0,  pady=0)
    label_temperature = tk.Label(root, bg="gold" , width=60,  height=20)
    label_temperature.grid(row=0,  column=2,  padx=0,  pady=0)
    scale = tk.Scale(ausgabe1, from_=5, to=42)
    scale.pack()
    update_temperature(scale, label_temperature, label_warm_cold)
    root.mainloop()

if __name__ == '__main__':
    main()
TOWA
User
Beiträge: 4
Registriert: Sonntag 26. November 2017, 20:06

Sonntag 26. November 2017, 22:28

Vielen Dank für die Hilfe. Wie ich sehe hab ich da noch ne Menge zu lernen.
Antworten