Radio por Internet con ESP32-S3: Circuito, Código e Interfaz Web
El ESP32-S3 N16R8 con DAC UDA1334 te permite construir una radio por internet mínima en una tarde. El proyecto utiliza I2S para la salida de audio, una pantalla OLED SSD1306 para el estado y una interfaz web para la gestión de emisoras. Soporta cambiar flujos predefinidos e introducir URLs personalizadas.
Componentes y Conexiones
Componentes necesarios:
- ESP32-S3 N16R8
- DAC UDA1334 para decodificación MP3
- Amplificador con altavoces (barra de sonido)
- Cables Dupont
Opcional: OLED SSD1306 de 0.96" I2C.
Conexión del UDA1334 al ESP32-S3:
| ESP32-S3 | UDA1334 |
|----------|---------|
| GPIO41 | BCLK |
| GPIO42 | WSEL |
| GPIO45 | DIN |
| GND | GND |
| 3V3 | 3V3 |
Conexión del OLED SSD1306:
| ESP32-S3 | SSD1306 |
|----------|---------|
| GPIO21 | SDA |
| GPIO20 | SCL |
| GND | GND |
| 3V3 | 3V3 |
Alimentación: Divisor USB de una fuente de 100W. El ESP32 y el amplificador se alimentan en paralelo.
Código Principal del Proyecto
Código completo en un solo archivo .ino. Librerías: WiFi, HTTPClient, Audio, Adafruit_GFX, Adafruit_SSD1306.
#include <WiFi.h>
#include <HTTPClient.h>
#include <WebServer.h>
#include "driver/i2s.h"
#include "Audio.h"
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// Configuración WiFi
const char* ssid = "ssid";
const char* password = "password";
// Pines I2S
#define I2S_BCLK 41
#define I2S_LRC 42
#define I2S_DOUT 45
// I2C para OLED
#define I2C_SDA 21
#define I2C_SCL 20
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
#define SCREEN_ADDRESS 0x3C
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
struct RadioStation {
const char* name;
const char* url;
};
const RadioStation radioStations[] = {
{"RSJ", "http://stream.srg-ssr.ch/m/rsj/mp3_128"},
{"Revma", "https://stream.revma.ihrhls.com/zc238"},
{"Jazz Stream", "http://jazz.streamr.ru/jazz-128.mp3"},
{"Paris Jazz", "http://parisjazz.ice.infomaniak.ch/parisjazz-high.mp3"},
{"Smooth Jazz", "http://smoothjazz.cdnstream1.com/2619_128.mp3"},
{"Jazz WR06", "http://jazz-wr06.ice.infomaniak.ch/jazz-wr06-128.mp3"},
{"Jazz WR07", "http://jazz-wr07.ice.infomaniak.ch/jazz-wr07-128.mp3"},
{"Jazz WR10", "http://jazz-wr10.ice.infomaniak.ch/jazz-wr10-128.mp3"}
};
const int radioStationsCount = sizeof(radioStations) / sizeof(RadioStation);
int currentStationIndex = 0;
Audio audio;
int currentVolume = 18;
I2S se inicializa para el UDA1334. La pantalla muestra el estado WiFi, el nombre de la emisora con texto desplazante y un indicador de volumen.
Interfaz Web de Gestión
El servidor en el puerto 80 sirve una página HTML con:
- Lista de emisoras predefinidas (clic para cambiar)
- Control deslizante de volumen (0-21)
- Campos para emisora personalizada (nombre + URL)
- Estado de la emisora actual y dirección IP
Endpoints clave:
/change?station=N— cambiar emisora/volume?value=N— ajustar volumen/custom?name=NOMBRE&url=URL— emisora personalizada
El HTML se genera dinámicamente con estilos CSS y JavaScript para peticiones AJAX.
Salida en Pantalla OLED
La pantalla se actualiza cada 100ms:
- Línea superior: ONLINE/OFFLINE
- Nombre de emisora desplazante (se desplaza si desborda)
- Volumen como número y barra
void updateDisplay() {
display.clearDisplay();
// Estado WiFi
bool wifiConnected = (WiFi.status() == WL_CONNECTED);
display.setTextSize(1);
display.setCursor(0, 0);
display.println(wifiConnected ? "ONLINE" : "OFFLINE");
// ... lógica restante
display.display();
}
Puntos Clave
- Minimalismo: Un archivo .ino, librerías Audio y Adafruit listas para usar
- I2S + UDA1334: Decodificador MP3 completo sin sobrecarga
- Control Web: Gestión sin hardware adicional, IP mostrada en pantalla
- Flujos Personalizados: URLs arbitrarias mediante formulario
- Estabilidad: Funciona con alimentación USB de 100W sin reinicios
Recomendaciones de Mejora
- Optimizar alimentación: reguladores separados para ESP32 (3.3V/1A) y amplificador
- Añadir botones GPIO para control local
- Implementar guardado de estado en NVS (última emisora, volumen)
- Soporte FLAC/OPUS mediante actualización de la librería Audio
- Carcasa con montaje para barra de sonido
El proyecto es adecuado para prototipado. Escalarlo requiere refactorizar código y diseño de PCB.
— Editorial Team
Aún no hay comentarios.