Danke mit dem Autostart Ordner in home/pi/.config hat es funktioniert.
ich habe das Programm nochmal überarbeitet
tkinter wird nicht mehr komplett importiert
index error wird jetzt aufgefangen
es sind verschiedene Sollwerte zur Auswahl.
Python
#!/usr/bin/env python3
import subprocess
import time
import queue
import threading
import tkinter as tk
from subprocess import call
from rpi_lcd import LCD
from signal import signal, SIGTERM, SIGHUP
from pathlib import Path
from RPi import GPIO
q = queue.Queue()
def EingabeFenster():
def button_start70():
q.put(70)
def button_start75():
q.put(75)
def button_start80():
q.put(80)
def button_start85():
q.put(85)
def button_stop():
q.put(0)
def button_sd():
q.put(2)
fenster = tk.Tk()
fenster.attributes("-topmost", True)
fenster.title("Bedampfersteuerung.")
start_button70 = tk.Button(fenster, text="Start 70", bg='#6A5Acd', command=button_start70)
start_button75 = tk.Button(fenster, text="Start 75", bg='#A020F0', command=button_start75)
start_button80 = tk.Button(fenster, text="Start 80", bg='#912CEE', command=button_start80)
start_button85 = tk.Button(fenster, text="Start 85", bg='#7D26CD', command=button_start85)
stop_button = tk.Button(fenster, text="\n Stop \n",bg='red', command=button_stop)
sd_button = tk.Button(fenster,text="Herunterfahren", command=button_sd)
anweisungs_label = tk.Label(fenster, text="untere Soll Temperatur wählen")
info_label = tk.Label(fenster, text="System Herunterfahren")
anweisungs_label.grid(row=0, column=0, columnspan = 4, padx='5', pady='5', sticky='ew')
start_button70.grid(row=1, column=0, padx='5', pady='5', sticky='ew')
start_button75.grid(row=1, column=1, padx='5', pady='5', sticky='ew')
start_button80.grid(row=2, column=0, padx='5', pady='5', sticky='ew')
start_button85.grid(row=2, column=1, padx='5', pady='5', sticky='ew')
stop_button.grid(row=1, column=3, rowspan =2, padx='5', pady='5', sticky='ew')
info_label.grid(row=3, column=0, columnspan =4, padx='5', pady='5', sticky='ew')
sd_button.grid(row=4, column=0, columnspan =4, padx='5', pady='5', sticky='ew')
fenster.mainloop()
threading.Thread(target=EingabeFenster, daemon=True).start()
def safe_exit():
exit(1)
TEMPERATURE_SENSOR_PATH = (
min(Path("/sys/bus/w1/devices").glob("28*")) / "w1_slave"
)
BUTTON_PIN = 20
HEATING_PIN = 21
lcd = LCD()
def read_temperature_raw():
with TEMPERATURE_SENSOR_PATH.open("r", encoding="utf-8") as file:
return list(file)
def read_temperature():
while True:
try:
lines = read_temperature_raw()
if lines[0].strip().endswith("YES"):
break
except IndexError:
lcd.text("IO Fehler",1)
time.sleep(0.2)
return float(lines[1][lines[1].index("t=") + 2 :]) / 1000
def main():
subprocess.run(["modprobe", "w1-gpio"], check=True)
subprocess.run(["modprobe", "w1-therm"], check=True)
try:
GPIO.setmode(GPIO.BCM)
GPIO.setup(HEATING_PIN, GPIO.OUT)
GPIO.setup(BUTTON_PIN, GPIO.IN)
signal(SIGTERM, safe_exit)
signal(SIGHUP, safe_exit)
seconds = 0
soll = 80
while True:
if GPIO.input(BUTTON_PIN):
seconds = 1200
if not q.empty():
s = q.get()
if s >= 65:
seconds = 1200
soll = s
if s == 0:
seconds = 0
if s == 2:
seconds =-20
temperature = round(read_temperature(),1)
if seconds == 0:
lcd.text("zum Satarten",1)
lcd.text("Taste drücken",2)
if temperature > soll:
seconds -= 1
if seconds < 0:
lcd.text(f'{temperature}C', 1)
lcd.text("fertig ", 2)
else:
lcd.text(f'{temperature}C {round(seconds)} s',1)
lcd.text("aufgeheizt", 2)
if seconds >=1:
GPIO.output(HEATING_PIN,GPIO.HIGH)
if temperature <= soll:
lcd.text(f'{temperature}C aufheizen', 1)
lcd.text(f'Sollwert {soll}C', 2)
else:
GPIO.output(HEATING_PIN,GPIO.LOW)
if seconds <=-20:
lcd.text("Netzstecker",1)
lcd.text("zeihen fertig",2)
GPIO.cleanup()
time.sleep(1)
call("sudo nohup shutdown -h now", shell=True)
finally:
GPIO.cleanup()
if __name__ == "__main__":
main()
Display More
Mit der Objekt orientierten Programmierung hatte ich schon immer so meine Schwierigkeiten alles was ich sonst so gemacht habe war prozedural.
Das ich in dem Diesem Fall das GUI angeflanscht habe ist richtig. Sie ist auch mehr als Option gedacht die Hauptbedienung soll über den Taster Stattfinden.
Das Deutsche habe ich mir durchgelesen ist aber eher eine Zusammenfassung. Ich finde es sehr mühsam 30 Seiten für "Hallo Welt" durch zu lesen bis dann mal etwas brauchbares kommt.