ESP32-S3 Internetradio: Schaltung, Code und Web-Oberfläche
Der ESP32-S3 N16R8 mit UDA1334-DAC ermöglicht den Bau eines minimalistischen Internetradios in einem Abend. Das Projekt nutzt I2S für die Audioausgabe, ein SSD1306-OLED-Display für Statusinformationen und eine Web-Oberfläche zur Senderverwaltung. Es unterstützt das Umschalten zwischen voreingestellten Streams und das Eingeben benutzerdefinierter URLs.
Komponenten und Verkabelung
Erforderliche Komponenten:
- ESP32-S3 N16R8
- UDA1334-DAC für MP3-Decodierung
- Verstärker mit Lautsprechern (Soundbar)
- Dupont-Kabel
Optional: 0,96" I2C SSD1306-OLED.
Verkabelung UDA1334 an ESP32-S3:
| ESP32-S3 | UDA1334 |
|----------|---------|
| GPIO41 | BCLK |
| GPIO42 | WSEL |
| GPIO45 | DIN |
| GND | GND |
| 3V3 | 3V3 |
Verkabelung OLED SSD1306:
| ESP32-S3 | SSD1306 |
|----------|---------|
| GPIO21 | SDA |
| GPIO20 | SCL |
| GND | GND |
| 3V3 | 3V3 |
Stromversorgung: USB-Splitter von einem 100W-Netzteil. ESP32 und Verstärker werden parallel versorgt.
Hauptprojektcode
Vollständiger Code in einer einzigen .ino-Datei. Bibliotheken: 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>
// WiFi-Einstellungen
const char* ssid = "ssid";
const char* password = "password";
// I2S-Pins
#define I2S_BCLK 41
#define I2S_LRC 42
#define I2S_DOUT 45
// I2C für 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 wird für UDA1334 initialisiert. Das Display zeigt den WiFi-Status, den Sendernamen mit Lauftext und einen Lautstärkeindikator.
Web-Verwaltungsoberfläche
Server auf Port 80 bedient eine HTML-Seite mit:
- Liste voreingestellter Sender (Klick zum Umschalten)
- Lautstärkeregler (0-21)
- Felder für benutzerdefinierten Sender (Name + URL)
- Status des aktuellen Senders und IP-Adresse
Wichtige Endpunkte:
/change?station=N— Sender wechseln/volume?value=N— Lautstärke einstellen/custom?name=NAME&url=URL— benutzerdefinierter Sender
HTML wird dynamisch mit CSS-Stilen und JavaScript für AJAX-Anfragen generiert.
OLED-Display-Ausgabe
Display-Aktualisierung alle 100ms:
- Obere Zeile: ONLINE/OFFLINE
- Laufender Sendername (scrollt bei Überlauf)
- Lautstärke als Zahl und Balken
void updateDisplay() {
display.clearDisplay();
// WiFi-Status
bool wifiConnected = (WiFi.status() == WL_CONNECTED);
display.setTextSize(1);
display.setCursor(0, 0);
display.println(wifiConnected ? "ONLINE" : "OFFLINE");
// ... restliche Logik
display.display();
}
Wichtige Punkte
- Minimalismus: Eine .ino-Datei, einsatzbereite Audio- und Adafruit-Bibliotheken
- I2S + UDA1334: Vollständiger MP3-Decoder ohne Overhead
- Web-Steuerung: Verwaltung ohne zusätzliche Hardware, IP auf dem Display angezeigt
- Benutzerdefinierte Streams: Beliebige URLs über Formular
- Stabilität: Läuft mit 100W-USB-Stromversorgung ohne Neustarts
Verbesserungsvorschläge
- Stromversorgung optimieren: separate Regler für ESP32 (3,3V/1A) und Verstärker
- GPIO-Tasten für lokale Steuerung hinzufügen
- Zustandsspeicherung in NVS implementieren (letzter Sender, Lautstärke)
- FLAC/OPUS-Unterstützung über Audio-Bibliotheksupdate
- Gehäuse mit Soundbar-Montage
Das Projekt eignet sich für Prototyping. Skalierung erfordert Code-Refactoring und PCB-Design.
— Editorial Team
Noch keine Kommentare.