ESPWortuhr / Multilayout-ESP-Wordclock

Software for an ESP8266 based word clock with support of different layouts and languages
87 stars 46 forks source link

Farbwechsel bei Zeitanzeige #363

Open Feger2 opened 7 months ago

Feger2 commented 7 months ago

Hallo!

Ich finde es ein sehr gelungenes Projekt und Hochachtung vor eurer Arbeit.

Ist es möglich während der normalen Zeitanzeige einen Farbwechsel einzustellen? Ich könnte auch versuchen das selbst einzubauen. Kann mir vielleicht jemand einen Tip geben in welcher Datei ich anfangen muss zu suchen? Der Anfang bei einem fertigen Code ist für mich immer das schlimmste.

mfg Feger

dbambus commented 7 months ago

Hey @Feger2,

Vielen Dank. Für einen Farbwechsel gibt es mehrere Interpretationsmöglichkeiten? Was genau willst du ausprobieren?

Relativ einfach wäre in dem der minütliche Zyklus in der clockwork.hpp eine Modifikation von G.color.H, für Hue, einbauen, damit sich die Farbe minütlich anpasst. Vergiss nicht das parametersChanged Flag auf true zu setzen.

Vielleicht ist das ja genau das, was du suchst :-) minütlich am Farbrad drehen ^^

Mit freundlichen Grüßen David

Feger2 commented 7 months ago

Leider ist das nicht das was ich mir vorstelle. Unter "Funktionen" gibt es ja schon den "Farbwechsel" (schaltet leider alle LEDs ein) Diesen Farbwechsel würde ich gerne in der normalen "Wortuhr" Anzeige anwenden. Ich hoffe ich habe es jetzt verständlicher geschrieben.

mfg Feger

dbambus commented 7 months ago

Ahh okay,

Das ist in der Tat ein interessantes Feature, das ich auch schon mal implementieren wollte, aber die Pipeline ist im Moment zu lang. Aber ich kann gerne bei der Programmierung helfen, wenn du möchtest.

Letztlich ist es eine Kombination aus der Funktion:

setbyFrontMatrix(uint8_t colorPosition, bool applyMirrorAndReverse)in der Led.hpp

und der

rainbowCycle() in der Clockwork.hpp

Versuche dich da mal einzulesen :-)

Mit freundlichen Grüßen David

Feger2 commented 7 months ago

Danke erstmals für deine Tips. Im Moment bin ich mal erschlagen und muss mich erstmal zurecht finden. Mal sehen ob ich es hin bekomme. :-)

Feger2 commented 7 months ago

Hallo! Bis jetzt habe ich es geschafft, das bei den Funktionen "Sekunden", "Laufschrift" und "Symbol" ein Farbwechsel stattfindet. Nur leider leuchten bei der Funktion "Wortuhr" alle 110 LEDs in grün und die Minuten LEDs in der eingestellten Farbe. Die Minuten LEDs per Farbauswahl einstellen, das gefällt mir gut. Kannst du dir erklären warum das so ist?

Folgendes habe ich in der led.hpp (geborgt von void ClockWork::rainbow() :-)) eingetragen:

void Led::setbyFrontMatrix(uint8_t colorPosition, bool applyMirrorAndReverse) {
    static uint16_t hue = 0;

    if (applyMirrorAndReverse) {
        applyMirroringAndReverseIfDefined();
    }

    for (uint8_t row = 0; row < usedUhrType->rowsWordMatrix(); row++) {
        for (uint8_t col = 0; col < usedUhrType->colsWordMatrix(); col++) {

            bool boolSetPixel = usedUhrType->getFrontMatrixPixel(row, col);
            if (colorPosition == Background) {
                boolSetPixel = !boolSetPixel;
            }

            if (boolSetPixel) {
                setPixel(row, col,HsbColor(hue / 360.f, 1.f, G.effectBri / 100.f));
            } else if (colorPosition != Background) {
                clearPixel(usedUhrType->getFrontMatrixIndex(row, col));
            }
        }
    }
    show();
    hue++;
    checkIfHueIsOutOfBound(hue);
}

Bist du sicher das void ClockWork::rainbowCycle() die richtige ist? (ist das nicht die Funktion "Regenbogen"?) Sollte das nicht die void ClockWork::rainbow() sein? (ist das nicht die Funktion "Farbwechsel"?)

Hast du noch einen Tip für mich?

mfg Feger

Feger2 commented 7 months ago

Hallo, Ich bin jetzt einen Schritt weiter. Er macht den Farbwechsel, jedoch sehr langsam. Kann es sein das die Routine Led::setbyFrontMatrix, im Wortuhr Modus, nur alle 5min aufgerufen wird? Wenn ja, dann braucht ein Durchlauf der Farben 60 Stunden. (5min x 360 Farben = 1800min) Kann man das irgendwie ein wenig beschleunigen? (jede Minute oder alle 30s)

