#include /* * http://www.pobot.org/Traitement-du-son-par-FFT-fast.html * * http://onlinetonegenerator.com/432Hz.html * */ char im[128]; char data[128]; int A, B, C; const int ledSetUp = 2; // Rouge const int ledYello = 3; // Jaune sortie pour son téléphone fixe 18 db && 350 Hz const int ledBlue = 4; // Bleue sortie pour son téléphone mobile 50 db && 1200 Hz const int ledGreen = 5; // Verte sortie pour son carillon 64 db && 2000-6000 Hz const int SoundSensor = A5; int ledState = LOW; unsigned long previousMillis = 0; const long interval = 1000; void setup(){ Serial.begin(115200); pinMode(ledSetUp, OUTPUT); pinMode(ledYello, OUTPUT); pinMode(ledBlue, OUTPUT); pinMode(ledGreen, OUTPUT); pinMode(SoundSensor, INPUT); } void loop(){ // digitalWrite(ledSetUp, HIGH); int static i = 0; // static long tt; unsigned long tt; int val; // if (millis() > tt){ if (micros() > tt){ if (i < 128){ val = analogRead(SoundSensor); data[i] = val / 4 - 128; im[i] = 0; i++; } else{ // this could be done with the fix_fftr function without the im array. fix_fft(data,im,7,0); // I am only interessted in the absolute value of the transformation for (i=0; i<64; i++){ data[i] = sqrt(data[i] * data[i] + im[i] * im[i]); } for (int e=0; e<64; e++){ // Serial.print(val); Serial.print(data[e], DEC); Serial.print(" "); //do something with the data values 1..64 and ignore im if(e==63){ Serial.println(data[e]); delay(1000); } if( data[0]>10 || data[1]>10 && data[2]<2 && data[3]<2 && data[4]<2 && data[5]<2 && data[6]<2 && data[7]<2 && data[8]<2 && data[9]<2 ) { // Tel fixe 18 db && 350 Hz lightThisLed(ledYello); } if(data[2]>10 || data[3]>10 && data[3]<2 && data[4]<2 && data[5]<2 && data[6]<2 && data[7]<2 && data[8]<2 && data[9]<2 && data[0]<2 && data[1]<2) { // Mobile phone 50 db && 1200 Hz (2-3) lightThisLed(ledBlue); } if(data[4]>10 || data[5]>10 || data[6]>10 || data[7]>10 || data[8]>10 || data[9]>10 && data[0]<2 && data[1]<2 && data[2]<2 && data[3]<2 && data[4]<2) { // Carillon entrée 64 db && 2000-6000 Hz (4-12) lightThisLed(ledGreen); } else { digitalWrite(ledYello, LOW); digitalWrite(ledBlue, LOW); digitalWrite(ledGreen, LOW); } // tt = millis(); tt = micros(); digitalWrite(ledSetUp, HIGH); } } } // Serial.println(val); } int lightThisLed(int ledColor) { int i; unsigned long currentMillis = millis(); for (i = 0; i < 6; i++){ if (currentMillis - previousMillis >= interval) { // save the last time you blinked the LED previousMillis = currentMillis; if (ledState == LOW) { ledState = HIGH; } else { ledState = LOW; } } if (i==6) { ledState = HIGH; delay(10000); } } digitalWrite(ledColor, ledState); }