RaspberryPi If Funktion in While Schleife platzieren?
Moin moin,
Ich arbeite mich gerade in einen RaspberryPi ein und habe dabei nur sehr begrenzte Erfahrungen.
Ich möchte aktuell einen infinite Loop laufen lassen, bei dem eine gewisse Aktion mit timern in gewissen Abständen wiederholt wird und will zusätzlich die Aktion auch mit benutzen eines Tasters jederzeit ausführen.
Im Anhang ist mein aktueller Code dazu (bedenkt, ich bin ein absoluter Anfänger). Nur fürs Beispiel nochmal im Notepad++ geschrieben, der richtige ist natürlich auf dem Raspberry.
Ich verstehe auf jeden Fall, wo das Problem liegt. Meine If Funktion wird immer nur an einer Stelle im loop abgefragt und daher muss in diesem Fall der Taster immer genau in diesem Moment gedrückt sein (also genau wenn die LED wieder an geht), damit das ganze ausgeführt wird. Ich verstehe nur nicht, wo ich meine If Funktion richtig platziere, oder wie ich das ganze anders lösen könnte.
Vielen Dank im Vorraus für eure Hilfe!
2 Antworten
In Sachen "Timer" kann ich Dir eigentlich nur den Einsatz des Linux Befehls cron bzw. der Crontab empfehlen.
Ein Script im Hintergrund laufen zu lassen, welches den Zustand eines GPIO-Pins abfragt, ist ja kein Thema.
Aber eine Zeitgesteuerte Ausführung von Scripten sollte man besser dem Betriebssystem selbst überlassen. Die Crontab bietet Dir dazu eine Vielzahl an gut dokumentierten Möglichkeiten.
Ich kenne Deinen Einsatzzweck nicht, es klingt aber wie eine Zeitschaltuhr, bei der man den ein/auszuschaltenenen Gegensand noch manuell einschalten kann. Habe ich bei mir Zuhause mittels einer Siemens LOGO SPS gelöst. Aber kann man auch per PI machen keine Frage ;-) Nur hatte ich zu dem Zeiptunkt tatsächlich noch keine PI-Erfahrung. Ausserdem habe ich alles auf 230V Basis laufen. Da ist der PI nicht wirklich gut geeignet.
Crontab ist der einfachste Mechanismus für zeitgesteurtes Arbeiten bei Linux überhaupt (meiner Ansicht nach).
from gpiozero import Button, LED
import time
(...)
#Eine Zählervariable für die An-Zeit, die andere für die Aus-Zeit
timer_on, timer_off = 0, 0
#Je eine Variable (de-facto-Konstante) für die An-/Aus-Dauer
interval_on, interval_off = 30, 1
#Der Messungszeitraum. Je kleiner desto genauer, dafür aber umso rechenintensiver.
tick = 0.1
#Ein Flag um den aktuellen Zustand zu speichern
is_on = False
while True:
#Einen Tick lang warten
time.sleep(tick)
#Wenn der aktuelle Zustand nicht An ist...
if not is_on:
#... den Zähler für An um einen Tick erhöhen
timer_on += tick
#Wenn ausreichend Zeit vergangen ist...
if timer_on >= interval:
#Den Zeitzähler zurücksetzen
timer_on = 0
#Die LED einschalten
led.on()
#Das Zustandsflag setzen
is_on = True
#Ansonsten, falls der Knopf gedrückt ist...
elif button.is_pressed:
#Das gleiche in grün, nur dass der Zeitzähler nicht zurückgesetzt wird.
timer_off = 0
led.on()
is_on = True
#Der Rest dürfte mit den Erkenntnissen aus dem vorherigen Code und den Kommentaren soweit verständlich sein.
else:
timer_off += tick
if timer_off >= interval_off:
timer_off = 0
led.off()
is_on = False
Ich hatte mir tatsächlich auch schon überlegt mit Crontab zu arbeiten. Vielen Dank!