Twenty-four little analogue clocks, telling the time as one digital one. The hands sweep into position to form the digits, hold them for a minute, then break formation and do something else entirely before sweeping back.

The finished 24-screen wall running

▶ Watch it run — the digit sweeps and the choreographies, at speed. The motion is the whole point, and a still photograph cannot carry it.

ClockClock 24 by Humans since 1982 is a beautiful piece of kinetic art and well out of my budget. This is the same idea for about €210: twenty-four 1.28″ round LCD panels, eight XIAO ESP32-S3 boards, one custom carrier PCB and ESPHome. It finishes at 27 × 13 cm, 730 g and hangs on two screws.

Why twenty-four panels and not four

The obvious build is four rectangular screens, one per digit, each drawing six little clocks. I built that first:

The four-screen version, showing wide gaps between the digit blocks

The four-screen version. Look at the spacing: the gaps between the digits are wider than the gaps between the clocks inside them, so it reads as four separate blocks rather than one field of clocks.

That is the illusion the original depends on, and it falls apart. So: one round panel per clock, evenly spaced across all twenty-four, the same distance right and down between every pair of faces.

Twenty-four round panels in a printed case, mid-test

All twenty-four panels mounted in the printed case, mid-bring-up with four of the eight columns driven. The case is one printed part with twenty-four round cutouts; the panels sit behind it so only the round glass shows.

How forty-eight hands stay in step

One board has Wi-Fi and SNTP and broadcasts the time down a one-wire UART bus; the other seven listen. Every board runs the same firmware and renders its own three clocks from that shared clock, so the wall is synchronised by construction rather than by anyone coordinating anything.

Eight carrier boards seated and chained inside the case

All eight carriers seated and chained, before the face plate goes on. One 4-pin cable per hop carries power and the sync line together — that is the entire harness. Only one board has a voltage regulator fitted; the scale underneath reads 730 g.

Each board drives one column of the wall: three panels on one SPI bus. It also means only one board is ever reflashed to change what the wall does — the seven listeners carry no network stack at all, which is exactly why they never need one.

One rule: it cannot jump

It is an analogue clock. A hand sweeps; it never teleports. Every choreography is written as a continuous function of time, and moving between two of them fades each hand from where it is into where the new mode wants it, staggered column by column so the change reads as a gesture crossing the wall rather than a cut.

That is easy to break and hard to catch by eye — a modulo that wraps 360° to 0° in the wrong place is a hand crossing the dial in a single frame. So there is a headless regression check that drives every mode through its entire lifecycle and reports the largest single-frame movement of any of the forty-eight hands. A normal sweep is a few degrees. A bug is ninety.

Patterns: choreographies that are data, not firmware

Alongside the built-in modes — wave, wind, rotating_maze, zipper, mirror_wave, spiral, love, the temperature and more — a pattern is twenty-four poses and motions stored as one line of text.

The pattern editor: pose each clock, give each hand a direction and a speed

The editor is the firmware's own engine running in a browser — same choreographies, same easing, same geometry. Pose each clock's hands, give each hand a direction and a speed, press Send.

A speed can be fixed, or “the same as my neighbour, plus or minus a bit”, so a gradient across the whole wall is one number instead of eight. On Send, the master saves the pattern to flash and pushes it down the sync bus: twenty-four real clocks are running it a second later, with nothing recompiled and nothing reflashed, not even the master.

Because every hand is pose + direction × speed × rate × time, a pattern is continuous whatever numbers you give it. It cannot make a hand jump however badly it is drawn, which is what makes it safe...

Read more »