#include <Wire.h>
#include <arduinoFFT.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// --- Configuraciones de Hardware ---
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
#define OLED_ADDR 0x3C
// --- Pines de entrada de Audio para ESP32 ---
#define audioInL 36 // Canal Izquierdo (ADC1_CH0)
#define audioInR 39 // Canal Derecho (ADC1_CH3)
// --- Parámetros de la FFT ---
#define SAMPLES 128
#define SAMPLING_FREQUENCY 40000.0 // <<< CORRECCIÓN 1: Especificar como double/float
#define AMPLITUDE 1500
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// --- Arrays para la FFT ---
double vRealL[SAMPLES], vImagL[SAMPLES];
double vRealR[SAMPLES], vImagR[SAMPLES];
// --- Crear objetos FFT para cada canal ---
// <<< CORRECCIÓN 2: Especificar explícitamente el tipo <double> en la declaración
ArduinoFFT<double> fftL = ArduinoFFT<double>(vRealL, vImagL, SAMPLES, SAMPLING_FREQUENCY);
ArduinoFFT<double> fftR = ArduinoFFT<double>(vRealR, vImagR, SAMPLES, SAMPLING_FREQUENCY);
void setup() {
display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR);
display.clearDisplay();
display.display();
}
void loop() {
// --- 1. Muestreo de los dos canales de audio ---
for (int i = 0; i < SAMPLES; i++) {
vRealL[i] = (double)analogRead(audioInL) - 2048.0;
vImagL[i] = 0.0;
vRealR[i] = (double)analogRead(audioInR) - 2048.0;
vImagR[i] = 0.0;
}
// --- 2. Procesamiento FFT para ambos canales ---
fftL.windowing(FFT_WIN_TYP_HAMMING, FFT_FORWARD);
fftL.compute(FFT_FORWARD);
fftL.complexToMagnitude();
fftR.windowing(FFT_WIN_TYP_HAMMING, FFT_FORWARD);
fftR.compute(FFT_FORWARD);
fftR.complexToMagnitude();
// --- 3. Visualización en la Pantalla OLED ---
display.clearDisplay();
int displayBins = SAMPLES / 2;
int barHeight = (SCREEN_HEIGHT / 2) - 1;
for (int i = 2; i < displayBins; i++) {
int magnitudeL = vRealL[i] / AMPLITUDE;
magnitudeL = constrain(magnitudeL, 0, barHeight);
display.drawLine(i * 2, barHeight, i * 2, barHeight - magnitudeL, WHITE);
int magnitudeR = vRealR[i] / AMPLITUDE;
magnitudeR = constrain(magnitudeR, 0, barHeight);
display.drawLine(i * 2, barHeight + 1, i * 2, barHeight + 1 + magnitudeR, WHITE);
}
display.display();
}