LedDisplay — CircuitPython matrix clock

A clock running on a Matrix Portal S3 driving a 64×64 RGB LED matrix, with a full investigation of an undocumented panel scan mode.

CircuitPython Adafruit Matrix Portal S3 HUB75 RGB LED matrix

View source →

Problem

I wanted a way to passively signal when I’m in a meeting — so people don’t interrupt — and have it double as a nice-looking clock the rest of the time.

Approach

Build it on an Adafruit Matrix Portal S3 — a microcontroller purpose-built for driving HUB75 RGB LED panels and well-supported by Adafruit’s own panel lineup. Start with a single panel to get the core clock working, then scale up to two, three, or four panels depending on how much information I want on the display at once.

What I built

A highly customizable digital clock that shows time, date, and weather, with room to overlay dynamic information on top — for example an incoming-call indicator, an “in a meeting” message, or the currently playing Spotify track.

The scan-mode investigation

Driving the panel at its full unique resolution didn’t work out of the box. Across every standard adafruit_matrixportal.matrix.Matrix configuration — varying tile_rows, serpentine, and alt_addr_pins — the library duplicated half the framebuffer onto the other half.

The HUB75 connector silkscreen showed why: GND where the E address pin would be, so the panel is 1/16 scan. Only the A/B/C/D address lines are wired, which can directly address 32 rows; the rest must be reached via a panel-internal mechanism not exposed on HUB75. And the board has no driver- chip markings to look up.

Three viable paths forward: design for the smaller effective resolution, switch to a Raspberry Pi + Adafruit RGB Matrix Bonnet with hzeller’s rpi-rgb-led-matrix (which exposes --led-multiplexing, --led-row-addr-type, and --led-panel-type for exactly this case), or swap in a panel with a wired E line.

What I learned