USB NeoPixel Deco lampor (via Digispark / ATtiny85) (4 / 5 steg)
Steg 4: Hur det fungerar
För detta projekt har vi tre "färg fläckar" som går fram och tillbaka längs remsan med olika hastigheter. När ställen kör över varandra, resulterar överlagring av röda, gröna och blå i olika färger. Vi håller position och hastighet för varje plats i variabler och vi måste räkna om en färg för varje LED på varje omritning. Medan vi kan göra det många gånger per sekund, ser animeringen slät.
Varje färgkomponent i en pixel är proportionell mot exp(-d*d), där d är avståndet mellan pixel och stadens plats av motsvarande färg. Med andra ord, pixelfärgerna representerar en normal (Gaussisk) distribution – det är exakt detsamma som att använda "Gaussian blur" filter i grafisk editor.
Den exponent funktionen som ingår i bibliotek för Arduino föreföll vara mycket långsam, så jag gjorde en närhet med hjälp av endast två multiplikationer och en division: 1.0/(1.0-(0.634-1.344*x)*x). Observera att denna tillnärmning är lämplig endast för x < 0.
Vi beräkna färg för varje pixel i loop och skicka det till en minnesbuffert genom att ringa strip.setPixelColor(). När vi loopas över varje pixel kallar vi strip.show() och NeoPixel bibliotek skickas synkront alla data till angivna pin-alla pixlar, en efter en, 24 bitar av färgdata för varje pixel. Första NeoPixel läser första 24 bitar data, lagras lokalt i ett register och passerar alla andra data genom att nästa pixlar. Andra "pixel" hämtar sina data och skickar resten till nästa – och så vidare och så vidare tills varje pixel får sin data. Du kan säkert skicka mindre data än antal lysdioder som du har i en stav – bara första NUMPIXELS kommer att fungera då.
Koden är väl dokumenterad (förhoppningsvis!) och gärna ställa frågor i kommentarerna här!