LED Coaster
Introduction
This is a project to create a drinks coaster shaped diffused RGB LED panel that displays moving light patterns. The displayed pattern and colour(s) can be modified using a smartphone.
Background
This project was inspired by the Fireworks LEDs kit that we have on display in our dining room. I thought it would be nice to have another dynamic piece of lighting to accompany it, but this time with hidden circuitry. Given that we have placed a glass paperweight directly on top of the Fireworks kit's LEDs, I decided to create the new piece with a lid in case we also sit an object on top of it.
I wanted the new piece to be more subtle that the Fireworks display, hence the decision to diffuse the light.
At first I was going to make a relatively thin "coaster", containing just an 8×8 RGD LED panel, driven by external circuitry. This left the problem of where to hide the electronics, so I finally decided to incorporate the electronics within the "coaster's" body and to power it via an external USB supply. This decision resulted in the "coaster" being much thicker than a real drinks coaster.
Be warned that this "coaster" isn't a real drinks coaster. The electronics are not waterproof. If you build it do not use for drinks.
Electronics
The electronics were determined by the following criteria:
-
I wanted to use WLED to control the LED panel, for two reasons:
- This saves me from having to program the light sequences myself.
- WLED supports remote control by smartphone.
The choice of WLED necessitated using either an ESP32 or ESP8266 microcontroller. I chose to use the ESP32-C3 super mini because of its small form factor.
- Since the ESP32 is a 3.3V device and the LED panels I had in stock were 5V, some kind of level shifting would be required between the ESP32 and the panel.
- The ESP32 could not safely power the LED panel, so the latter would require its own power supply.
Since all the components had to fit under the LED panel I chose to use an ESP32-C3 super mini microcontroller because its small size.
The circuit is as follows:
Both the ESP32 and the LED matrix are powered from an external 5V supply (USB in this case). The 5V supply is also connected to the HV voltage reference pin of the logic level shifter. The ESP32s 3.3V output is connected to the logic level shifter's LV voltage reference pin. The grounds of the ESP32, logic level shifter and LED matrix are all connected together and to the ground of the USB supply. (Note that the two GND pins of the logic level shifter are connected internally, so it is only necessary to connect one of them to ground.)
The LED matrix control signal comes from ESP32's GPIO2 via the logical level shifter. On the 5V side of the shifter a 100Ω resistor is connected before the matrix signal input.
A 470µF electrolytic capacitor is connected across the ESP32's 5V and GND pins to stabilise the power supply.
Software
WLED was installed on the ESP32 by plugging the microcontroller into a USB port on my laptop and using the WLED installer at https://install.wled.me/ to write the WLED software to the ESP32. WLED version 16.0.0 was used, which was the latest stable version at the time.
The WLED installer was then used to connect the ESP32 to my local WiFi network and the IP and MAC addresses were noted. A web browser was connected to the IP address and the resulting web page was used to display various patterns and colour schemes on the LED matrix. The ESP32 was then unplugged from the laptop.
A test circuit was created on a breadboard to connect the ESP32 to the LED matrix according to the above circuit diagram. My bench power supply provided the required 5V. The circuit was similar to that described in
Having settled on the Soap pattern and Hult 64 colour scheme as the default display, a new preset was created to save this arrangement. The preset was configured to run automatically after power is connected to the ESP32 or after a reset.
Next I entered the ESP32's IP address in my smartphone's browser and experimented using that to change the the pattern and colour scheme.
The test circuit was then torn down.
I did encounter some problems in getting the preset to load after the ESP32 was booted; it kept lighting all LEDs in orange. Some Googling later I solved the problem by:
-
navigating to
http://<esp32-ip-address>/edit; -
editing
presets.jsonto contain just{"0":{}}; - recreating my preset.
- reseting the ESP32.
Enclosure Design
The "coaster's" enclosure is in two parts: the diffuser (or lid) and the frame (or base).
Both parts were designed in TinkerCAD. The CAD designs were saved as STL files. These files can be downloaded from the cahamo/led-coaster repository on GitHub. See the cad directory.
All files are made available under the Creative Commons - Attribution - Share Alike license v4.0 and are copyright © 2026, Peter Johnson.
The frame has two ledges. The upper ledge provides support for the diffuser. The lower ledge is there to support the LED matrix. One corner of the edge has an indentation to make room for the LED matrix's connecting wires. There is also a complex cutout centralised on one side (the back) that accommodates a panel mount USB socket, along with space to get tools in to screw a nut over mounting bolts.
There were two factors that determined the size of the parts of the case:
- The overall height of the frame was determined by the thickness of the LED matrix and the height of the largest electronic component that has to fit below the matrix, in this case the electrolytic capacitor.
- The height of the diffuser was chosen by experimentation so that the individual LEDs were not distinguishable from each other. This ensured that the display is perceived as a wash of light.
Construction
Both parts of the enclosure were 3D printed on a Bambu Labs A1 printer. Black PLA was used for the frame while the diffuser was printed in white PLA. Bambu Labs basic PLA was used in both cases.
Because PLA was used it is important that any object that is placed on the "coaster" is not hot!
A USB type C socket, designed for panel mounting, was inserted into the hole on the back of the "coaster's" frame. M2 nuts and bolts were used to secure it in place.
The LED matrix was then glued onto its ledge in the frame using UHU glue.
The circuit was then soldered up. Components were wired directly to others, using soldered wires. Here's a breakdown of how the circuit was constructed:
- Wires that had previously been attached when testing the LED matrix were shortened.
- The 470µF capacitor was soldered across the ESP32's 5V and GND pins and was bent to be flush with the underside of the LED matrix.
- Header pins were soldered to the logic level shifter to make it easier to solder to the component. The pins were trimmed back in order to fit within the frame.
- Busbars for 5V and ground were created on a small offcut of perfoard.
- 5V and GND connections of the USB input, ESP32, logic level shifter (HV pin) and LED matrix were all wired to the appropriate bus bars.
- The ESP32's 3.3V pin was wired to the logic level level shifter's LV pin.
- The EPS32's GPIO2 pin was connected to the logical level shifter's LV1 pin. The corresponding HV1 pin was soldered to the 100Ω resistor that was in turn soldered to the wire already attached to the LED matrix signal pin. The resistor was insulated with shrink wrap.
Once the circuit was tested all components were stuck to the back of the LED matrix using 20mm Kapton™ tape. I avoided sticking tape over the ESP32's CPU because it gets pretty hot.
Being honest, it took two attempts to solder up the circuit before I got it to work.
The diffuser was left loose rather than gluing it to the frame.
The following photos show the parts of the "coaster" after construction, from left to right, top to bottom: the underside of the frame showing the taped components, the top of the frame with LED matrix, and the underside of the diffuser.
The completed "coaster", with diffuser in place, appears in the following photo:
And finally, heres a short video of the "coaster" running the Soap pattern with the Hult 64 colour scheme:
Finished "coaster" working.