Stap 3: Software
Dus, laten we beschrijven het deel van de code die wordt gebruikt om te verwerken zoals eerder vermeld. Allereerst moeten we de bibliotheek leOS2 van Leonardo Miliani (niet de leOS omdat in de ATtiny er niet de TIMER-2) en de bibliotheek die ons in om controle TLC5940s met ATtiny84 en ATtiny85 staat. Deze bibliotheek werd oorspronkelijk bedacht door de gebruiker van het forum "Schimmel" Arduino en bewerkt door ons om het te gebruiken met ATtiny84 en deze kan worden gedownload van hier. Nu onderzoeken we enkele van de belangrijkste punten van het Wetboek, vanaf de functie voor het verzenden van gegevens naar de TLC5940 "tlc5940.update()", die we al hebben uitgelegd in de project- #HeartThrob, en die heeft de eigenaardigheid dat ongeveer een milliseconde en dat alleen in deze periode de LEDs duurt zijn ingeschakeld. Een ander ding om op te merken in de code is de code die wordt gebruikt om te doen de functie auto-schaal volgens het volume van de muziek. Dit proces werkt in een zeer eenvoudig en intuïtief: als de lees waarde hoger dan de volledige schaaluitslag is, het verhoogt de waarde van het schaalbereik; Als, in plaats daarvan, de waarden lezen kom niet dicht bij de volledige schaal voor een lange tijd, in ons geval twee seconden, waarna de waarde van het schaalbereik is teruggebracht.
#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; }
Deze code is hier: www.VicenzaThunders.com/files/vumeter.txt