Visualizador Espectro Audio Tiempo Real con Arduino Nano 33 BLE y OLED
Componentes y Suministros
| Arduino Nano 33 BLE (nRF52840) | 1 |
| Micrófono Electret + Amp MAX9814 (AGC automático) | 1 |
| OLED I2C 0.91" 128x32 (SSD1306) | 1 |
| Condensador 4.7nF (filtro RC paso bajo) | 1 |
| Condensador 470µF (desacople alimentación) | 1 |
| Resistencia 2kΩ (filtro RC paso bajo) | 1 |
Software
- Arduino IDE
- Librerías:
arduinoFFT,Adafruit_GFX,Adafruit_SSD1306
Sobre el Proyecto
Introducción
Visualizador de espectro de audio en tiempo real: gráfico de barras en OLED 128x32. Graves a la izquierda, agudos a la derecha. Responde a música/sonido ambiente.
Construcción y Conexiones

- MAX9814 GAIN: VCC→40dB (baja sens.), GND→50dB (media), flotante→60dB (alta).
- OUT micrófono → A0 (analógico).
- OLED I2C: 3.3V, GND, SDA (A4), SCL (A5).
- 470µF entre 3.3V y GND en bus alimentación.
Limitaciones Muestreo y Filtro Paso Bajo

analogRead() en Nano 33 BLE ≈ 35.000 muestras/seg. Teorema Nyquist → máx 17.5 kHz. Con overhead bucle ocupado → límite práctico **8 kHz**.
Filtro RC paso bajo hardware: R=2kΩ, C=4.7nF → fc ≈ 17 kHz (R=180Ω, C=0.1µF → fc ≈ 8.8 kHz). Elimina frecuencias que no podríamos muestrear bien.

Cálculo Tasa Muestreo Real
#define ANALOG_PIN A0
#define SAMPLES 1000000.0
int newTime, analogValue;
void setup() { Serial.begin(9600); Serial.println("Muestreando..."); }
void loop() {
newTime = micros();
for(int i=0;i<(int)SAMPLES;i++) analogValue=analogRead(ANALOG_PIN);
float usPerSample=(micros()-newTime)/SAMPLES;
Serial.print("us/muestra: "); Serial.println(usPerSample);
Serial.print("Freq máx (Hz): "); Serial.println(1e6/usPerSample);
}

Resultado: ~35 ksps. Bucle captura con espera activa:
for(int i=0;i
Interfaz de Usuario (OLED)

- Pantalla dividida en **11 bandas logarítmicas** (zona 3-13 de 14 totales), imitando percepción auditiva humana (20Hz-20kHz).
- Cada barra: rectángulo relleno = media banda, líneas discontinuas = pico banda.
- Valores en **dB** con referencia heurística.

Funcionamiento
- Muestreo 1024 muestras a 24 kHz (período ~41.6µs).
- FFT (librería
arduinoFFT): ventana Hamming, eliminación DC, magnitud compleja. - Agrupación en 14 bandas logarítmicas → cálculo media y máx por banda.
- Conversión a dB:
20*log10(valor/referencia). - Dibujado incremental en OLED (solo actualiza cambios).
Sobre el Módulo MAX9814

- **AGC (Control Ganancia Automático)**: 40/50/60dB configurables por pin GAIN.
- Salida ~2Vpp sobre bias 1.25V DC → compatible ADC 3.3V.
- Ratio Attack/Release modificable (1:4000 defecto).
- Para entrada Line-In: condensador bloqueo DC (>1µF, 33-100µF recomendado).
- Alimentación 2.7-5.5V.
Pantalla OLED 0.91" SSD1306
- 128x32 píxeles blancos, sin retroiluminación → bajo consumo.
- 4 pines I2C (sin RESET). Conectar SDA→A4, SCL→A5.
- Librerías Adafruit:
Adafruit_SSD1306,Adafruit_GFX.
Próximos Pasos
Usar ADC optimizado nRF52840 (DMA, temporizadores) para mayor tasa muestreo y FFT más precisa.
Proceso de manufactura
- Construya el clásico juego Pong en Arduino UNO con pantalla OLED: Tutorial paso a paso
- Sensor K30 CO₂: Monitorización en tiempo real de la calidad del aire interior
- Facilitar la comunicación sordo‑ciego usando 1Sheeld y Arduino
- Alcancía Inteligente: Controla un Aceptador de Monedas con Arduino Nano
- Controla un LED por Bluetooth con Arduino – Guía DIY paso a paso
- Controla Dos Motores Paso a Paso con Arduino Nano y Joystick - Tutorial Sencillo
- Transmisión de datos de audio con Arduino Nano 33 BLE Sense
- Contador Geiger Portátil con Arduino Nano: Construye tu Detector de Radiación
- Medición Precisa de Radiación Solar con Arduino UNO y Shield Ethernet
- Robot comedero con Arduino Nano: Guía paso a paso
- Reloj Meteorológico Arduino en Tiempo Real: Pantalla OLED para Hora, Fecha y Temperatura