2 Relais mit Zeit steuern

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
Oggy
User
Beiträge: 3
Registriert: Donnerstag 20. September 2018, 14:27

Guten Tag,
ich würde gerne zwei Schlauchpumpen die über zwei Relais vom Raspberry Pi gesteuert werden über ein Benutzerobfläche steuern.
z.B. Button 1 Relai 1 für 30 sec an. Relai 2 für 1 Minute an.
Danke schon mal für die Hilfe.
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Und was ist jetzt die Frage? So allgemein kann man da jetzt nur sagen, dass Du Dich ziemlich sicher mit objektorientierter Programmierung auseinandersetzen musst, und mit der Eigenart von den allermeisten GUI-Rahmenwerken, dass man a) selbst nichts längerfristiges laufen lassen darf, weil solange der eigene Code läuft, die GUI einfriert, und man sich b) deshalb mit der einen oder anderen Art von nebenläufiger Programmierung herumschlagen muss. Also entweder ereignisbasiert über die Mittel die vom GUI-Rahmenwerk zur Verfügung gestellt werden, oder mit `threading` und das dann wieder mit dem Problem das die meisten GUI-Rahmenwerke allgemein nicht thread-sicher sind.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Oggy
User
Beiträge: 3
Registriert: Donnerstag 20. September 2018, 14:27

Wenn ich Programm so schreiben würde und für jeden Button die Zeiten Anpassen würde müsste es ja eigentlich klappen?
import tkinter
import time
import RPi.GPIO as gp

def Test():#Test 0,5
gp.setmode(gp.BCM)
gp.setwarnings (False)
gp.setup(6,gp.OUT)#Wasser
gp.setup(5,gp.OUT)#Wein

gp.output(6, gp.LOW)
time.sleep (10)
gp.output (6,gp.HIGH)
gp.output(5, gp.LOW)
time.sleep (20)
gp.output (5,gp.HIGH)

gp.cleanup()
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Nein, eben nicht. Solange diese Funktion läuft ist die GUI eingefroren und reagiert auf nichts. Man darf bei den Rückruffunktionen nur Code haben der relativ kurz läuft und dann die Kontrolle wieder an die GUI-Hauptschleife zurück gibt. In diesem Fall könnte man sich noch etwas mit der `after()`-Methode auf Widgets basteln, in dem man die Wartezeiten dadurch ersetzt und die Schaltvorgänge und Zeiten als Daten kodiert, die dann mit mehreren Aufrufen abgearbeitet werden.

Der ``setwarnings(False)``-Aufruf sollte da nicht sein. Die Warnungen sind nicht zum ignorieren da, sondern damit man die zugrundeliegende Quelle beseitigt. Üblicherweise ist das das `cleanup()` was nicht aufgerufen wird. Das sollte zum Beispiel in einem ``finally``-Block stehen, damit es auch aufgerufen wird, wenn das Programm durch eine Ausnahme beendet wird.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Antworten