← All projects
Electronics in progress May 2, 2026 · updated June 10, 2026

LED Matrix Word Clock

A WiFi-synced word clock driven by an ESP32 and a 16x16 addressable LED matrix.

#esp32#leds#pcb#3d-printing
A glowing LED word clock prototype on a workbench
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

June 10, 2026

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.

  1. 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.

  2. 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.

  3. 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.