Led-Fading im HSV-Farbraum bringt falsche Farben

OP #7246102
Lesenswert?

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 :)
Gast #7246107
Lesenswert?

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.
#7246120
Lesenswert?

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.
(Firma: egal) #7246130
Lesenswert?

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...
Gast #7246158
Lesenswert?

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
Gast #7246177
Lesenswert?

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.
#7246360
Lesenswert?

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.
Gast #7246432
Lesenswert?

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.
Gast #7247051
Lesenswert?

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
Gast #7247088
Lesenswert?

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
Angehängte Dateien:
Gast #7247139
Lesenswert?

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.
OP #7247606
Lesenswert?

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 :)
#7247668
Lesenswert?

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...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren