Zurück zur Startseite

ESP32-S3 Internet-Radio: Code und Schaltplan

ESP32-S3 Internet-Radio-Projekt verwendet UDA1334 für I2S-Audio und OLED-Display. Weboberfläche ermöglicht das Wechseln von Sendern und das Eingeben benutzerdefinierter Streams. Vollständiger Code und Anschluss-Schaltpläne.

ESP32-S3 Internet-Radio in einem Abend: Schaltplan + Code
Advertisement 728x90

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.

Google AdInline article slot

Verkabelung UDA1334 an ESP32-S3:

| ESP32-S3 | UDA1334 |

|----------|---------|

Google AdInline article slot

| GPIO41 | BCLK |

| GPIO42 | WSEL |

| GPIO45 | DIN |

Google AdInline article slot

| 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

Advertisement 728x90

Weiterlesen