Stap 4: Hoe het werkt
Voor dit project hebben we drie "kleur spots" die heen en weer loopt langs de strook met verschillende snelheden. Wanneer plekken over elkaar lopen, resulteert superpositie van rode, groene en blauwe in verschillende kleuren. Wij houden van positie en snelheid van elke plek in variabelen en we opnieuw moet worden berekend van een kleur voor elke LED op elke herschrijven. Terwijl we het vele malen per seconde doen kunnen, ziet de animatie er glad.
Elke kleurcomponent van een pixel is evenredig aan de exp(-d*d), waar d de afstand tussen de pixels en het midden van spot van opgevuld met een kleur is. Met andere woorden, pixel kleuren vertegenwoordigen een normale (Gauss) distributie-het is precies hetzelfde als het gebruik van "Gaussian blur" filter in grafische editor.
De exponent functie opgenomen in de Arduino library leek te zijn zeer traag, dus maakte ik een benadering met behulp van slechts twee vermenigvuldigingen en één divisie: 1.0/(1.0-(0.634-1.344*x)*x). Houd er rekening mee dat deze aanpassing alleen geschikt voor x < 0 is.
We berekenen de kleur van elke pixel in de lus en stuur het naar een geheugenbuffer door te bellen naar strip.setPixelColor(). Wanneer we een lus over elke pixel noemen we strip.show() en NeoPixel library synchroon alle gegevens stuurt naar opgegeven pin-alle pixels, één voor één, 24-bits kleur gegevens voor elke pixel. Eerste NeoPixel leest eerste 24 bits van gegevens, het lokaal worden opgeslagen in een register en alle andere gegevens via wordt doorgegeven aan volgende pixels. Tweede "pixel" neemt de gegevens en stuurt de rest naar de volgende – enzovoort enzovoort tot elke pixel de gegevens krijgt. U kunt veilig minder gegevens verzenden dan aantal LEDs in een strip hebt – alleen eerste NUMPIXELS dan zal werken.
De code is goed gedocumenteerd (hoop ik!), en gelieve te vragen in de reacties hier!