ich baue eine Steuerung Heizung.
Dazu möchte ich gerne ein Zeitfenster festlegen in dem geheizt werden soll.
Das ganze funktioniert auch solange Start- und Endzeit nicht über Mitternacht (00:00) laufen.
Die Zeit kommt aus einem RTC der via DCF77 gestellt wird.
Sobald mein Zeitfenster aber (beispielsweise) von 22:00 bis 07:30 beträgt klappt meine Mathematik im Code nicht mehr. Ich frage mich jetzt was der eleganteste Weg ist das Problem zu lösen. Komme ich mit meinem Code da überhaupt weiter? Muss (sollte) ich da irgendwie mit epoch arbeiten? Gibts für sowas vielleicht schon Funktionen oder Libs?
Die Rechnungen werden wesentlich einfacher, wenn Du alle Zeiten als einfache Werte behandelst, also in Minuten oder Millisekunden.
Ebenfalls einfacher wird eine Behandlung als Startzeit und Dauer, dann kann das Schema von BlinkWithoutDelay verwendet werden, das mit Überläufen klarkommt. Die Zeitumstellung auf den nächsten Tag sollte dann mit den Ereignissen synchronisiert werden, d.h. die aktuelle Zeit wird zurückgesetzt, wenn ein Ereignis am nächsten Tag (>24 Uhr) eingetreten ist.
Deine ZeitfensterAktiv - Logik ist doch schon fast richtig, wenn 1 = aktiv nachts ist, und immer ein Tageswechsel zwischen NachtAnfang und NachtEnde liegt.
Oder hab ich mich vertan?
Mein Weg wäre ebenfalls, die Zeiten in Minuten (o.Ä.) umzurechnen.
Dann hast Du zwei Werte Start und Stop.
Wenn Stop < Start, dann ist eine Nacht dazwischen - die Abfrage wäre aktZeit>=Start || aktZeit<=Stop
Wenn Stop > Start, dann ist das Ende am gleichen Tag - die Abfrage wäre aktZeit>=Start && aktZeit<=Stop
Einziger Unterschied ist das && <-> ||, Welches Dir 'die Zeit dazwischen' bzw. 'die Zeit außerhalb' gibt.
Auch würden dann Deine IFs wesentlich einfacher zu lesen
(vll. ein Kommentar dahinter, was diese 'Magic Number' bedeuten soll, oder die Schaltzeiten global und const deklarieren)
postmaster-ino:
Wenn Stop < Start, dann ist eine Nacht dazwischen - die Abfrage wäre aktZeit>=Start || aktZeit<=Stop
Wenn Stop > Start, dann ist das Ende am gleichen Tag - die Abfrage wäre aktZeit>=Start && aktZeit<=Stop
Einziger Unterschied ist das && <-> ||, Welches Dir 'die Zeit dazwischen' bzw. 'die Zeit außerhalb' gibt.
Vielen Dank! So habe ich es gemacht und habe nun funktionierenden Code - wenn auch keinen schönen
Ob's Da unbedingt ein INT braucht ... lässt durchblicken, daß man sich keine Gedanken dazu gemacht hat.
Ganz nebenbei braucht ein INT zwei Byte Speicherplatz, ein Byte / uint8_t oder boolean nur ein Byte (wobei boolean nur ja/nein aka true/false aufnehmen kann).