ThunderVUmeter (3 / 3 étapes)

Étape 3: logiciel

Donc, nous allons décrire la partie du code utilisé pour gérer tel que mentionné précédemment. D’abord nous avons besoin de la bibliothèque leOS2 de Leonardo Miliani (pas les leOS parce que dans le ATtiny il n’est pas la minuterie 2) et la bibliothèque qui nous permet de contrôler TLC5940s avec ATtiny84 et ATtiny85. Cette bibliothèque a été initialement créée par l’utilisateur du forum Arduino « Champignon » et modifiée par nos soins à utiliser avec ATtiny84 et celui-ci peut être téléchargé à partir ici. Examinons maintenant certains des principaux points du code, à partir de la fonction pour envoyer des données à la TLC5940 « tlc5940.update() », qui nous l’avons déjà expliqué dans le projet #HeartThrob, et qui a la particularité qui dure environ une milliseconde et que seulement pendant cette période les LEDs sont allumées. Une autre chose à noter dans le code est le code utilisé pour faire la fonction échelle automatique selon le volume de la musique. Ce processus fonctionne dans un très simple et intuitive : si la valeur lue est supérieure à la pleine échelle, elle augmente la valeur de la pleine échelle ; Si, au contraire, les valeurs relevées ne s’approchent pas la pleine échelle pour longtemps, dans notre cas deux secondes, puis la valeur pleine échelle est réduite.

 #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; } 

Obtenir ce code ici : www.VicenzaThunders.com/files/vumeter.txt

Articles Liés