ThunderVUmeter (3 / 3 paso)

Paso 3: Software

Por lo tanto, vamos a describir la parte del código utilizado para manejar como se mencionó anteriormente. En primer lugar tenemos que tener la biblioteca leOS2 de Leonardo Miliani (no los leOS porque el ATtiny no el ' TIMER 2 ') y la biblioteca que nos permite controlar TLC5940s con ATtiny84 y ATtiny85. Esta biblioteca fue originalmente creada por el usuario del Foro de Arduino "Hongo" y modificada por nosotros para usar con ATtiny84 y este puede ser descargado aquí. Ahora examinemos la parte de la clave de puntos del código, a partir de la función para enviar datos al TLC5940 "tlc5940.update()", que ya hemos explicado en el proyecto #HeartThrob, y que tiene la particularidad de que dura aproximadamente un milisegundo y solamente durante este período los LEDs se encienden. Otra cosa a notar en el código es el código usado para hacer la función de escala automática según el volumen de la música. Este proceso funciona de una manera muy sencilla e intuitiva: Si el valor leído es mayor que la escala completa, aumenta el valor de escala completa; Si, en cambio, la lectura de los valores no se acercan a la escala completa durante mucho tiempo, en nuestro caso dos segundos, se reduce el valor de escala completa.

 #include <Arduino.h> #include <Tiny_TLC5940.h> #include <leOS2.h> leOS2 OS; #define MIN 20 //Minimum value to autoscale #define K 1365 #define K2 819 #define T 3 unsigned long time=0; byte ds=0; unsigned int red=0, green=0, blue=4095, x=MIN; unsigned int c[8][3]={0}; byte s=0; void setup(){ tlc5940.init(); //Initialize TLC5940s tlc5940.clear(); tlc5940.update(); for(byte er=0;er<8;er++) //Set initial color values colors(); OS.begin(); OS.addTask(colors, T, SCHEDULED_IMMEDIATESTART); //Update color values every T*16 milliseconds x=MIN; time=0; } void loop(){ if(millis()-time>2000){ //Auto-scale for lower values function x=(x-x/20<=MIN)?MIN:x-x/20; time=millis()-1700; } byte right = read(1); //Read values byte left = read(0); tlc5940.clear(); //Clear old values byte er=8-right; for(byte re=8-right;re<8;re++){ //Set the new values for right channel tlc5940.set(re*3, c[er][2]); tlc5940.set(re*3+1,c[er][0]); tlc5940.set(re*3+2,c[er][1]); er++; } er=7; for(byte re=8;re<8+left;re++){ //Set the new values for left channel tlc5940.set(re*3, c[er][2]); tlc5940.set(re*3+1,c[er][0]); tlc5940.set(re*3+2,c[er][1]); er--; } tlc5940.update(); //Send data to TLC5940 } byte read(boolean channel){ unsigned int a=analogRead(channel);//Read the value of a channel while(a>x+x/9){ //Auto-scale for higher values function x+=x/18; time=millis(); } a=a>x?x:a; return map(a,0,x,0,8); //Calculate how many LEDs to turn on and return that value } void colors(){ //Update color values for(byte er=0;er<7;er++){ c[er][0]=c[er+1][0]; c[er][1]=c[er+1][1]; c[er][2]=c[er+1][2]; } switch(ds){ case 0: if(red==4095)ds=(ds+1)%6; else red+=K2; break; case 1: if(blue==0)ds=(ds+1)%6; else blue-=K2; break; case 2: if(green==4095)ds=(ds+1)%6; else green+=K2; break; case 3: if(red==0)ds=(ds+1)%6; else red-=K2; break; case 4: if(blue==4095)ds=(ds+1)%6; else blue+=K; break; case 5: if(green==0)ds=(ds+1)%6; else green-=K; break; } c[7][0]=red; c[7][1]=green; c[7][2]=blue; } 

Obtener este código aquí: www.VicenzaThunders.com/files/vumeter.txt

Artículos Relacionados