ESP32-S3 firmware for a wearable LCD badge that plays GIF/PNG media from an SD card on a Waveshare ESP32-S3 Touch AMOLED 1.8" display.
The project is built with PlatformIO + Arduino framework and uses BitBank display/decoder libraries for efficient rendering.
See demo video.
- Plays media from SD card (
.gifand.png) - 15-20 FPS GIF playback (depending on content)
- Multiple playback modes:
- Manual: loop current item until you click to skip
- Auto: play GIFs sequentially (PNG files are skipped)
- Playlist: play files listed in
playlist.txt, with optional per-item delay
- Single-button control (BOOT button / GPIO0):
- short press → next file
- long press (~1s) → switch playback mode
- On-screen status bar overlay with:
- battery percentage
- charging indicator
- current playback mode icon
- Battery/PMU integration for AXP2101 (charge and battery telemetry)
- Board: Waveshare ESP32-S3 Touch AMOLED 1.8"
- MCU: ESP32-S3 (PSRAM required)
- Storage: microSD card over SD_MMC
- PMU: AXP2101 (battery/charging status)
- PlatformIO (VS Code extension or CLI)
- ESP32 toolchain (installed by PlatformIO)
- microSD card with media files
pio run -e waveshare-esp32-s3-touch-amoled-18
pio run -e waveshare-esp32-s3-touch-amoled-18 -t upload
pio device monitor -b 115200- Go to Releases and download the latest
xxx-firmware-merged.bin. - Go to online flasher tool Espresso Flash
- Select ESP32-S3, connect your device to the computer holding the BOOT button
- Click "Connect" and wait for the device to be detected
- On "Configure Firmware & Flash Settings" step, select "Upload local files" and select "Bootloader" tab and then upload
xxx-firmware-merged.binfrom the release assets, then click "Continue" and "Flash" to start flashing the firmware - Flashing may take a few minutes, once done power cycle the device and it should boot into the badge firmware
Put media files at the SD card root, for example:
/01lu.gif
/02lu.gif
/p03.png
/p04.png
Supported extensions are case-insensitive: .gif, .png.
If playlist.txt exists in SD root, long-pressing mode button cycles into Playlist mode.
File format (one entry per line):
/file.gif
/file.png 5
- First token: file path (from SD root)
- Optional second token: delay in seconds before automatic interrupt/advance
Example (playlist.txt):
/02lu.gif
/01lu.gif
/p03.png 5
/p04.png 5
/04lu.gif
- It is strongly recommended to compress and resize GIFs to overcome limitations of AnimatedGIF library and for better performance (e.g. using ezgif.com).
- Optimize -> Lossy Gif (Compression: 200) and Optimize -> Coalesce (unoptimize)
- Review battery charging current settings in
battery_status.cppfor your specific battery to ensure proper charging behavior.- By default it is set to 500mA
- If SD card init fails, the display shows an error prompt until media is available.
- If no supported files are found, playback stops with an error message.
