Hur man gör ordentlig Rainbow och slumpmässiga färger med RGB-färgmodellen (2 / 5 steg)
Steg 2: Rainbow tid!
Videon ovan visar samma fem lysdioder kör rainbow i tre lägen: regelbunden HSV (överst), "power-medvetna" HSV (mitten) och sinus våg (nederst). Filma lysdioder är inte en exakt givande erfarenhet, men förhoppningsvis kan du se skillnaden mellan olika lägen. Det finns en B & W bilder i slutet, det visar tydligt spikar av HSV lägen. I alla fall, är här koden som låter dig upprepa upplevelsen själv:
uint8_t är samma som byte
uint16_t är unsigned int
Jag märkte bara att jag blandade dessa i denna skiss, ledsen
CONST uint8_t lyser [360] = {
0, 0, 0, 0, 0, 1, 1, 2,
2, 3, 4, 5, 6, 7, 8, 9,
11, 12, 13, 15, 17, 18, 20, 22,
24, 26, 28, 30, 32, 35, 37, 39,
42, 44, 47, 49, 52, 55, 58, 60,
63, 66, 69, 72, 75, 78, 81, 85,
88, 91, 94, 97, 101, 104, 107, 111,
114, 117, 121, 124, 127, 131, 134, 137,
141, 144, 147, 150, 154, 157, 160, 163,
167, 170, 173, 176, 179, 182, 185, 188,
191, 194, 197, 200, 202, 205, 208, 210,
213, 215, 217, 220, 222, 224, 226, 229,
231, 232, 234, 236, 238, 239, 241, 242,
244, 245, 246, 248, 249, 250, 251, 251,
252, 253, 253, 254, 254, 255, 255, 255,
255, 255, 255, 255, 254, 254, 253, 253,
252 251, 251, 250, 249, 248, 246, 245,
244 242, 241, 239, 238, 236, 234, 232,
231, 229, 226, 224, 222, 220, 217, 215,
213, 210, 208, 205, 202, 200, 197, 194,
191, 188, 185, 182, 179, 176, 173, 170,
167, 163, 160, 157, 154, 150, 147, 144,
141, 137, 134, 131, 127, 124, 121, 117,
114 111, 107, 104, 101, 97, 94, 91,
88, 85, 81, 78, 75, 72, 69, 66,
63 60, 58, 55, 52, 49, 47, 44,
42, 39, 37, 35, 32, 30, 28, 26,
24, 22, 20, 18, 17, 15, 13, 12,
11, 9, 8, 7, 6, 5, 4, 3,
2, 2, 1, 1, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0};
CONST uint8_t HSVlights [61] =
{0, 4, 8, 13, 17, 21, 25, 30, 34, 38, 42, 47, 51, 55, 59, 64, 68, 72, 76,
81, 85, 89, 93, 98, 102, 106, 110, 115, 119, 123, 127, 132, 136, 140, 144,
149, 153, 157, 161, 166, 170, 174, 178, 183, 187, 191, 195, 200, 204, 208,
212, 217, 221, 225, 229, 234, 238, 242, 246, 251, 255};
CONST uint8_t HSVpower [121] =
{0, 2, 4, 6, 8, 11, 13, 15, 17, 19, 21, 23, 25, 28, 30, 32, 34, 36, 38, 40,
42, 45, 47, 49, 51, 53, 55, 57, 59, 62, 64, 66, 68, 70, 72, 74, 76, 79, 81,
83, 85, 87, 89, 91, 93, 96, 98, 100, 102, 104, 106, 108, 110, 113, 115, 117,
119, 121, 123, 125, 127, 130, 132, 134, 136, 138, 140, 142, 144, 147, 149,
151, 153, 155, 157, 159, 161, 164, 166, 168, 170, 172, 174, 176, 178, 181,
183, 185, 187, 189, 191, 193, 195, 198, 200, 202, 204, 206, 208, 210, 212,
215, 217, 219, 221, 223, 225, 227, 229, 232, 234, 236, 238, 240, 242, 244,
246, 249, 251, 253, 255};
uint8_t outputPins [6] = {3, 5, 6, 9, 10, 11}; PWM stift
setRGBpoint (0,...) för stift 3, 5, 6. setRGBpoint (1,...) för stift 9, 10, 11.
Se matrisen ovan
void setRGBpoint (byte LED, uint8_t röd, grön, uint8_t uint8_t blå)
{
Detta är för gemensam anod lysdioder. Om du använder gemensam katod sådana,
ta bort den "255-" bitar.
analogWrite (outputPins [LED * 3], 255-röd);
analogWrite (outputPins [LED * 3 + 1], 255-grön);
analogWrite (outputPins [LED * 3 + 2], 255-blå);
}
verkliga HSV regnbågen
void trueHSV (byte LED, int vinkel)
{
byte röd, grön, blå;
om (vinkel < 60) {röd = 255, grön = HSVlights [vinkel]; blå = 0;} annat
om (vinkel < 120) {röd = HSVlights [120-vinkel]; grön = 255, blå = 0;} annat
om (vinkel < 180) {röd = 0, grön = 255, blå = HSVlights [vinkel-120];} annat
om (vinkel < 240) {röd = 0, grön = HSVlights [240-vinkel]; blå = 255;} annat
om (vinkel < 300) {röd = HSVlights [vinkel-240], grön = 0; blå = 255;} annat
{röd = 255, grön = 0; blå = HSVlights [360-vinkel];}
setRGBpoint (LED, röd, grön, blå);
}
"power-medvetna" HSV regnbågen
void powerHSV (byte LED, int vinkel)
{
byte röd, grön, blå;
om (vinkel < 120) {röd = HSVpower [120-vinkel]; grön = HSVpower [vinkel]; blå = 0;} annat
om (vinkel < 240) {röd = 0; grön = HSVpower [240-vinkel]; blå = HSVpower [vinkel-120];} annat
{röd = HSVpower [vinkel-240]; grön = 0; blå = HSVpower [360-vinkel];}
setRGBpoint (LED, röd, grön, blå);
}
sinusvåg rainbow
void sineLED (byte LED, int vinkel)
{
setRGBpoint (LED, ljus [(angle+120) % 360], ljus [vinkel], lights[(angle+240)%360]);
}
void setup() {
}
void loop() {
för (int k = 0; k < 360; k ++)
{
avkommentera läge (eller lägen) du behöver nedan.
med alla sex PWM utgångar ansluten kan du använda 2 lägen, ändra en 0 till 1.
trueHSV (0, k);
powerHSV (0, k);
sineLED (0, k);
Delay(30);
}
}
Bara ansluta en eller två RGB-ljusdioder till din Arduino och avkommentera de nödvändiga rutinerna i loop(). Observera att här koden skrevs för gemensam anod lysdioder, om du har gemensam katod som tar bort alla tre "255-' från funktionen setRGBpoint() .
Funktionen setRGBpoint() sig ingår för lättare övergång mellan PWM utgångar och LED drivers. Ändra det om du använder den senare. Observera att du kan fortfarande använda en byte värden, bara multiplicera dem i funktion med "<< 4' för 12-bitars utdata och ' << 8' för 16-bitars.
Denna kod är tillräckligt för att få dig igång, men om du vill att det förklarade lite, läste på (och ja, de slumpmässiga färgerna kommer att följa inom kort).