Round ESP32-S3 board becomes a drift-to-anywhere desk radio

Oct 27, 2026 Last reply: 5 hours ago 3 Replies
Jump to replies (3)

The trickiest part of this build seems to have been the display. The round ST77916 panel garbled when driven through Arduino_GFX's QSPI bus, so the maker moved it over to esp_lcd in quad mode, fed from internal DMA buffers, and got it working properly. That kind of swap, dropping a familiar graphics stack for the lower-level driver, is exactly the right call when a panel misbehaves.



The project itself is neat: the maker wanted their free world-radio site, Air Drift, to exist as a small object on the desk, so they wrote firmware for a Waveshare ESP32-S3-Touch-LCD-1.85 board. Nothing needs soldering, and installation happens entirely in the browser: plug in the board, open the install page, press Install, and scan the WiFi QR code shown on screen, thanks to native USB and ESP Web Tools in Chrome or Edge. The firmware even updates itself from GitHub releases.



Plenty of details stand out. Audio decoding runs on core 0 with the UI on core 1, so the two never fight. The stream buffer and decoded cover images live in the 8 MB octal PSRAM, with JPEGDEC and PNGdec decoding in small chunks into buffers the maker controls. Pressing Drift lands on a random station, with countries weighted by station count, and if a stream does not answer the radio just drifts onward. Station and song names run around the rim of the 360x360 screen, and left alone while playing, the display turns into a spectrum radiating from the album cover.



One trade-off worth noting: mbedTLS only allocates internal RAM on the S3, so during an HTTPS stream there is room for roughly one more handshake. The maker routes the directory over plain HTTP and stops the old stream before each drift to stay within that limit. The maker also says the chip is not fast enough for a sliding view of the earth, which that same chip's dual cores probably cannot rescue.


Pinning the decoder to core 0 and the interface to core 1 looks like the smartest single decision in the whole build. On an S3 you have two cores sitting right there, and splitting a streaming decoder from drawing work is the cleanest way to keep audio untouched. It costs a little in how you structure the code, but the payoff is steady playback with smooth visuals.

Curious about the battery gauge that learns its own discharge curve. How long does that take to settle, and does the estimate stay reasonable after the radio sits plugged in for days at a time? The board has a battery header, so I imagine plenty of people will run it mostly on mains and still want the percentage to mean something.

Since the maker says the ESP32 cannot manage a sliding view of the earth, a cheaper variation could work instead: keep Drift as the main picker but add a simple region filter on the screen, so a tap narrows random jumps to a chosen part of the world. It would keep the surprise of drifting while giving some control, and text rendering through U8g2 should handle the labels easily.

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required