Wie Farbwechsel einer RGB Led in einer Uhr jeden Monat realisieren?

Ich steh bei einem Logikproblem auf dem berühmten Schlauch :confused:

Zum Verständnis:
Eigenbau Uhr mit einem ESP Modul
Daran ist eine rgb led verbaut. Diese soll jeden Monat die Farbe wechseln.
Die Uhr holt die Zeit und Datum bei jedem einschalten von einem NTP und aktualisiert damit das RTC Modul
Die Uhr wird mit einem Netzzeil betrieben. Das Netzteil kann mehrmals täglich vom Strom getrennt sein. Die Uhr ist dann also komplett stromlos.

Eigentlich wäre das sehr einfach jeden 1. im Monat die LED Farbe zu ändern:
Bei jedem Start der Uhr wird abgefragt ob heute der 1. im Monat ist. Wenn ja,
dann wird die Farbe gewechselt. Wenn nein, dann passiert nichts.

Hierbei ist das Problem:
Wenn die Uhr am 1. ausgeschaltet wird und später wieder an, dann ist immer noch der 1.
und die Uhr würde die Farbe ein weiteres mal an gleichen Tag wechseln. Bei jedem
einschalten am 1.

Daher müsste eine bool Kontrollvariable her. Woran man feststellt ob die Led Farbe bereits
gewechselt wurde oder nicht.
Bei jedem Start der Uhr wird eine Textdatei gelesen in der einfach nur true oder false steht.

Wenn heute der 1. und false, dann wechsle Led Farbe und schreibe true in datei.
oder
Wenn heute der 1. und true, dann mache nichts
und
Wenn heute > 1. und true, dann schreibe false in datei. Damit am nächsten 1. wieder der Farbwechsel statt findet.

Hierbei das Problem:
Wenn die Uhr am 1. nicht eingeschaltet wird, dann wird der nächste Farbwechsel erst im kommenden Monat gemacht. Und es war zwei Monate die gleiche Farbe eingestellt.
Klar könnte man sagen, macht doch nichts. Aber ich denke es müsste eine Logik geben die auch das berücksichtigt.
Ich komme nur nicht drauf.

Ich glaube mein Fehler liegt darin das ich den 1. abfrage.
Besser wäre vielleicht:
Wenn heute >= der 1. ist und false geladen wurde, dann wechsel Farbe und schreibe true in Datei
wenn heute >= der 1. ist und true geladen wurde, dann mache nichts.

Hierbei das Problem:
Ich müsste dann irgend wann wieder false in die Datei schreiben, damit im nächsten Monat wieder ein Farbwechsel statt findet. Theoretisch könnte ich das ab dem 15. eines Monats machen. und vorher >= 1 && < 14
Das wäre notfalls ein Kompromiss.

Vielleicht gibt es auch einen komplett anderen Ansatz.
Daher meine Frage an euch, habt ihr eine Idee wie die Uhr auf jeden Fall einmal
im Monat die Farbe wechselt?

Du brauchst nur den Wechsel vom alten in den neuen Monat zu prüfen und schreibst den tatsächlichen Wert ins EEprom bzw. FS des ESP8266.
Beim Neustart abfragen.

So ist das wenn man auf dem Schlauch steht. Festgefahrene Denkweise.
Hab es aber schon befürchtet das die Lösung bestimmt ganz einfach ist, ich nur nicht drauf komme :confused:

Danke für deine Hilfe.

modi0:
Danke für deine Hilfe.

Alles klar, gerne.

Noch einfacher ist es ein Tabelle mit den Farbwerten zu definieren und die Farbe nach dem Monat auszuwählen.

Einfach ein Array mit 12 Elementen und als Index den Monat. Eventuell auch ein 2-dimensionales Array 12 x n mit mehreren Werten für n verschiedene LED.

Falls 12 Farben zu wenig sind dann errechne aus den Monat und dem Tag eine Zahl. Anhand der die Farbe gewählt wird. zB ( Monat * 30 + Tag ) / 15 ergibt annäherungsweise 25 Farben.

Grüße Uwe

Die Abfrage ob der Monat gewechselt hat ist sehr einfach.
Das mit den Farben im Array mache ich aber auch, da sind 12 vordefinierte Farben enthalten. Wollte keine rein zufällig generierten Farben verwenden.

Ich verstehe jetzt nicht Deine Antwort.

Du brauchst keine Kontrolle ob ein Monat gewechselt hat sondern einfach den Monat als Index der Farbvariablen verwenden.

AktuelleFarbe = FarbTabelle[Monat];

Grüße Uwe

uwefed:
Du brauchst keine Kontrolle ob ein Monat gewechselt hat sondern einfach den Monat als Index der Farbvariablen verwenden.

AktuelleFarbe = FarbTabelle[Monat];

Oder als enum.
Da Tommy auch schon Lesestoff von da anbot:
http://www.willemer.de/informatik/cpp/enum.htm

:wink:

uwefed:
Du brauchst keine Kontrolle ob ein Monat gewechselt hat sondern einfach den Monat als Index der Farbvariablen verwenden.

AktuelleFarbe = FarbTabelle[Monat];

Grüße Uwe

Prima, das ist ja noch einfacher und man braucht auch nix zusätzlich speichern.

uwefed:
Ich verstehe jetzt nicht Deine Antwort.

Du brauchst keine Kontrolle ob ein Monat gewechselt hat sondern einfach den Monat als Index der Farbvariablen verwenden.

AktuelleFarbe = FarbTabelle[Monat];

Grüße Uwe

Sorry, hatte das falsch verstanden.

Danke für Tipp. Werde ich so machen :slight_smile:

AktuelleFarbe = FarbTabelle[Monat];

Wäre höchstens noch zu bedenken, dass Arrays immer mit Index 0 anfangen, Zahlen für Monate aber gerne bei 1.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.