LED Matrix Word Clock
A WiFi-synced word clock driven by an ESP32 and a 16x16 addressable LED matrix.
- Status
- in progress
- Category
- Electronics
- Time spent
- ~25 hours so far
- Total cost
- $53.24
- Build updates
- 3
A word clock that tells the time in glowing words on a 16×16 grid of addressable LEDs. It syncs over WiFi via NTP, auto-dims at night with a light sensor, and hides the electronics behind a laser-cut letter mask and an oak bezel.
This page is the overview — the bench-level play-by-play lives in the build log at the bottom, posted as I make progress.
Gallery
Parts & cost
| Part | Qty | Unit | Subtotal |
|---|---|---|---|
| ESP32 DevKitC | 1 | $8.50 | $8.50 |
| WS2812B addressable LEDs (reel of 300) | 1 | $22.00 | $22.00 |
| 5V 4A power supply | 1 | $12.99 | $12.99 |
| Photoresistor (light sensor) | 1 | $0.75 | $0.75 |
| Laser-cut letter mask (acrylic) | 1 | — | — |
| Oak for the bezel | 1 | $9.00 | $9.00 |
| Total | $53.24 | ||
Learnings
- Serpentine LED layouts need an (x, y) → index mapping or the text comes out mirrored on every other row.
- 256 LEDs at full white pull far more current than a USB port can supply — size the PSU for worst case, not typical.
● Latest update
Carrier PCB routed in KiCad
Spent the weekend turning the breadboard prototype into a real PCB in KiCad: ESP32 module, the 5V power input with proper bulk capacitance for the LED current spikes, the photoresistor divider, and a clean header out to the panel.
Sending it off to fab this week. Once the boards are back I can finish the oak bezel and call the electronics done.
Build log
All project logs →-
May 2, 2026 First light on the matrix Got all 256 LEDs addressable and figured out the serpentine mapping.
First milestone: get the panel lit and individually addressable. The panel is wired in a serpentine pattern, so even rows run left-to-right and odd rows right-to-left. Without accounting for that, text comes out mirrored on every other row. The mapping that fixed it:
uint16_t xyToIndex(uint8_t x, uint8_t y) { return (y % 2 == 0) ? y * 16 + x : y * 16 + (15 - x); }With that in place I could light arbitrary (x, y) pixels and start laying out where each word sits on the grid.
-
May 20, 2026 WiFi + NTP time sync working The clock now sets itself over the network — no RTC drift to worry about.
Wired up WiFi and pulled time from an NTP server. This sidesteps the usual real-time-clock drift entirely — every boot (and a periodic re-sync) the clock sets itself from the network.
Next up is the photoresistor for auto-dimming, then I want to get off the breadboard and design a proper carrier PCB.
-
June 10, 2026 Carrier PCB routed in KiCad Replacing the breadboard rats-nest with a proper board.
Spent the weekend turning the breadboard prototype into a real PCB in KiCad: ESP32 module, the 5V power input with proper bulk capacitance for the LED current spikes, the photoresistor divider, and a clean header out to the panel.
Sending it off to fab this week. Once the boards are back I can finish the oak bezel and call the electronics done.