HSV to RGB mit WS2812 LEDs

HSV to RGB mit WS2812 LED

 

Für die Umwandlung von HSV (englisch: hue, value, saturation) zu RGB (red, green, blue) findet man im Internet eine Berechnungsmatrix. Die Funktion der Berechnungsmatrix erschließt sich dem Anwender meistens nicht auf den ersten Blick. In meinem Beispiel errechne ich alle Werte einzeln. Dabei steht die Variable h für hue (Farbe), s für saturation (Sättigung) und v für value (Dunkelstufe). RGB steht für die drei Farbkanäle Rot, Grün und Blau. Die drei Kanäle steuern mit einer 8 Bit PWM (Pulsweitenmodulation) eine RGB LED an. Bei 8 Bit entspricht das den Wertebereich von 0 bis 255.

h: kann einen Wert von 0 - 359 annehmen (Farbwinkel 0° für Rot, 120° für Grün sowie 240° für Blau)

s: in Prozent, 0% entspricht Neutralgrau und 100% entspricht gesättigt (also die reine Farbe)

v: in Prozent, 0% keine Helligkeit und 100% volle Helligkeit

Den Source Code gibt es wie immer am Ende des Artikels, als Download sowie den WS2812 RGB LED Ring als Layout. Die Software läuft auf einen ATmega 328. Der Datenausgang ist PIN D.6 für den WS2812 Ring.

Berechnung des Farbwertes (englisch hue):


RGB HSV Farbverlauf

 

Berechnung des Farbwertes
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
		//Winkel im Farbkeis 0 - 360 in 1 Grad Schritten
		//h = (englisch hue) Farbwert
		//1 Grad Schrittweite, 4.25 Steigung pro Schritt bei 60 Grad
		if(h<61){
			*r = 255;
			*b = 0;
			*g = 4.25 * h;
		}else if(h < 121){
			*g = 255;
			*b = 0;
			*r = 255 - (4.25 * (h-60));
		}else if(h < 181){
			*r = 0;
			*g = 255;
			*b = 4.25 * (h-120);
		}else if(h < 241){
			*r = 0;
			*b = 255;
			*g = 255 - (4.25 * (h-180));
		}else if(h < 301){
			*g = 0;
			*b = 255;
			*r = 4.25 * (h-240);
		}else if(h< 360){
			*r = 255;
			*g = 0;
			*b = 255 - (4.25 * (h-300));
		}	

 

Berechnung der Farbsättigung (englisch saturation):

 

Farbsättigung

Berechnung der Farbsättigung
78
79
80
81
82
83
84
85
86
		//Berechnung der Farbsättigung
		//s = (englisch saturation) Farbsättigung
		s = 100 - s; //Kehrwert berechnen
		diff = ((255 - *r) * s)/100;
		*r = *r + diff;
		diff = ((255 - *g) * s)/100;
		*g = *g + diff;
		diff = ((255 - *b) * s)/100;
		*b = *b + diff;

 

Berechnung der Dunkelstufe (value):

 

Berechnung der Dunkelstufe
88
89
90
91
92
		//Berechnung der Dunkelstufe
		//v = (englisch value) Wert Dunkelstufe einfacher Dreisatz 0..100%
		*r = (*r * v)/100;
		*g = (*g * v)/100;
		*b = (*b * v)/100;

 

Dateien

Layout, Source Code usw. (04.01.2014)