Weiters komme ich mit dem Eintrag if (colorPosition == Background) { boolSetPixel = !boolSetPixel; } nicht klar. Wenn ich den drinnen lasse, dann leuchten alle 110 Leds. Wenn ich ihn entferne, dann passt es. Hat sicher was mit der Hintergrundfarbe zu tun, aber das Verhalten kapiere ich nicht.

Weiters habe ich eine Checkbox unterhalb der Checkbox "mit Hintergrundfarbe" eingebaut. Leider habe ich noch Schwierigkeiten, auf den Wert der Checkbox, in der Led.hpp zuzugreifen. Kannst du mir bitte dabei helfen?

mfg Feger

dbambus commented 7 months ago

Hallo @Feger2

Nice, ich bin schon gespannt wie das aussieht :-). In der Tat, die setByFrontMatrix wird nur alle 5 min aufgerufen, da sich auch nur alle 5 min die Front ändert, sofern nicht die Anzeige MinutenInWords aktiviert ist. Aber Anscheinend ist in der Uhrsoftware gerade ein Bug vorhanden und die Uhr zeigt keine Minuten an, oder ?

Bei if (colorPosition == Background) { boolSetPixel = !boolSetPixel; } handelt es sich tatsächlich, um den Code speziell für die Hintergrundfarbe. Hier sollen nämlich beim Funktionsaufruf setByFrontMatrix(Background) nur alle LEDs leuchten, welche nicht in der Frontmatrix definiert sind.

Weiters habe ich eine Checkbox unterhalb der Checkbox "mit Hintergrundfarbe" eingebaut.

Leider habe ich noch Schwierigkeiten, auf den Wert der Checkbox, in der Led.hpp zuzugreifen. Kannst du mir bitte dabei helfen?

Da kann ich dir gerne helfen :-) ich suche die Tage mal alles zusammen :-)

Feger2 commented 7 months ago

Ich glaube die Led::setbyFrontMatrix ist der falsche Ansatz.

Klingt relativ einfach, aber ich habe noch Schwierigkeiten zu den erforderlichen Werten und Variablen zu kommen. Der Code ist für mich nicht leicht zu interpretieren. Was hälst du davon?

Gibt es in der Platformio die Möglichkeit den Code laufen zu lassen (Debug), damit man auch sieht was in den Variablen steht? mfg Feger

dbambus commented 6 months ago

Hallo @Feger2,

leider gibt es keine einfache Möglichkeit einen GDB mit dem ESP8266 zu realisieren. Besser wäre ein Port für den ESP32 oder RP2040 ^^, aber das dürfte auch ein großer Aufwand sein.

Vorerst bleibt nur die Möglichkeit Serial.println() gezielt einzufügen und im Serial Monitor zu beobachten.

Nun. Es gibt etwas ähnliches wie das von dir vorgeschlagene autocolorchangeinterval = 30, nämlich die demo bei der Transition. man müsste mal sehen, ob man das verwenden kann.

Wie hast du dir den Code vorgestellt, soll der Farbwechsel der Uhr kontinuierlich erfolgen? also immer? Oder nur wenn die Anzeige wechselt?

Ich werde deinen Code mal in einen Entwicklungszweig bei mir aufnehmen. Irgendwie habe ich gerade Zeit gefunden mich dem Projekt zu widmen.

Liebe Grüße David

Feger2 commented 6 months ago

Hallo!

Wie hast du dir den Code vorgestellt, soll der Farbwechsel der Uhr kontinuierlich erfolgen? also immer? Oder nur wenn die Anzeige wechselt?

Ich hätte gerne den Farbwechsel kontinuierlich. Der HSV Farbraum geht ja von 0 bis 360°, also z.b. alle 10 Sekunden +1° So habe ich es momentan, aber es treten dabei leichte Probleme auf:

mfg Feger

dbambus commented 6 months ago

Hallo @Feger2,

In der Tat ist es notwendig, alle 60/x s eine Nebenläufigkeit einzuführen. Dazu könnte man einen Zähler in der clockwork.hpp jede Sekunde inkrementieren und ab einem Schwellwert eine Aktion ausführen und den Zähler zurücksetzen.

Ich habe schon eine Idee, woher das Flackern kommt. Möglicherweise wird die Aktion setbyFrontMatrix() zweimal ausgeführt, was zu dem beschriebenen Flackern führt. Das muss ich aber noch genauer untersuchen.

Das mit dem Speichern des Häkchens muss ich mir nochmal genauer anschauen, das weiß ich nicht aus dem Kopf.

Ich hoffe nur, dass ich bald wieder einen freien Tag zum Coden habe :-)

Mit freundlichen Grüßen David