Forum: Mikrocontroller und Digitale Elektronik Led-Fading im HSV-Farbraum bringt falsche Farben


von Pete P. (nomispetrus)


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 :)

von Max M. (Gast)


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.

von Georg A. (georga)


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.

: Bearbeitet durch User
von Irgend W. (Firma: egal) (irgendwer)


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

von PittyJ (Gast)


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

von vnnn (Gast)


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.

von Lada-Lader (Gast)


Lesenswert?

Im HSV-Farbraum? Da gibt es doch nur schwarz, weiß und blau....

https://de.wikipedia.org/wiki/Hamburger_SV

von Joachim B. (jar)


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.

: Bearbeitet durch User
von Max M. (Gast)


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.

von Jobst Q. (joquis)


Lesenswert?

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.

von Wolfgang (Gast)


Lesenswert?

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

von Sebastian (Gast)


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

von Wolfgang (Gast)


Angehängte Dateien:

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

von Wolfgang (Gast)


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.

von Pete P. (nomispetrus)


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 :)

von Gerald B. (gerald_b)


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

von Sebastian W. (wangnick)


Angehängte Dateien:

Lesenswert?

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
Noch kein Account? Hier anmelden.