#include #include #include #include"fix_fft.h" #include"avr_adc.h" #include"light_ws2812_AVR/Light_WS2812/ws2812_config.h" #include"light_ws2812_AVR/Light_WS2812/light_ws2812.h" #include"main.h" #define STARTADC ADCSRA |= (1< 16 bins // //1-7.8 - ca 130hz //2- 255hz //3- 380 //4- 505 //5- 630 //6- 755 //7- 880 //8- 1kHz // int sec; uint16_t ticks; int ticks_sample; ISR(TIMER1_OVF_vect) { ticks_sample++; if(ticks < 65000) { ticks++; } if(ticks >= 65000) { ticks=0; if(sec<255) { sec++; } else { sec=0; } } } int main (void) { int i,i2; int i4=0; int sum,avg; char sample[64]; char buff[64]; float fac_r=0.1; float fac_g=0.5; float fac_b=0.7; sec=0; ticks=0; ticks_sample=0; struct cRGB led_bar1[8]; Fader fader1[4]={{5,5,5},{7,3,2},{3,7,2},{2,3,7}}; //DDRB = (1<3) { fac_r=(float)fader1[i4].r/10; fac_g=(float)fader1[i4].g/10; fac_b=(float)fader1[i4].b/10; if(i4<3) {i4++;} else {i4=0;} sec=0; } for(i=0;i<64;i++) { STARTADC; sample[i] = (ADCH-128); //read Analog value register 8bit center -128 //sample[i] = (sample[i] <= NOISE) ? 0 : (sample[i] - NOISE); //noise reduction sum+=sample[i];//dc-bias } avg = sum/64;//calculate bias for(i=0;i<64;i++) { sample[i]-=avg;//remove bias } fix_fftr(sample,6,0); //####Averaging Data#### for(i=0;i<64;i++) { if(sample[i]<0) sample[i] = 0; if(sample[i]>64) sample[i]=64; //define upper limit sample[i] = sample[i] *SCALE_FACTOR; sample[i] = (sample[i]*0.7 + buff[i]*0.3); //influence of last sample on current sample buff[i] = sample[i]; //store sample for next round } for(i=0;i<8;i++) //we store 8 frequency domains acros the whole 64 stpectrum { for(i2=1;i2<=4;i2++) { sample[i] = ((sample[i] + sample[i*8+i2])/2);//average each 4 following spectrums, write results to sample[0..7] } if(sample[i]<20) { led_bar1[i].r=(char)sample[i]*fac_r; led_bar1[i].g=(char)sample[i]*fac_g; led_bar1[i].b=(char)sample[i]*fac_b; } else if(sample[i]<30) { led_bar1[i].r=(char)sample[i]*fac_r*2; led_bar1[i].g=(char)sample[i]*fac_g/2; led_bar1[i].b=(char)sample[i]*fac_b/2; } else if(sample[i]<50) { led_bar1[i].r=(char)sample[i]*fac_r*2; led_bar1[i].g=(char)sample[i]*fac_g*2; led_bar1[i].b=(char)sample[i]*fac_b*2; } } ws2812_setleds(led_bar1,8); while(ticks_sample<60){asm("");}//workaround for stoping gcc optimizing } return 0; } void setupTimer(void) { clock_prescale_set(0); TCCR1 = (1<