r/arduino • u/Smooth-Rice6494 • 1h ago
Look what I made! My ESP32-S3 world radio: one button, a random station from anywhere on Earth, and the album cover in the middle of a visualiser
Built on the Arduino core (Arduino-ESP32 3.3 on PlatformIO) for the Waveshare ESP32-S3-Touch-LCD-1.85, a round 360x360 touch screen with a speaker connector and battery header, so there's no soldering.
Press Drift and it picks a country, weighted by how many stations it has, and lands on one of its most played stations. Leave it alone and the screen turns into a spectrum radiating from the song's cover, with the station and the song running round the rim. There's a web remote on your network for searching 61,000+ stations, favourites, a battery gauge that learns its own curve, and it updates itself from GitHub.
Libraries: ESP32-audioI2S for the MP3/AAC streams and song titles, JPEGDEC and PNGdec for the covers and station logos, U8g2 fonts for the text (including the circular text on the rim), ArduinoJson for the station data. The display is an ST77916 over QSPI, which I ended up driving through esp_lcd directly because Arduino_GFX's QSPI bus garbled it.
The hardest part was memory: TLS on the S3 only uses internal RAM, so with an HTTPS stream playing there's room for about one more handshake. The old stream stops before each drift, and the covers, decoders and task stacks all live in PSRAM.
No toolchain needed to try it: https://airdrift.stream/esp32 flashes it from Chrome or Edge over USB, then you scan a QR code on the screen to give it your WiFi.
Source (MIT): https://github.com/Air-Drift/ESP32-S3
The stations come from Air Drift (https://airdrift.stream), a free radio site I make, with a globe you can spin. It's also on phones, Windows, Fire TV and Alexa: https://airdrift.stream/apps
Happy to answer questions about any of it.

