/* Simple audio level -> PWM LED Mic preamp in A0, A1, A2, using A1/A2 as cheap V+/Gnd. LED and resistor to 11/Gnd. Sample rate determined by analogRead() - ~9K/sec at 16MHz. COUNT empirically determined - works pretty well. For shorter version, omit optional RELEASE, NOISE block. 4/6/12 jw */ #define LEDPIN 11 long avg; void setup(){ pinMode(A1,OUTPUT); pinMode(A2,OUTPUT); digitalWrite(A1,HIGH); digitalWrite(A2,LOW); // PWM LED pinMode(LEDPIN,OUTPUT); digitalWrite(LEDPIN,HIGH);delay(50); digitalWrite(LEDPIN,LOW);delay(500); digitalWrite(LEDPIN,HIGH);delay(50); digitalWrite(LEDPIN,LOW); } #define COUNT 600 void loop(){ int val,max=0; // get max value in COUNT tries for(int i=0;imax)max=val; }//end for avg/=COUNT; max-=avg; if(max>510)max=510; // for max PWM value of 255 #if 1 // this OPTIONAL BLOCK gives fast attack slow release // higher values of RELEASE fade more slowly // also removes some low end noise static int oldmax=0; #define RELEASE 3 #define NOISE 10 max-=NOISE; if(max<0)max=0; oldmax=(RELEASE*oldmax+max)/(RELEASE+1); if(max>oldmax)oldmax=max; max=oldmax; // end fast attach slow release and noise block #endif analogWrite(LEDPIN,max/2); }//end loop