/* 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 Added GAIN, NOISE/limit up front 8/13/16 Works quite nicely with optional block, two mic boards I picked up, a red LED, and an 18650 Li-ion as power. Needs tuning depending on supply voltage and LED color! */ #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 #define NOISE 70 #define GAIN 3 void loop(){ int max=0,limit; long int val; avg=0; // get max value in COUNT tries for(int i=0;imax)max=val; }//end for avg/=COUNT; max-=avg; limit=255*2+NOISE; if(max>limit)max=limit; // for max PWM value of 255 max-=NOISE; #if 1 // this OPTIONAL BLOCK gives fast attack slow release // higher values of RELEASE fade more slowly // also removes some low end noise static long int oldmax=0; #define RELEASE 3 if(max<0)max=0; oldmax=(int)((RELEASE*oldmax+(long)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