Powrót do strony głównej

ESP32-S3 radio internetowe: kod i schemat

Projekt radia internetowego na ESP32-S3 wykorzystuje UDA1334 do audio I2S i wyświetlacz OLED. Interfejs web pozwala przełączać stacje i wprowadzać dowolne strumienie. Pełny kod i schematy podłączenia.

Radio internetowe ESP32-S3 za wieczór: schemat + kod
Advertisement 728x90

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.

Google AdInline article slot

Podłączenie UDA1334 do ESP32-S3:

| ESP32-S3 | UDA1334 |

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

Google AdInline article slot

| GPIO41 | BCLK |

| GPIO42 | WSEL |

| GPIO45 | DIN |

Google AdInline article slot

| 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

Advertisement 728x90

Czytaj dalej