A clear iPhone 16 Pro case with a small display on the back. An ESP32-C3 drives built-in animations; a companion iOS app selects them over Bluetooth. Powered by the phone's USB-C port, no battery.
| Case A | 1.44" 128×128 color TFT (ST7735) |
| Case B | 8×8 WS2812 LED matrix |
Both run the same firmware core and the same app. The device reports its display type over BLE and the app adapts.
Fifteen built-in, all drawn procedurally at runtime. Nine scene animations:
- Face — eyes that look around, blink, and change expression
- Fisherman — a rower poling his boat across moonlit water
- Runner — a stick figure running laps around the screen edge, pausing to look around
- Sisyphus — pushes his boulder around the screen edge; it always rolls back
- Balloon — a kid chasing a balloon he never catches
- Stargazer — two figures on a hill under a twinkling sky with shooting stars
- Campfire — two figures around a flickering fire under the night sky
- Owl — an owl on a branch scanning for the mouse that crosses below
- Juggler — a stick figure juggling a three-ball cascade
Six low-res animations designed on an 8×8 grid, native to the LED matrix (chunky pixel art on the TFT):
- Rainbow — a color wave sweeping the grid
- Fire — rising-flame heat simulation
- Rain — drops falling at different speeds with fading trails
- Heart — pixel heart with a lub-dub pulse
- Snake — the game, playing itself
- Smiley — big pixel face cycling expressions: smiles, winks, surprise
SwiftUI + CoreBluetooth. Connects automatically, lists the animations the case reports grouped by resolution, sets brightness and playback speed.
The simplest build. Generic modules; any equivalent listing works.
| Part | Qty | Notes |
|---|---|---|
| ESP32-C3 SuperMini | 1 | Any ESP32-C3 SuperMini board |
| 1.44" TFT LCD, 128×128, SPI, ST7735 | 1 | 8-pin module (sold as M029 on AliExpress) |
| Clear TPU case, iPhone 16 Pro | 1 | Soft/flexible, not polycarbonate |
| Short USB-C to USB-C cable | 1 | 15-20 cm, phone to board |
| 3D-printed carrier plate and cover | 1 | Any PLA or PETG |
| Thin hookup wire | ~8 leads | Display to board, ~30 AWG |
Case B swaps the TFT for an 8×8 WS2812 matrix plus a 74HCT04 level shifter, 330 Ω data resistor, and 1000 µF capacitor. Full wiring, pin map, power budget, and BLE protocol: DESIGN.md.
Firmware (PlatformIO), one environment per case:
cd firmware
pio run -e case-a-tft -t upload
pio run -e case-b-matrix -t upload
App: open app/LEDCase.swiftpm in Xcode and run it on an iPhone.
Preview the 128×128 scene animations in a web browser without hardware.
The emulator compiles firmware/src/animations.cpp to WebAssembly. See
emulator/README.md.
cd emulator
./scripts/build-wasm.sh
python3 -m http.server 8080


