RaspberryPi If Funktion in While Schleife platzieren?

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.

Woher ich das weiß:Berufserfahrung – Let's have some Raspberry PI almost at breakfast ;-)
Frapyard 
Fragesteller
 02.03.2022, 21:33

Ich hatte mir tatsächlich auch schon überlegt mit Crontab zu arbeiten. Vielen Dank!

1
Traveller5712  03.03.2022, 17:48
@Frapyard

Crontab ist der einfachste Mechanismus für zeitgesteurtes Arbeiten bei Linux überhaupt (meiner Ansicht nach).

0
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
Frapyard 
Fragesteller
 02.03.2022, 21:34

Vielen Dank für das gut verständliche Aufschreiben!

0