Stap 3: Opzoektabellen
Een groot eerste deel van de code in de vorige stap bestaat uit grote constante matrices. Dit zijn de opzoektabellen vooraf berekende waarden voor sinusgolf en HSV functies op te slaan. Natuurlijk is het mogelijk in plaats daarvan voor de berekening van de exacte waarde van elke LED de tijd die het is ingeschakeld, bijvoorbeeld voor normale HSV:
byte red, green, blue; if (angle<60) {red = 255; green = round(angle*4.25-0.01); blue = 0;} else if (angle<120) {red = round((120-angle)*4.25-0.01); green = 255; blue = 0;} else if (angle<180) {red = 0, green = 255; blue = round((angle-120)*4.25-0.01);} else if (angle<240) {red = 0, green = round((240-angle)*4.25-0.01); blue = 255;} else if (angle<300) {red = round((angle-240)*4.25-0.01), green = 0; blue = 255;} else {red = 255, green = 0; blue = round((360-angle)*4.25-0.01);} setRGBpoint(LED, red, green, blue);
Deze berekeningen zal vrij sommige dynamisch geheugen, maar ten koste van het programmageheugen en verwerkingstijd. Hoewel het meer of minder OK met eenvoudige vermenigvuldiging van HSV, sinus golven in realtime doen vereist operaties met zwevende punt en de meeste zeker moet worden vermeden, vandaar de opzoektabellen.
Merk op dat de opzoektabel sinusgolf zelfs een matrix met nullen aan het einde-dat is bevat omdat ik veel gebruik van deze tabellen en vond dat een honderd meer gevulde bytes van het dynamische geheugen een goede inruil voor een schonere code.
U kunt deze tabellen berekenen tijdens Setup in plaats van invoegen in de code-weer, als ik ze veel gebruiken, ik liever te doen hen eens en dan gewoon kopiƫren en plakken de arrays.
U kunt maken van uw eigen tafel van verschillende grootte of met verschillende waarden, dus hier de schets is. Alle drie arrays in het venster Serial Monitor wordt afgedrukt, is het gemakkelijk aan kopieer-plak ze vanaf daar.
uint8_t lights[360];uint16_t kkk;void setup() {Serial.begin(9600); //sine wave Serial.println("const uint8_t lights[360]={"); for (float k=PI; k<(3*PI); k=k+PI/120) { lights[kkk]=int((cos(k)+1)*127.7); // I use cosinus if (lights[kkk]<10) Serial.print(" "); // I like to keep the table clean if (lights[kkk]<100) Serial.print(" "); // told you I use them a lot! Serial.print(lights[kkk]); if (kkk<255) Serial.print(", "); //'if' portion is useful if you're not filling the // rest of the table with zeroes. It makes sure there's // no extra comma after the final value of array. // I keep it here just for that situation if (kkk%8==7) Serial.println(); // new line for cleaner table! kkk++; }for (; kkk<360; kkk++) // fill the rest with zeroes { Serial.print(" 0"); if (kkk<359) Serial.print(", "); if (kkk%8==7) Serial.println(); } Serial.println("};");// HSV // note that unlike the previous one these two just print out the numbers without storing them // change the Serial.print to lights[k]= if you need to store the values in lights[] array // for later use in the loop() Serial.println("const uint8_t HSVlights[61] = {"); for (int k=0; k<61; k++) { Serial.print(round(k*4.25-0.01)); if (k<60) Serial.print(", "); } Serial.println("};"); //power-conscious HSV Serial.println("const uint8_t HSVpower[121] = {"); for (int k=0; k<121; k++) { Serial.print(round(k*2.125-0.01)); if (k<120) Serial.print(", "); } Serial.println("};"); }void loop() { }
Het is een goed idee om te houden van de code lookup tabel-genererende in het Setup -gedeelte van uw schets totdat u perfect tevreden bent met de resultaten, dan kopieer-plak de const tabel en verwijder de code.