WS2811 Atmega Led Strip (Musikgesteuert)

Nico Klinger
WS2811 Atmega Led Strip (Musikgesteuert)

Endlich ist er da! Nachdem die Ansteuerung der einzelnen WS2811 LED Chips relativ reibungslos abgelaufen ist haben wir uns mal beim Chinesen um die Ecke einen 5 Meter WS2811 Led Streifen besorgt. Nach einer kleinen Änderung im Code läuft er besser als erwartet! Kein flackern kein zucken er tut genau das was man ihm sagt. Nach den ersten Tests und den ersten Luftsprüngen, weil das ding einfach so geil aussieht. Haben wir uns daran gemacht ein Musikgesteuerten Levelmeter zu programmieren. Dieser soll mit Audioinput gefüttert werden und dann einen Ausschlag anzeigen. Natürlich im Takt der Musik.

Um das zu realisieren verwenden wir einen Atmega 328P der auf den internen 8 Mhz läuft. Den Audioinput bekommen wir über einen der Analogports des Atmegas rein.

Hier der Code unserer Auswertungsroutine

[code lang=“c”] /************************************************************************/ /* Musiksteuerung */ /************************************************************************/ void music(void) { int startLedIndex = 0; // Index der ersten WS2811 LED int endLedIndex = 147; // Index der letzten WS2811 LED int audioAmount = 0; // Zahl zwischen 0 und 100 // Audioinput int redLimitPercent = 75; // Ab wann der Rote Bereich anfängt in %

//Interne Variablen int highCountTimerMAX = 30; int highAmount = 0; int highCount = 0;

while(1) { //audioAmount = rand() % 20 + audioAmount-10; // Zufallswerte für Testzwecke audioAmount = readADC(0)*2; // Hier der Audio Analoginput

audioAmount = (audioAmount>100) ? 100 : audioAmount; audioAmount = (audioAmount<0) ? 0 : audioAmount; //audioAmount = 100; // Für Debuggen Audioinput auf 100% setzten int maxLedON = (endLedIndex-startLedIndex) * audioAmount / 100; int ledRedLimit = (endLedIndex-startLedIndex) * redLimitPercent / 100; if(highCount==highCountTimerMAX) { highCount = 0; highAmount = 0; } if(maxLedON > highAmount) { highCount = 0; highAmount = maxLedON; }

for(int i=0;i<150;i++) { if(i != highAmount-1) { int newVal = leds[startLedIndex+i].blue-15; leds[startLedIndex+i].blue = (newVal<=0) ? 0 : newVal; newVal = leds[startLedIndex+i].red-15; leds[startLedIndex+i].red = (newVal<=0) ? 0 : newVal; } }

for(int i=0;i<maxLedON;i++) { if(i <= ledRedLimit) set_col(startLedIndex+i,3,255); else set_col(startLedIndex+i,1,255);

if(i == ledRedLimit) { leds[startLedIndex+i].red = 140; leds[startLedIndex+i].blue = 50; } if(i == ledRedLimit-1) { leds[startLedIndex+i].red = 110; leds[startLedIndex+i].blue = 75; } if(i == ledRedLimit-2) { leds[startLedIndex+i].red = 75; leds[startLedIndex+i].blue = 110; } if(i == ledRedLimit-3) { leds[startLedIndex+i].red = 50; leds[startLedIndex+i].blue = 140; } }

highCount++;

send_all(); _delay_ms(2); } } [/code]

Wenn du weitere Fragen bezüglich unserer WS2811 Projekte hast oder Hilfe bei deinem Projekt brauchst. Schreib einfach einen Kommentar und wir werden dir weiterhelfen. Bilder und Videos zu diesem Projekt werde ich in nächster Zeit online stellen.

Über den Autor

N

Nico Klinger

Full-Stack Entwickler und Elektronik-Enthusiast. Verbindet Software mit Hardware zu smarten Lösungen.

PCB Design Analog Schaltung Node.js Embedded Systems Elektronik Simulation
nico@redlabs.de