Sand Sim
firmware —
FLASH MATERIALS SCENES GITHUB
ESP32-S3 · 466×466 AMOLED

A sand sim for a
little round screen.

Runs on the Waveshare ESP32-S3-Touch-AMOLED-1.75C. Tilt the board and the sand pours toward the low edge, touch the glass to paint materials in, set fire to things.

FLASH IT BUY THE BOARD
12
MATERIALS
QSPI
NO LVGL, NO FB
6
SCENE SLOTS
live sim, drag inside the glass to pour
01 — WEB FLASHER flashes over Web Serial, straight from this tab
firmware —
Loading firmware…
Needs Chrome or Edge on desktop, Firefox and Safari have no Web Serial. If no port shows up hold BOOT while plugging the board in and try again, the firmware's USB drive mode likes to hog the port.
SERIAL LOG
Waiting for install…
02 — MATERIALS

Density is the physics.

Twelve materials, ordered by density, and that ordering is the physics: a cell can move into any neighbour holding something strictly lighter.

SAND
Granular. Heaps hold a 45° angle of repose.
DIRT
Granular, heavier, dissolves in acid.
WATER
Liquid, spreads until level. Quenches lava into rock.
ACID
Liquid. Eats sand, dirt, rock and wood, venting gas.
LAVA
Liquid. Ignites wood, turns to rock in water.
FIRE
Burns wood, needs air, climbs against gravity, dies into smoke.
SMOKE
Rises and thins out into nothing.
STEAM
Rises, condenses back to water when trapped.
ACID GAS
Rises and thins out, the by-product of dissolving.
WOOD
Static, but it burns, and acid takes it too.
ROCK
Static. Only acid gets through it.
WALL
The bowl itself.
03 — CONTROLS

One button,
full-screen rings.

Menus are full screen pie rings, wedge segments running to the edge of the glass, translucent over the paused scene. Drag to a wedge and lift to pick, lift on the empty centre to cancel.

touch / drag paint the selected material
Key1 click materials ring (centre: tools)
Key1 hold 0.5s system menu, save/load/import, settings, battery, power
Key1 click (menu open) close it
Key1 hold at power-on redo touch calibration, TAP THE DOT, twice
04 — DEMO

See it pour.

Rendering goes straight to the panel over QSPI, no LVGL, no framebuffer in PSRAM. Bands get painted and pushed from internal DMA memory with per-row dirty tracking so only what changed gets sent.

05 — SCENES & PNG IMPORT

Drop a PNG on the drive.

SIX SLOTS
Scene slots live in a raw flash partition, cells plus colour palette. Slot 1 gets restored at boot.
USB DRIVE
The 4 MB FAT partition mounts on your host (settings ring → USB). Drop in slot1.pngslot6.png and import from the system menu.
NEAREST MATERIAL
Images get fitted to the screen and every pixel becomes the material with the nearest colour. Grain size comes from the image's own resolution, 233×233 down to 77×77 for 1:1 pixels.
MODE — DEFAULT
Recoloured and re-grained, like it was painted on by hand.
MODE — TOP-RIGHT PIXEL PURE WHITE
The scene keeps the image's own colours via per-material palette overrides that travel with the saved scene.

A README.txt with the resolution table and the exact material colour ramps gets generated onto the drive from the renderer's own palette data.

06 — BUILD FROM SOURCE
ESP-IDF v5.5.x, target esp32s3. Every push to main gets built by CI and published here.
idf.py build flash monitor
github.com/nurdism/esp_sand_sim demo video buy the board board wiki