#include "arduinoFFT.h"
const uint16_t samples = 64; // Bu değer daima 2'nin kuvveti olmalıdır.
const double samplingFrequency = 5000; // Örnekleme frekansı (Hz)
const int threshold = 500; // Eşik değeri
double vReal[samples];
double vImag[samples];
ArduinoFFT<double> FFT = ArduinoFFT<double>(vReal, vImag, samples, samplingFrequency);
#define SCL_INDEX 0x00
#define SCL_TIME 0x01
#define SCL_FREQUENCY 0x02
#define SCL_PLOT 0x03
bool readData = false;
unsigned long lastReadTime = 0;
const unsigned long readInterval = 1000; // Veri okuma süresi (ms)
void setup() {
Serial.begin(115200);
while (!Serial);
Serial.println("Ready");
}
void loop() {
int sensorValue = analogRead(A0);
// Eğer sensör değeri eşik değerinin üzerindeyse ve belirli bir süre geçtiyse veri oku
if (sensorValue > threshold && (millis() - lastReadTime > readInterval)) {
readData = true;
lastReadTime = millis(); // Son okuma zamanını güncelle
}
if (readData) {
/* Mikrofon verilerini oku */
for (uint16_t i = 0; i < samples; i++) {
vReal[i] = analogRead(A0); // Mikrofon sinyalini oku
vImag[i] = 0.0; // Sanal kısmı sıfırla
delayMicroseconds(1000000 / samplingFrequency); // Örnekleme periyodu
}
/* FFT işlemi */
FFT.windowing(FFTWindow::Hamming, FFTDirection::Forward); // Verileri ağırlıklandır
FFT.compute(FFTDirection::Forward); // FFT hesapla
FFT.complexToMagnitude(); // Büyüklükleri hesapla
/* Frekansları yazdır */
Serial.println("Frequencies:");
PrintVector(vReal, (samples >> 1), SCL_FREQUENCY);
/* Frekansları harflerle eşleştir */
veriler(); // Simülasyon verilerini kullanarak mesaj oluştur
readData = false; // Veriyi okuduktan sonra bayrağı sıfırla
}
}
void PrintVector(double *vData, uint16_t bufferSize, uint8_t scaleType) {
for (uint16_t i = 0; i < bufferSize; i++) {
double abscissa;
/* Abscissa değerini yazdır */
switch (scaleType) {
case SCL_INDEX:
abscissa = (i * 1.0);
break;
case SCL_TIME:
abscissa = ((i * 1.0) / samplingFrequency);
break;
case SCL_FREQUENCY:
abscissa = ((i * 1.0 * samplingFrequency) / samples);
break;
}
Serial.print(abscissa, 6);
if (scaleType == SCL_FREQUENCY) Serial.print(" Hz");
Serial.print(" ");
Serial.println(vData[i], 4);
}
Serial.println();
}
// Frekans değerlerini harflerle eşleştiren bir fonksiyon
char frequencyToChar(double frequency) {
if (frequency >= 0 && frequency < 100) return 'A'; // Örnek: 0-100 Hz arası 'A'
if (frequency >= 100 && frequency < 200) return 'B'; // Örnek: 100-200 Hz arası 'B'
if (frequency >= 200 && frequency < 300) return 'C'; // Örnek: 200-300 Hz arası 'C'
if (frequency >= 300 && frequency < 400) return 'D'; // Örnek: 300-400 Hz arası 'D'
// Daha fazla eşleme ekleyin
return '?'; // Eşleme bulunamazsa '?' döndür
}
void veriler() {
String message = "";
for (int i = 0; i < (samples >> 1); i++) {
double frequency = (i * 1.0 * samplingFrequency) / samples;
char c = frequencyToChar(frequency);
message += c;
}
Serial.println("Message: " + message);
delay(5000); // Her 5 saniyede bir mesajı yazdır
}