Zeitschaltuhr Schaltet zur falschen Zeit

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
ThingsandStuffYT
User
Beiträge: 1
Registriert: Donnerstag 1. September 2022, 10:23

Hi, ich versuche in meiner While True Schleife einen Tagesablauf zu machen. Allerdings Scheint eine Schleife mehr als 24h zu sein. Deswegen gehen die LEDs nicht zur richtigen Zeit an/aus. Die Zeit vor dem Loop ist nur dafür da, dass ich den Pico nicht um 0 Uhr einstecken muss. Ich hoffe Ihr könnt mir weiterhelfen, hier mein Code auf dem Pi Pico.

Code: Alles auswählen

import machine
import utime
from machine import Pin
from time import sleep

Lights = Pin(19, machine.Pin.OUT)
Water = machine.Pin(18, machine.Pin.OUT)
Day = 0
Time = 0

def WateringDWS():
    Water.value(1) 
    utime.sleep(10) 
    Water.value(0)
    
def Lights_on():
    Lights.value(0)
    
def Lights_off():
    Lights.value(1)
    
def Wait_hours(Hours):
    global hours_to_wait
    hours_to_wait = 0
    while hours_to_wait <= Hours:
        hours_to_wait += 1
        utime.sleep(3600)
        global Time
        Time += 1
Lights_on()
Wait_hours(11) #7 to 18 O Clock
Lights_off()
Wait_hours(6)
while True:
    Day += 1
    Time = 0
    Wait_hours(4) #0 to 4 O Clock
    Lights_on() #Works like a Switch
    #if Day % 1 == 0:
    Wait_hours(18) #7 to 22 O Clock
    Lights_off()
        
    Wait_hours(2) #22 to 24 O Clock
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Der Code benutzt sinnlos globale Variablen wie hours_to_wait und Time. Ersteres waere sogar einfacher lokal, und letzteres wird eh nicht genutzt. Es gibt auch garkeinen Grund, zwischendurch aufzuwachen, wenn man sich dann sofort wieder schlafen legt. 3600 * hours to wait, und einmal sleep. Dann spart man sich auch die falsch programmierte while-Schleife, die fuer 4 gegebene Stunden 5 mal wartet. Statt while wuerde ein

Code: Alles auswählen

for _ in range(hour):
hier das richtige tun, aber wie gesagt: kein Grund, das so zu machen.

Aber eigentlich will man fuer sowas mindestens eine Batterie-gepufferte Echtzeituhr, oder besser noch WLAN + NTP, damit man eine korrekte Zeitplanung umsetzen kann.
Benutzeravatar
__blackjack__
User
Beiträge: 14078
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

`sleep()` aus `time` wird importiert, aber nirgends verwendet.

`Pin` wird sowohl über `machine` angesprochen als auch direkt importiert und verwendet. Warum? Das sollte einheitlich sein.

Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassennamen (PascalCase).

`lights_on()` und `lights_off()` sind als Funktionen etwas übertrieben, weil `Pin`-Objekte ja eine `on()`- und eine `off()`-Methode besitzen.

Der Code sähe dann so aus:

Code: Alles auswählen

#!/usr/bin/env python3
import utime
from machine import Pin


def wait_hours(hours):
    utime.sleep(hours * 3600)


def main():
    lights = Pin(19, Pin.OUT)
    lights.on()
    wait_hours(11)  # 7 to 18 O Clock
    lights.off()
    wait_hours(6)
    while True:
        wait_hours(4)  # 0 to 4 O Clock
        lights.on()
        wait_hours(18)  # 7 to 22 O Clock
        lights.off()
        wait_hours(2)  # 22 to 24 O Clock


if __name__ == "__main__":
    main()
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten