Hallo zusammen.
Ich versuche mit einer Oberfläche aus ein paar Buttons eine Zeit festzulegen, die die Pumpe in zwei verschiedene Kammern pumpt. Während der if Schleife (bzw. der while Schleife, die ich eigentlich nutzen will) kann ich auf der Oberfläche keinen Button drücken und somit den Zustand von var nicht ändern. Ist es möglich die Oberfläche dauerhaft nutzen zu können?
Import time
import tkinter as tk
from RPi import GPIO
from functools import partial
SETTINGS = {
"PUMPE": 17,
"VALVEL": 18,
"VALVER": 27
}
def start(var):
if var.get() == 1:
print('mittel')
GPIO.setup(SETTINGS["PUMPE"], GPIO.OUT, initial=GPIO.LOW)
GPIO.setup(SETTINGS["VALVEL"], GPIO.OUT, initial=GPIO.LOW)
time.sleep(3)
GPIO.setup(SETTINGS["VALVEL"], GPIO.OUT, initial=GPIO.HIGH)
GPIO.setup(SETTINGS["VALVER"], GPIO.OUT, initial=GPIO.LOW)
time.sleep(3)
GPIO.setup(SETTINGS["VALVER"], GPIO.OUT, initial=GPIO.HIGH)
GPIO.setup(SETTINGS["VALVEL"], GPIO.OUT, initial=GPIO.LOE)
if var.get() == 2:
print('kurz')
def main():
GPIO.setmode(GPIO.BM)
GPIO.setup(SETTINGS["PUMPE"], GPIO.OUT, initial=GPIO.HIGH)
root = tk.Tk()
var = tk.IntVar(root, 2)
tk.Button(root, text="Start", bg="#FFFF00", width=20, command=partial(start, var), indicatoron=0).pack()
tk.Radiobutton(root, text="60min", bg="#FFFF00", width=5, variable=var, value=1, indicatoron=0).pack()
tk.Radiobutton(root, text="30min", bg="#FFFF00", width=5, variable=var, value=2, indicatoron=0).pack()
root.mainloop()
if __name__ == '__main__':
main()
Buttons während schleife betätigen
`import` schreibt man klein, und ein GPIO.LOE gibt es nicht.
GPIO.setup ist für das Setup zuständig, nicht dazu, dass man es statt GPIO.output verwendet.
Wie man so eine Steuerung macht, hängt im wesentlichen davon ab, wie komplex solche Steuerprogramme werden und ob es so etwas wie ein Not-Aus geben sollte, man also Programme mittendrin abbrechen kann und wie dieser Abbruch aussieht.
Der erste Schritt ist also, einen Regelplan aufzumalen, also welche Zustände es gibt, welche Outputs beim jeweiligen Zustand geschaltet sind und wie die Regeln des Übergangs von einem Zustand zum anderen aussieht.
Nächster Schritt ist, diesen Regelplan in passende Datenstrukturen zu gießen und das Programm, das diese Datenstrukturen verarbeitet zu schreiben.
GPIO.setup ist für das Setup zuständig, nicht dazu, dass man es statt GPIO.output verwendet.
Wie man so eine Steuerung macht, hängt im wesentlichen davon ab, wie komplex solche Steuerprogramme werden und ob es so etwas wie ein Not-Aus geben sollte, man also Programme mittendrin abbrechen kann und wie dieser Abbruch aussieht.
Der erste Schritt ist also, einen Regelplan aufzumalen, also welche Zustände es gibt, welche Outputs beim jeweiligen Zustand geschaltet sind und wie die Regeln des Übergangs von einem Zustand zum anderen aussieht.
Nächster Schritt ist, diesen Regelplan in passende Datenstrukturen zu gießen und das Programm, das diese Datenstrukturen verarbeitet zu schreiben.
Code: Alles auswählen
import tkinter as tk
from RPi import GPIO
from functools import partial
SETTINGS = {
"PUMPE": 17,
"VALVEL": 18,
"VALVER": 27,
}
STATES = {
"pumpe_start": {"PUMPE": GPIO.LOW, "VALVEL": GPIO.LOW},
"VALVEL_was_auch_immer": {"VALVEL": GPIO.HIGH, "VALVER": GPIO.LOW},
"VALVEL_irgendwas_anderes": {"VALVEL": GPIO.LOW, "VALVER": GPIO.HIGH},
}
RULES = {
"pumpe_start": ("after", 3000, "VALVEL_was_auch_immer"),
"VALVEL_was_auch_immer": ("after", 3000, "VALVEL_irgendwas_anderes"),
"VALVEL_irgendwas_anderes": ("stop",),
}
def set_state(root, state):
for pin, value in STATES[state].items():
GPIO.output(SETTINGS[pin], value)
rule = RULES[state]
if rule[0] == "after":
root.after(rule[1], set_state, root, rule[2])
elif rule[0] == "stop":
pass
else:
raise AssertionError("unkown rule")
def start(root, var):
if var.get() == 1:
print('mittel')
set_state(root, "pumpe_start")
if var.get() == 2:
print('kurz')
def main():
GPIO.setmode(GPIO.BM)
GPIO.setup(SETTINGS.values(), GPIO.OUT, initial=GPIO.HIGH)
try:
root = tk.Tk()
var = tk.IntVar(root, 2)
tk.Checkbutton(root, text="Start", bg="#FFFF00", width=20, command=partial(start, root, var), indicatoron=0).pack()
tk.Radiobutton(root, text="60min", bg="#FFFF00", width=5, variable=var, value=1, indicatoron=0).pack()
tk.Radiobutton(root, text="30min", bg="#FFFF00", width=5, variable=var, value=2, indicatoron=0).pack()
root.mainloop()
finally:
GPIO.cleanup()
if __name__ == '__main__':
main()