Для детекции определённой частоты существует алгоритм Гёрцеля. На ардуино существует библиотека с данным алгоритмом https://github.com/jacobrosenthal/Goertzel Но вот беда, среда 1.6.6 и 1.6.9 не считают данную библиотеку работоспособной. Кто пользовался данной библиотекой, можете подсказать как устранить неисправность?
Я ничего не менял, скачал с Гита Goertzel-master.zip, распаковал в %UserProfile%\Documents\Arduino\libraries и переименовал в папку в Goertzel.
Учебное заведение (странное расположение папки программы)? Выведите список файлов вашей папки Goertzel
Код (C++): goertzel.sample(sensorPin); //Will take n samples float magnitude = goertzel.detect(); //check them for target_freq Serial.println(detectsignal); if(magnitude>THRESHOLD){ //if you're getting false hits or no hits adjust this detectsignal = 1; digitalWrite(led, HIGH); } else detectsignal = 0; digitalWrite(led, LOW); добавляя в код detectsignal светодиод еле мерцает, а без этой переменной горит ярко. Не могу понять причину. Ведь по логике, я не оказываю на выходной порт с индикатором, влияния, но на деле происходит иначе.
Код (C++): #include <Goertzel.h> int sensorPin = A5; int led = 8; int detectsignal = 0; float TARGET_FREQUENCY = 128.50; const int N = 100; const float THRESHOLD = 4000; int tire = 0; int tiredetect = 0; int t4k = 0; int t4kdetect = 0; int ttd = 0; // _SFR_BYTE(ADCSRA) |= _BV(ADPS2); // Set ADPS2 // _SFR_BYTE(ADCSRA) &= ~_BV(ADPS1); // Clear ADPS1 // _SFR_BYTE(ADCSRA) &= ~_BV(ADPS0); // Clear ADPS0 const float SAMPLING_FREQUENCY = 8900; Goertzel goertzel = Goertzel(TARGET_FREQUENCY, N, SAMPLING_FREQUENCY); void setup(){ pinMode(led, OUTPUT); Serial.begin(9600); } void loop() { /////////////// детекция частоты goertzel.sample(sensorPin); float magnitude = goertzel.detect(); //check them for target_freq if(magnitude>THRESHOLD) { detectsignal = 1; digitalWrite(led, HIGH); ttd +=1; } else { digitalWrite(led, LOW); detectsignal = 0; ttd = 0; } /////////////////////////////////////////////////////// { if (ttd >= 500) ///////////////детекция тире { tire = 1; } else { tire = 0; } /////////////////////////////////////////// Serial.println(ttd); } } Собрал простой детектор, и отработал часть кода. И на данный момент подобная конструкция устраивает. Но в секундах срабатывание я установить не смог. ttd >= 500 установил приблизительно. Задержку в код вставлять нельзя, а без неё не выходит, многозадачность не усвоил дальше примера со светодиодом. И вообще, возможно ли ttd +=1; сделать с шагом заданным временем?