Radio internetowe na ESP32-S3: schemat, kod i interfejs webowy
ESP32-S3 N16R8 z przetwornikiem UDA1334 pozwala złożyć minimalistyczne radio internetowe w jeden wieczór. Projekt wykorzystuje I2S do wyjścia audio, wyświetlacz OLED SSD1306 do statusu oraz interfejs webowy do zarządzania stacjami. Obsługuje przełączanie wstępnie ustawionych strumieni i wprowadzanie dowolnych adresów URL.
Komponenty i podłączenie
Elementy obowiązkowe:
- ESP32-S3 N16R8
- DAC UDA1334 do dekodowania MP3
- Wzmacniacz z głośnikami (soundbar)
- Przewody Dupont
Opcjonalnie: OLED 0.96" I2C SSD1306.
Podłączenie UDA1334 do ESP32-S3:
| ESP32-S3 | UDA1334 |
|----------|---------|
| GPIO41 | BCLK |
| GPIO42 | WSEL |
| GPIO45 | DIN |
| GND | GND |
| 3V3 | 3V3 |
Podłączenie OLED SSD1306:
| ESP32-S3 | SSD1306 |
|----------|---------|
| GPIO21 | SDA |
| GPIO20 | SCL |
| GND | GND |
| 3V3 | 3V3 |
Zasilanie: rozgałęziacz USB z zasilacza 100W. ESP32 i wzmacniacz zasilane równolegle.
Główny kod projektu
Pełny kod w jednym pliku .ino. Biblioteki: 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>
// Ustawienia WiFi
const char* ssid = "ssid";
const char* password = "password";
// Piny I2S
#define I2S_BCLK 41
#define I2S_LRC 42
#define I2S_DOUT 45
// I2C dla 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[0]);
int currentStationIndex = 0;
Audio audio;
int currentVolume = 18;
I2S inicjalizowany dla UDA1334. Wyświetlacz pokazuje status WiFi, nazwę stacji z przewijającym się tekstem, wskaźnik głośności.
Interfejs webowy zarządzania
Serwer na porcie 80 obsługuje stronę HTML z:
- Listą wstępnie ustawionych stacji (kliknięcie do przełączenia)
- Suwakiem głośności (0-21)
- Polami dla własnej stacji (nazwa + URL)
- Statusem aktualnej stacji i adresem IP
Kluczowe endpointy:
/change?station=N— przełączenie na stację/volume?value=N— ustawienie głośności/custom?name=NAZWA&url=URL— własna stacja
HTML generowany dynamicznie z CSS i JavaScript dla żądań AJAX.
Wyświetlanie na OLED
Wyświetlacz odświeżany co 100ms:
- Górny wiersz: ONLINE/OFFLINE
- Przewijająca się nazwa stacji (przewijanie przy przepełnieniu)
- Głośność liczbą i paskiem
void updateDisplay() {
display.clearDisplay();
// Status WiFi
bool wifiConnected = (WiFi.status() == WL_CONNECTED);
display.setTextSize(1);
display.setCursor(0, 0);
display.println(wifiConnected ? "ONLINE" : "OFFLINE");
// ... reszta logiki
display.display();
}
Co jest ważne
- Minimalizm: Jeden plik .ino, gotowe biblioteki Audio i Adafruit
- I2S + UDA1334: Pełny dekoder MP3 bez obciążenia
- Kontrola webowa: Zarządzanie bez dodatkowego sprzętu, IP wyświetlane na ekranie
- Własne strumienie: Dowolne URL przez formularz
- Stabilność: Działa z zasilaniem USB 100W bez resetów
Rekomendacje do ulepszeń
- Zoptymalizować zasilanie: osobne stabilizatory dla ESP32 (3.3V/1A) i wzmacniacza
- Dodać przyciski na GPIO do lokalnego sterowania
- Zaimplementować zapisywanie stanu w NVS (ostatnia stacja, głośność)
- Obsługa FLAC/OPUS przez aktualizację biblioteki Audio
- Obudowa z mocowaniem soundbara
Projekt nadaje się do prototypowania. Skalowanie wymaga refaktoryzacji kodu i PCB.
— Editorial Team
Brak komentarzy.