Internetové rádio na ESP32-S3: schéma, kód a webové rozhraní
ESP32-S3 N16R8 s DAC UDA1334 umožňuje sestavit minimální internetové rádio za večer. Projekt využívá I2S pro výstup zvuku, OLED displej SSD1306 pro stav a webové rozhraní pro ovládání stanic. Podporuje přepínání přednastavených streamů a zadávání vlastních URL.
Komponenty a zapojení
Povinné prvky:
- ESP32-S3 N16R8
- DAC UDA1334 pro dekódování MP3
- Zesilovač s reproduktory (soundbar)
- Propojovací vodiče Dupont
Volitelně: OLED 0.96" I2C SSD1306.
Zapojení UDA1334 k ESP32-S3:
| ESP32-S3 | UDA1334 |
|----------|---------|
| GPIO41 | BCLK |
| GPIO42 | WSEL |
| GPIO45 | DIN |
| GND | GND |
| 3V3 | 3V3 |
Zapojení OLED SSD1306:
| ESP32-S3 | SSD1306 |
|----------|---------|
| GPIO21 | SDA |
| GPIO20 | SCL |
| GND | GND |
| 3V3 | 3V3 |
Napájení: USB rozbočovač z napájecího zdroje 100W. ESP32 a zesilovač jsou napájeny paralelně.
Hlavní kód projektu
Úplný kód v jednom .ino souboru. Knihovny: 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>
// Nastavení WiFi
const char* ssid = "ssid";
const char* password = "password";
// I2S piny
#define I2S_BCLK 41
#define I2S_LRC 42
#define I2S_DOUT 45
// I2C pro 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 je inicializován pro UDA1334. Displej zobrazuje stav WiFi, název stanice s běžícím textem, indikátor hlasitosti.
Webové rozhraní pro ovládání
Server na portu 80 obsluhuje HTML stránku s:
- Seznamem přednastavených stanic (kliknutím pro přepnutí)
- Posuvníkem hlasitosti (0-21)
- Polí pro vlastní stanici (název + URL)
- Stavem aktuální stanice a IP adresou
Klíčové endpointy:
/change?station=N— přepnutí na stanici/volume?value=N— nastavení hlasitosti/custom?name=NAME&url=URL— vlastní stanice
HTML je generováno dynamicky s CSS styly a JavaScriptem pro AJAX požadavky.
Zobrazení na OLED
Displej se aktualizuje každých 100 ms:
- Horní řádek: ONLINE/OFFLINE
- Běžící text názvu stanice (posun při přetečení)
- Hlasitost číslem a pruhem
void updateDisplay() {
display.clearDisplay();
// Stav WiFi
bool wifiConnected = (WiFi.status() == WL_CONNECTED);
display.setTextSize(1);
display.setCursor(0, 0);
display.println(wifiConnected ? "ONLINE" : "OFFLINE");
// ... zbytek logiky
display.display();
}
Co je důležité
- Minimalismus: Jeden .ino soubor, hotové knihovny Audio a Adafruit
- I2S + UDA1334: Plnohodnotný MP3 dekodér bez režie
- Webová kontrola: Ovládání bez dodatečného hardware, IP se zobrazuje na displeji
- Vlastní streamy: Libovolné URL přes formulář
- Stabilita: Funguje s USB napájením 100W bez resetů
Doporučení pro vylepšení
- Optimalizovat napájení: samostatné stabilizátory pro ESP32 (3.3V/1A) a zesilovač
- Přidat tlačítka na GPIO pro lokální ovládání
- Implementovat ukládání stavu do NVS (poslední stanice, hlasitost)
- Podpora FLAC/OPUS aktualizací knihovny Audio
- Kryt s uchycením soundbaru
Projekt je vhodný pro prototypování. Škálování vyžaduje refaktorizaci kódu a PCB.
— Editorial Team
Zatím žádné komentáře.