Hallo,
ich versuche einen RGB Wert in seine Farben zu zerlegen und später wieder zusammen zu setzen.
Der tiefer Sinn dahinter ist, dass ich einen Gradient von einer Farbe zu einer anderen programmieren will.
Das Zerlegen klappt, nur verstehe ich nicht warum er die Werte falsch zusammen setzt Das erste Byte ist immer FF. Wenn ich die einzelnen Farben verändere wird es ganz komisch.
Analoges Vorgehen auf einen Linux funktioniert.
Hat jemand eine idee ?
// Pseudocode
#define COLOR1 0XAABBCC
byte r = (COLOR1 >> 16) & 0XFF;
byte g = (COLOR1 >> 8) & 0XFF;
byte b = (COLOR1) & 0XFF;
Serial.println(r,HEX); // prints: AA
Serial.println(g,HEX); // prints: BB
Serial.println(b,HEX); // prints: CC
Serial.println(COLOR1,HEX); // prints: AABBCC
// so far so good but: <FF>?
Serial.print("0X");Serial.println((r << 16 | g << 8| b),HEX); // prints 0XFFBBCC
Ich verstehe noch nicht wieso Du eine Variable brauchst die die RGB werte speichert und Du nicht 3 Variablen oder ein Array mit 3 Elementen nimmst.
Grüße Uwe
uwefed:
Ich verstehe noch nicht wieso Du eine Variable brauchst die die RGB werte speichert und Du nicht 3 Variablen oder ein Array mit 3 Elementen nimmst.
irgendwie stehst du auf dem Schlauch.
Sein kompletter Farbwert steht in einer großen Variablen, zum speziellen manipulieren muss er sie kurz zerlegen und dann wieder zusammensetzen. Ich sehe dabei keinen Widerspruch.
Doc_Arduino:
Sein kompletter Farbwert steht in einer großen Variablen, zum speziellen manipulieren muss er sie kurz zerlegen und dann wieder zusammensetzen. Ich sehe dabei keinen Widerspruch.
Das ist mir bewußt.
Wenn er aber statt eines unsigned long 3 byte Variablen verwendet dann spart er sich:
1.) 1 Byte
2.) das zerlegen und zusammensetzen.
Ist natürlich nur zur Berechnung sinnvoll, nicht direkt als Array für z.B. FASTLed.
Hinzugefügt: Die Reihenfolge der Farbbytes im Speicher ist von der Endianness der Systems abhängig,
bei AVRs ist das little endian, also die niederwertigsten Bytes zuerst.
achso, ich vermute das er eine Lib oder ähnliches verwendet die mit einem kompletten RGB Farbwert arbeitet und sendet. Vielleicht sagt uns demwz noch etwas zu den Details, manchmal ergibt sich für den TO dabei erstaunlich neues, wie bei mir selbst neulich.
Jetzt haben sich schon zwei Leute dazwischen gemogelt
Ich lasse meine Gedanken so stehen, auch wenn es nicht mehr ganz 100% zu der Antwortreihenfolge passt.
Auf union hätte ich auch später angespielt wenn es zu seinem Code passen könnte. Wenn er den Farbwert ohne Lib selbst erstellt.
Ja, warten wir was der TO genau machen will.
Oft haben die TO genaue Ideen wie was gemacht werden kann, sind sich aber nicht bewußt daß es auch andere, bessere Lösungswege geben kann als die gedachten. Wenn der TO mehr Infos gibt dann können wir ihm unter Umständen bessere Lösungen als seinen eingeschlagenen Weg zeigen.
Grüße Uwe
Wenn man etwas mit Farben "inhaltlich" machen will - z.B. einen Gradienten berechnen - verwendet man besser das Farbmodell HSV bzw. HSL (hue = Farbe, saturation = Sättigung, value/luminance = Intensität). Damit hat man nämlich z.B. die eigentliche "Farbe" als solche getrennt von den anderen Werten. RGB ist dagegen ein sog. "Mischfarbmodell"; wo jedes mit jedem äusserst unpraktisch zusammenhängt.
H läuft dann von 0 - 359 (Farbkreis Rot - Gelb -Grün - Cyan - Blau - Magenta - Rot), während S die "Reinheit" beschreibt, im Idealfall bei 100% nur eine einzige Wellenlänge. V bzw. L ist schlicht die Lichtmenge. So kann man wunderbar die Werte einzeln und unabhängig verändern.
Natürlich benötigt man "am Ende" wieder RGB, um die eintsprechenden LEDs technisch anzusteuern.