Please wait, loading 3D view...
I designed this PCB around an ESP32-S3 SoC. Its firmware is built with the Espressif IoT Development Framework (ESP-IDF) and the NimBLE Bluetooth Low-Energy (BLE) stack. It responds to to on/off events and configuration updates sent from a mobile phone. It implements the GAP protocol to advertise itself pair to a phone. Then, it listens for GATT events and drives the LEDs (on another board) accordingly.
I used an RTOS to run the BLE stack and LED drivers concurrently. Message queues pass commands and data between tasks.
The ESP32-S3 features a native USB peripheral, so I exposed two GPIOs to a 3-pin header (GND, D+, and D-) labeled PGRM1. I use this header to program and debug the board, and I power the board through its USB-C connector. When mounted in its case, only the USB-C connector, along with a button, are exposed.
A logic level shifter on the LED output ensures that the signal reliably reaches the first LED on the LED grid. The USB differential data traces are routed close together to maximize their noise immunity.
The front of the controller PCB
The back of the controller PCB
This board has 54 individually-addressable LEDs of the WS2812B chipset. It is receives power and data input from the controller PCB (above), and adds a bulk capacitor. This stabilizes the voltage across flashing LED patterns, and prevents the ICs inside of each LED from browning out and corrupting the daisy-chained data signal.
A 9x6 grid of individually-addressable LEDs
Rather than route power traces, the front surface has a 5V plane which the LEDs connect to. This "star"-like configuration minimizes voltage drop and ensures each LED has a similar voltage to reference the data signal to, ensuring reliable data transfer. These LEDs have internal capacitors, so no external decoupling capacitors are needed.
The back layer has a ground plane. The data signals are chained between LEDs on the front surface so that their return paths have an uninterrupted ground plane to flow through.
The lightbox can be turned on and off from a mobile phone. It features the Automation IO BLE characteristic, so a paired phone can write to this value to change the state. In the future, it could support color changing functionality and even animations to take full advantage of the individually-addressable RGB LEDs. I haven't gotten around to building a mobile app, so for now I use the nRF Connect BLE testing app from Nordic Semiconductor to control the lightbox.
The nRF Connect application can connect, bond, and write to the lightbox
A diffusion layer provides a uniform plane of light beneath the lithophane.
The uniform lighting beneath the lithophane
The image produced by the lithophane
© 2026 Rishi Roy
Unless otherwise stated, all images are my own work. (I'm a photographer, after all!)