Hur man gör ordentlig Rainbow och slumpmässiga färger med RGB-färgmodellen (3 / 5 steg)
Steg 3: Uppslagstabeller
En stor första del av koden i föregående steg består av stora konstant matriser. Detta är uppslagstabeller lagra förkalkylerade värden för sinusvåg och HSV funktioner. Naturligtvis är det istället möjligt att beräkna det exakta värdet av varje LED den tid den är påslagen, till exempel för normala HSV:
byte röd, grön, blå;
om (vinkel < 60) {röd = 255, grön = round(angle*4.25-0.01); blå = 0;} annat
om (vinkel < 120) {röd = round((120-angle)*4.25-0.01); grön = 255, blå = 0;} annat
om (vinkel < 180) {röd = 0, grön = 255, blå = round((angle-120)*4.25-0.01);} annat
om (vinkel < 240) {röd = 0, grön = round((240-angle)*4.25-0.01); blå = 255;} annat
om (vinkel < 300) {röd = round((angle-240)*4.25-0.01), grön = 0; blå = 255;} annat
{röd = 255, grön = 0; blå = round((360-angle)*4.25-0.01);}
setRGBpoint (LED, röd, grön, blå);
Dessa beräkningar kommer gratis några dynamiska minne, men på bekostnad av programminne och bearbetningstid. Medan det är mer eller mindre OK med enkel multiplikation av HSV, göra sinustoner i realtid kräver operationer med flytande punkt och de flesta säkerligen bör undvikas, därav uppslagstabellerna.
Observera att sinusvåg uppslagstabellen även innehåller en matris med nollor på slutet – det beror på att jag använder dessa tabeller mycket och tyckte att hundra mer fyllda byte dynamisk minne är en bra kompromiss för en renare kod.
Du kan beräkna dessa tabeller under setup() i stället för att infoga dem i koden-igen, som jag använder dem mycket, jag föredrar att göra dem en gång och sedan bara klistra in arrayer.
Du kanske vill göra din egen tabell av olika storlek eller med olika värden, så här är skissen. Det kommer ut tre matriser i fönstret Serial Monitor, det är lätt att kopiera-klistra in dem därifrån.
uint8_t lampor [360];
uint16_t kkk;
void setup() {
Serial.BEGIN(9600);
sinusvåg
Serial.println ("const uint8_t lights[360]={");
för (flyta k = PI; k <(3*PI); k = k + PI/120)
{
Lights[KKK]=int((COS(k)+1)*127.7); Jag använder kosinus
om (lyser [kkk] < 10) Serial.print(""); Jag gillar att hålla bordet ren
om (lyser [kkk] < 100) Serial.print(""); sa ju att använder jag dem mycket!
Serial.Print(Lights[KKK]);
om (kkk < 255) Serial.print (","); "om" portion är användbart om du inte fyller i
resten av tabellen med nollor. Det gör att det finns
ingen extra kommatecken efter det sista värdet av matris.
Jag håller det här bara för denna situation
om (kkk %8 == 7) Serial.println(); ny rad för renare tabell!
KKK ++;
}
för (; kkk < 360, kkk ++) / / Fyll resten med nollor
{
Serial.Print ("0");
om (kkk < 359) Serial.print (",");
om (kkk %8 == 7) Serial.println();
}
Serial.println("};");
HSV
Observera att till skillnad från den tidigare dessa två bara skriva ut siffrorna utan att lagra dem
ändra Serial.print till lampor [k] = om du behöver lagra värdena i lampor [] matris
för senare använda i loop()
Serial.println ("const uint8_t HSVlights [61] = {");
för (int k = 0; k < 61; k ++)
{
Serial.Print(Round(k*4.25-0.01));
om (k < 60) Serial.print (",");
}
Serial.println("};");
Power-medvetna HSV
Serial.println ("const uint8_t HSVpower [121] = {");
för (int k = 0; k < 121; k ++)
{
Serial.Print(Round(k*2.125-0.01));
om (k < 120) Serial.print (",");
}
Serial.println("};");
}
void loop() {
}
Det är en bra idé att hålla lookup table-genererar koden i den setup() delen av din skiss tills du är helt nöjd med deras resultat, sedan klistra in const tabellen och ta bort koden.