Ma esti kis szösszenet:
http://www.youtube.com/watch?v=C2XjJ230LeM
Kallódott a dobozomban egy RGB LED, rákötöttem hát az Arduino három PWM kimenetére egy-egy soros ellenállással. A próbapanelen lévő többi alkatrész csak a kóbor turisták megtévesztésére van!
A main loopban egy végtelen ciklusban állítom a színt, HSL formában. A wikipedia http://en.wikipedia.org/wiki/HSL_and_HSV#From_HSV szócikke alapján írtam egy kis függvényt, ami átalakítja a HSL-t RGB-be. Főleg ezt az ábrát használtam:
A végleges kód pedig így néz ki:
void setup() { pinMode(2, OUTPUT); pinMode(3, OUTPUT); pinMode(4, OUTPUT); Serial.begin(9600); } struct Color { byte r; byte g; byte b; } color; struct HSL { byte h; byte s; byte l; } hslcolor; void applyColor(struct Color color) { analogWrite(2, color.r); analogWrite(3, color.g); analogWrite(4, color.b); } struct Color hslToRgb(struct HSL hsl) { Color rgb; int temp; byte top = hsl.l; temp = (hsl.l * (255 - hsl.s)); byte bottom = (byte) (temp / 255); byte cont = top - bottom; byte mod = hsl.h % 43; byte segment = hsl.h / 43; temp = mod * cont; byte x = (byte) (temp / 43); switch (segment) { case 0: rgb.r = top; rgb.g = bottom + x; rgb.b = bottom; break; case 1: rgb.r = top - x; rgb.g = top; rgb.b = bottom; break; case 2: rgb.r = bottom; rgb.g = top; rgb.b = bottom + x; break; case 3: rgb.r = bottom; rgb.g = top - x; rgb.b = top; break; case 4: rgb.r = bottom + x; rgb.g = bottom; rgb.b = top; break; case 5: rgb.r = top; rgb.g = bottom; rgb.b = top - x; break; default: rgb.r = 0; rgb.g = 0; rgb.b = 0; } return rgb; } boolean dc = false; // dc for downcount byte j = 0; byte i = 0; void loop() { hslcolor.h = i; hslcolor.s = 213; hslcolor.l = 255-j; color = hslToRgb(hslcolor); applyColor(color); #ifdef DEBUG Serial.print("\t H: "); Serial.print(hslcolor.h, DEC); Serial.print("\t S: "); Serial.print(hslcolor.s, DEC); Serial.print("\t L: "); Serial.print(hslcolor.l, DEC); Serial.print("\t R: "); Serial.print(color.r, DEC); Serial.print("\t G: "); Serial.print(color.g, DEC); Serial.print("\t B: "); Serial.println(color.b, DEC); #endif i++; if (i == 255) { if (j == 255) { dc = true; } if (j == 0) { dc = false; } if (dc) { j--; } else { j++; } } delay(32); }
A soros kommunikációs rész csak debug célokat szolgált. A float-os megoldás nem igazán akart működni, meg nem is nagyon szeretjük ezen a procikon a float-ot, mert nincs bennük FPU. Persze alapvetően osztani sem szeretünk nem-kettő-hatvánnyal, úgyhogy még lehet reszelni a kódon, de így működik szépen.
Nagyon tetszik ez az Arduino.
Pingback: Some useless RGB LED experiment w/ Arduino | AStech blog