Hallo alle zusammen, Ich habe mir eine Uhr gebaut, mit einem ESP8266 und WS2812B. Die LEDs sind in 4 Digits als 7-Segment Anzeigen aufgeteilt. Nun möchte ich fürs Auge noch weiche Übergänge zwischen den angezeigten Zahlen (oder Buchstaben) programmieren. Die anzuzeigenden „Bilder“ habe ich im HSV-Farbraum im Ram vorliegen, da im HSV die Fade- und Blendvorgänge einfacher zu Berechnen sind. Hierbei bin ich jedoch auf ein Problem gestoßen: die LEDs können sich ja in der Farbe oder der Helligkeit ändern, Weil beispielsweise eine neue Farbe gesetzt wurde, sich der Farbverlauf ändert oder die LED einfach an- oder ausgeschalten wird. Ich habe also einfach für jede LED die Differenzen von Hühner, Saturation iund Value genommen und überblendet. Jedoch klappt das überblenden nicht ordentlich, für zB weiß als h0 s0 und v255 definiert ist. Wenn ich jetzt von einer anderen Farbe nach weiß Überblende dreht auch die Farbe auf dem Farbrad und zusätzlich werd die Farbe blass anstatt einfach langsam weißer zu werden. LED aus ist h0 s0 v0, die LED wird also von Start-Farbe rot und gleichzeitig dunkler. LED hochdimmen von vorher ausgeschalten startet bei weiß, weil s=0. Es gibt viele komische Effekte. Wie macht ihr sowas? Habt ihr sowas schonmal umgesetzt? Ich stehe hier irgendwie gerade völlig auf dem Schlauch und freue mich über Tipps… Vielen Dank :)
Pete P. schrieb: > Wie macht ihr sowas? Habt ihr sowas schonmal umgesetzt? Das werden in dieser Detailtiefe nicht viele gemacht haben. Farbraumkonvertierung ist nicht so easy. Die Led kann bei weitem nicht das darstellen was Dein HSV Farbraum darstellen kann. Wir haben das mit eng selektierten einzel Leds und präzisen Stromquellen gemacht und mussten ziemlich würgen damit das irgendwie nett aussah. Trotz sündhaft teurer Selektion und 10bit Auflösung sah man Farbunterschiede, weil ja drei Leds kombiniert werden die alle in Intensität und Farbort driften. Bevor Du also alles in Frage stellst was Dein Algorithmus macht, ziehe in Betracht das die WS2812B weder vernünftig selektiert sind, noch eine hochwertige Konstantstromquelle verwenden. Du gibts zwar die PWM Werte vor, aber verlass dich nicht drauf das die annähernd linear wiedergegeben werden.
Das wird ganz langweilig gleichzeitig auf allen drei Kanälen (HSV) gleichzeitig auf die Zielwerte interpoliert, das muss komisch "rumrotieren". Du könntest selbst abhängig von dem gewünschten Übergang (da gibts ja verschiedene Möglichkeiten) die Werte einzeln ändern (oder mindestens HV/S) und abwarten, bis das jeweils durch ist.
:
Bearbeitet durch User
Umrechnungstabelle HSV nach RGB erstellen und dabei ggf. gleich noch ein paar Korrekturwerte für deine konkreten LED mit "einbauen". Für jeden HSV-Wert dann diese Tabelle durchsuchen und erst mit den dadurch ermittelten RGB-Wert die LED ansteuern. Du hast ja pro Farbe nur 256 Stufen und die sind auch nicht unbedingt exakt gleichmäßig von der wahrgenommenen Helligkeit her. Noch dazu reagiert der Mensch auch noch unterschiedlich auf die verschiedenen Farben/Farbanteile...
Hm, ich verstehe das Problem nicht so ganz. H,S und V werden mit der gewünschten Schrittbreite interpoliert. Aus HSV (wir ignorieren mal den ultraschlechten Zweitligaverein) wird RGB berechnet und an die LED übertragen. Umrechnungen findet man über Google, z.B. diese hier: https://stackoverflow.com/questions/3018313/algorithm-to-convert-rgb-to-hsv-and-hsv-to-rgb-in-range-0-255-for-both
Pete P. schrieb: > Jedoch klappt das > überblenden nicht ordentlich, für zB weiß als h0 s0 und v255 definiert > ist. Wenn ich jetzt von einer anderen Farbe nach weiß Überblende dreht > auch die Farbe auf dem Farbrad und zusätzlich werd die Farbe blass > anstatt einfach langsam weißer zu werden. Der Trick ist, "weiß" als S0 V255 zu definieren und H unangetastet zu lassen. Pete P. schrieb: > LED aus ist h0 s0 v0, die LED wird also von Start-Farbe rot und > gleichzeitig dunkler. Selbiges: H nicht antasten.
Im HSV-Farbraum? Da gibt es doch nur schwarz, weiß und blau.... https://de.wikipedia.org/wiki/Hamburger_SV
Pete P. schrieb: > für zB weiß definiere erst mal dein weiss, meine Versuche mit RGB 255 255 255 ergaben ein ziemliches Kaltweiss, wenn ich wärmeres weiß wollte musste ich blau zurücknehmen und gedimmt siehts noch mal übler aus. Gedimmt blieb aus weiss nur Müll übrig weil die LED unselektiert auf meinen billigen Stripes waren. Es gibt eine WS2812B RGB zu HSV (und zurück) Konvertierung die ich aber nie austestete. https://esp-idf-lib.readthedocs.io/en/latest/groups/color.html https://www.instructables.com/Single-Pot-RGB-WS2812B-Neopixel-Color-Change-With-/ https://gist.github.com/Tejkaran/6529577e4fa939392fc563d0a5eb4b78 uvam.
:
Bearbeitet durch User
Joachim B. schrieb: > Gedimmt > blieb aus weiss nur Müll übrig weil die LED unselektiert auf meinen > billigen Stripes waren. Das ist meist das Problem. Man hat da drei LEDs drauf die in allen Kombinationen +-X in der Helligkeit driften und +-Y im Farbort. Geht man in eine kräftige Farbe, sieht man das wenig, weil das Auge für Helligkeitsunterschiede relativ unempfindlich ist. Weiß ist die Königsdisziplin mit RGB LEDs. Die eine ist bläulich, die daneben grünlich, die daneben rötlich, violett, braun, gelb etc. pp. Das sieht aus wie ne Zirkusbeleuchtung aber nicht wie hochwertiges Licht. Der Ausweg ist viel Geld in LEDs und Ansteuerung zu packen und Chargenbezogen eine SW Abstimmung zu machen. Selbst dann sehen unterschiedliche Chargen nie gleich aus und auch innerhalb einer Charge gibts deutlich sichtbare Unterschiede. Bei der WS2812B werden die RGB Chips so reingewürfelt wie die aus der Maschine kommen, garniert mit drei möglichst billigen Stromquelle die zueinander heftig driften.
Pete P. schrieb: > Jedoch klappt das > überblenden nicht ordentlich, für zB weiß als h0 s0 und v255 definiert > ist. Hue ist für Weiß im HSV-Farbraum undefiniert. Alle Kombinationen von Saturation 0 und Value 255 ergeben weiß. Also h so lassen wie es ist, s nach 0 und v nach 255 dimmen.
Jobst Q. schrieb: > Hue ist für Weiß im HSV-Farbraum undefiniert. Anders ausgedrückt, der Wert von Hue spielt für Weiß keine Rolle, genauso wie es sinnfrei ist, bei einem Standort am Nordpol über den Längengrad zu diskutieren.😉
Jobst Q. schrieb: > Also h so lassen wie es ist, s nach 0 und v nach 255 dimmen. Gut und schön. Aber wie kommt man von H=128 S=255 V=128 nach H=0 S=255 V=254? Oder nach V=250? Es reicht doch nicht, einfach nur die Sonderfälle Weiss und Schwarz separat zu behandeln; das Problem tritt doch auch schon bei Cremeweiss und Dunkelstgrau auf! LG, Sebastian
Sebastian schrieb: > Aber wie kommt man von H=128 S=255 V=128 nach H=0 S=255 > V=254? S=255 bedeutet volle Sättigung, also solltest du dich auch nur bei S=255 bewegen, d.h. auf der Außenwand des Zylinders in obiger Farbraumdarstellung. Gleichzeitig willst du die Helligkeit von 127 auf 254 (wieso nicht 255) steigen lassen. Das bedeutet eine halbe Spiralwindung von H=128, V=128 auf die gegenüberliegende Seite des Zylinders (H=0) bei V=254. https://de.wikipedia.org/wiki/HSV-Farbraum#Modelle
p.s. Ersetze das "solltest" durch "könntest". Ein Weg durch die Zylinderachse ist natürlich auch eine Möglichkeit, also bei H=128 bleiben und S von 255 auf 0 fahren (gleichzeitig V von 128 auf 196) und dann für die zweiten Hälfte H auf 0 setzen, S von 0 auf 255 hochfahren und parallel V von 196 auf 254. Viele Wege führen nach Rom und es kommt drauf an, was du möchtest.
Vielen Dank für eure Antworten. Also, ich habe nun tatsächlich einfach die Sonderfälle abgefangen. Bei allen anderen Änderungen sind es meist nicht so große Abstände, da fällt eine geringe Änderung optisch nicht auf. Funktioniert (rein optisch für mich) ziemlich gut. Da es nur eine Uhr ist, ist mir Farbtreue hier natürlich nicht sonderlich wichtig, es soll ja nur schön aussehen und nicht superperfekt alle Farben wiederspiegeln. Also danke :)
Zur nur relativ bedingten Eignung der WS2812 wurde ja schon einiges geschrieben. Es gibt im selben Gehäuse, ebenfalls als Stripes SK2812 mit RGBW die 4. Komponente weiß gibt es in warmweiß, neutralweiß und kaltweiß. Die Arduino Lib kennt die SK2812 ebenfalls. Ansonsten gibt es noch einige andere Typen, die mehr als 8 Bit pro Farbe Auflösung haben. APA irgendwas...
Wolfgang schrieb: > Viele Wege führen nach Rom und es kommt drauf an, was du möchtest. Hier https://observablehq.com/@d3/working-with-color kann man verschiedene Interpolationsalgorithmen ausprobieren ... LG, Sebastian
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.