#include "Wire.h" #include "arduinoFFT.h" #include "LiquidCrystal_I2C.h" #include "LedControl.h" #include "binary.h" LiquidCrystal_I2C lcd(0x27, 16, 2); LedControl lc=LedControl(12,11,10,1); const int MIC_PIN = A0; const unsigned short SAMPLES = 128; const double SAMPLING_FREQ = 4096; const unsigned short FREQ_SAMPLE_AMOUNT = 5; double noise_reject_limit = 550; double mic_value = 0; double avg_freq = 0; double vReal[SAMPLES]; double vImag[SAMPLES]; double domin_freq[FREQ_SAMPLE_AMOUNT] = {0}; double sampling_period = 1e6 * (1/SAMPLING_FREQ); unsigned short freq_sample_count = 0; double f = 0; byte level1[8]= {B11111111,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000}; byte level2[8]= {B00000000,B11111111,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000}; byte level3[8]= {B00000000,B00000000,B11111111,B00000000,B00000000,B00000000,B00000000,B00000000}; byte level4[8]= {B00000000,B00000000,B00000000,B11111111,B00000000,B00000000,B00000000,B00000000}; byte level5[8]= {B00000000,B00000000,B00000000,B00000000,B11111111,B00000000,B00000000,B00000000}; byte level6[8]= {B00000000,B00000000,B00000000,B00000000,B00000000,B11111111,B00000000,B00000000}; byte level7[8]= {B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B11111111,B00000000}; byte level8[8]= {B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B11111111}; void setup() { lcd.init(); lcd.backlight(); lcd.setCursor(4,0); Serial.begin(115200); // put your setup code here, to run once: lc.shutdown(0,false); // Set brightness to a medium value lc.setIntensity(0,8); // Clear the display lc.clearDisplay(0); } void loop() { unsigned long start_time = micros(); for (int i = 0; i < SAMPLES; i++){ mic_value = analogRead(MIC_PIN); if (mic_value > noise_reject_limit){ vReal[i] = mic_value; }else{ vReal[i] = 0; } vImag[i] = 0; while (micros() - start_time < sampling_period){ //wait till period ends //do notthing } start_time += sampling_period; } arduinoFFT FFT = arduinoFFT(vReal, vImag, SAMPLES, SAMPLING_FREQ); //FFT FFT.Windowing(FFT_WIN_TYP_HAMMING, FFT_FORWARD); FFT.Compute(FFT_FORWARD); FFT.ComplexToMagnitude(); domin_freq[freq_sample_count] = FFT.MajorPeak(); freq_sample_count++; if (freq_sample_count == FREQ_SAMPLE_AMOUNT){ lcd.clear(); lc.clearDisplay(0); double avg_freq = avg_frequency(domin_freq, FREQ_SAMPLE_AMOUNT); if(avg_freq){ lcd.setCursor(0, 0); lcd.print(avg_freq); lcd.setCursor(0, 1); LedMatrix(avg_freq); // lc.clearDisplay(0); }else lcd.print("zu leise!"); freq_sample_count = 0; } //LedMatrix(f); //LedMatrix1(); } double avg_frequency(double freq_arr[], unsigned short sample_count){ double avr_f = 0; for (int ii = 0; ii < sample_count; ii++){ avr_f += freq_arr[ii]; } avr_f /= sample_count; if(isnan(avr_f)){ return 0; }else return avr_f; } int LedMatrix(double f) { if ((f>=0) && (f<12000)) { if (f<200) { lc.setRow(0, 0, level1[0]); lc.setRow(0, 1, level1[1]); lc.setRow(0, 2, level1[2]); lc.setRow(0, 3, level1[3]); lc.setRow(0, 4, level1[4]); lc.setRow(0, 5, level1[5]); lc.setRow(0, 6, level1[6]); lc.setRow(0, 7, level1[7]); return 1; } //else return; if ((f>=200) && (f<400)) { lc.setRow(0, 0, level2[0]); lc.setRow(0, 1, level2[1]); lc.setRow(0, 2, level2[2]); lc.setRow(0, 3, level2[3]); lc.setRow(0, 4, level2[4]); lc.setRow(0, 5, level2[5]); lc.setRow(0, 6, level2[6]); lc.setRow(0, 7, level2[7]); return 2; } //else return; if ((f>=400) && (f<500)) { lc.setRow(0, 0, level3[0]); lc.setRow(0, 1, level3[1]); lc.setRow(0, 2, level3[2]); lc.setRow(0, 3, level3[3]); lc.setRow(0, 4, level3[4]); lc.setRow(0, 5, level3[5]); lc.setRow(0, 6, level3[6]); lc.setRow(0, 7, level3[7]); return 3; } //else return; if ((f>=500) && (f<600)) { lc.setRow(0, 0, level4[0]); lc.setRow(0, 1, level4[1]); lc.setRow(0, 2, level4[2]); lc.setRow(0, 3, level4[3]); lc.setRow(0, 4, level4[4]); lc.setRow(0, 5, level4[5]); lc.setRow(0, 6, level4[6]); lc.setRow(0, 7, level4[7]); return 4; } //else return; if ((f>=600) && (f<700)) { lc.setRow(0, 0, level5[0]); lc.setRow(0, 1, level5[1]); lc.setRow(0, 2, level5[2]); lc.setRow(0, 3, level5[3]); lc.setRow(0, 4, level5[4]); lc.setRow(0, 5, level5[5]); lc.setRow(0, 6, level5[6]); lc.setRow(0, 7, level5[7]); return 5; } //else return; if ((f>=700) && (f<800)) { lc.setRow(0, 0, level6[0]); lc.setRow(0, 1, level6[1]); lc.setRow(0, 2, level6[2]); lc.setRow(0, 3, level6[3]); lc.setRow(0, 4, level6[4]); lc.setRow(0, 5, level6[5]); lc.setRow(0, 6, level6[6]); lc.setRow(0, 7, level6[7]); return 6; } //else return; if ((f>=800) && (f<900)) { lc.setRow(0, 0, level7[0]); lc.setRow(0, 1, level7[1]); lc.setRow(0, 2, level7[2]); lc.setRow(0, 3, level7[3]); lc.setRow(0, 4, level7[4]); lc.setRow(0, 5, level7[5]); lc.setRow(0, 6, level7[6]); lc.setRow(0, 7, level7[7]); return 7; } //else return; if ((f>=900) && (f<12000)) { lc.setRow(0, 0, level8[0]); lc.setRow(0, 1, level8[1]); lc.setRow(0, 2, level8[2]); lc.setRow(0, 3, level8[3]); lc.setRow(0, 4, level8[4]); lc.setRow(0, 5, level8[5]); lc.setRow(0, 6, level8[6]); lc.setRow(0, 7, level8[7]); return 8; } else return 0; } //return; }