Ticker build guide v2 · 3D · app · 2026-10-30

Progress is saved on this phone.

Concept render of the PIN Desk Ticker on a desk (AI image, not a photo)
Concept render (AI image, not a photo of a built ticker; the CAD below is what the files make)
Concept render

A desk-sized scrolling LED ticker, like a Wall Street ticker, but it shows whatever you want.

  • Custom text: type anything on your phone and it scrolls across 32 x 8 full-colour pixels.
  • Prices: BTC and SPY with green up / red down / amber alert colours, from a tiny feed script on your Mac.
  • Weather: current temperature and sky from Open-Meteo (no account, no key).
  • Colours and effects: any colour, brightness and speed from the WLED app; presets for up/down/alert.
  • Control app: type anything, pick scroll / static / bounce, speed, font, colours, effects; save presets and schedules. Runs on your phone and Mac (from the ticker itself); try the demo in Stage 7.
  • Alexa: "Alexa, turn on Ticker", brightness, presets and routines ("Alexa, market mode") by voice, via WLED's built-in Hue emulation. Your own words by voice: a free Siri Shortcut.
CAD render: lit 34
CAD render · lit 34 (from cad/ticker.py)
338 x 92 mmfront (13.3 x 3.6 in)
40 mmcase depth
32 x 8full-colour pixels
10 stages73 steps

Parts (CART.md, priced 2026-10-29, nothing bought)

#PartQtyPriceLink
1WS2812B 8x32 LED matrix (256 px, flexible)
BTF-LIGHTING ECO 8X32
1$17.99B088BTXHRG
2ESP32 Wi-Fi board (runs WLED)
AITRIP 2PCS ESP32-WROOM-32 USB-C, CP2102
1 (2-pack)$14.99B0HD9VJG9V
3Level shifter chip SN74AHCT125N
VANXY 12pcs SN74AHCT125N DIP-14
1 (12-pack)$7.59B0GHN5GY56
45V 6A power supply (5.5 mm barrel)
ALITOVE Upgrade 5V 6A 30W
1$17.99B0GX5N2DKV
5Panel-mount DC jack 5.5x2.1, pre-wired
DaierTek 6pcs METAL, 18 AWG 15 cm
1 (6-pack)$9.99B0BD46CP5Y
61000 uF 16V capacitor (optional, recommended)
E-Projects 5-pack
1 (5-pack)$6.63B07YN6DS58
7Smoked acrylic front, 1/8 in
Sibe-R-Plastics 12 x 24 in dark gray transparent #2074
1$14.15
+ $11.30 delivery
B0859KVQTT

Parts: $100.63 before tax (lines 1-7; $94.00 without the optional cap; Amazon-fulfilled $75.18 ships free)

3D print (case + base): ~$30-60 (est.), an estimate until a real Craftcloud quote (~448 g of PLA est., out/print_sheet.md)

All-in: ~$131-161 + tax (est.)

Reused from spares ($0): ruthex M3 heat-set inserts, HVAZI M3 socket-cap screws, 2 mm stainless rod, 26 AWG silicone wire, blue + black, Heat-shrink kit + zip ties, 3M VHB tape. (Plus a scrap of perfboard: check you have one.)

Prices change; links are plain product links (no affiliate tags). Anthony approves every purchase.

  • Work through the stages in order. Each stage ends with a STOP checkpoint. The next stage stays locked until every step in this stage is ticked and the STOP box is ticked.
  • Stage 2 and Stage 4 also have a PASS CHECK: type in what you measured (LED count, volts, current). The STOP box only unlocks when the numbers are in range. Don't fake them: Stage 4 is the one that keeps the wiring cool.
  • Every stage opens with a 3D view: tap a part for its name, cart line and where it goes; Play flies the step's parts into place; Exploded spreads everything out. Each step has a Show in 3D button.
  • (est.) means estimate. Where a part's size or thread wasn't confirmed it says assumed: measure yours.
  • Ticks and pass-check answers are saved on this phone only.
  • Mains: the only thing that touches the wall socket is the sealed ALITOVE power brick. Never open it, never cut its wall cord. Everything inside the ticker is 5 V.
  • Don't power the panel from USB. 256 LEDs can pull several amps; a laptop or ESP32 USB port gives 0.5-3 A. The panel always runs from the 5V 6A supply through the DC jack. The ESP32 takes its 5 V from the same rail.
  • Current limit: set WLED's brightness limiter (ABL) before full brightness. Bench tests: 1,500 mA. Finished ticker: 4,500 mA (the 6 A supply then has headroom). Full white with no limit is about 15 A (0.3 W x 256 LEDs / 5 V, BTF figure): never do that.
  • Capacitor polarity: the stripe (minus) leg goes to GND. Backwards, an electrolytic cap can bulge or burst. Wear glasses for the first power-on.
  • USB + power supply at the same time: for USB flashing, unplug the 5V supply first unless you know your board has a diode on its USB 5V line. Normal updates go over Wi-Fi (OTA), so you rarely need USB once it's built.
  • Soldering: iron in its stand, glasses on, a fan pulling the smoke away, unplug when done. Heat-set inserts: the iron touches brass, not your fingers.
  • Acrylic: score away from your hand; snapped edges are sharp until sanded.
WhatValueWhere it comes from
Finished front338 x 92 mm (13.3 x 3.6 in)cad/ticker.py, PRD
Case depth40.4 mmcad/ticker.py
On the desk358 x 84 x ~102 mm with the basecad/export.py
Panel320 x 80 mm, 32 x 8 px, 10 mm pitchCART.md / BTF listing
Acrylic cut size330 x 86 mm (from the 12 x 24 in sheet)cad/ticker.py
Window324 x 79.5 mm, 45 deg bevel: every LED row visible from 0-35 deg up, +-30 deg sidewayscad/sightline.py
LED data pinGPIO16 (WLED's default on ESP32)this guide
Brightness limit (ABL)1,500 mA bench, 4,500 mA finishedCART.md / PRD
Supply5 V 6 A, 5.5 x 2.1 mm, centre +CART.md row 4
Screws16 x M3x10 (rear covers + base), 2 x M3x12 (shell joint)cad/ticker.py
Inserts18 ruthex M3 (12 rear, 2 joint, 4 base)cad/ticker.py
Cross-section: bezel, acrylic, grid, LEDs, panel, electronics gap, rear plate
Diagram · Cross-section: bezel, acrylic, grid, LEDs, panel, electronics gap, rear plate
  • WLED: free open-source LED firmware for the ESP32 (kno.wled.ge). Web page, phone app, JSON API, Alexa.
  • ABL: WLED's Automatic Brightness Limiter: caps brightness so the estimated current stays under your number.
  • Level shifter (74AHCT125): turns the ESP32's 3.3 V data signal into a clean 5 V signal for the LEDs.
  • Serpentine (zig-zag): the LED chain runs down one column and back up the next.
  • Heat-set insert: a brass thread pressed into plastic with a hot iron, so screws can go in and out many times.

Goal: Find every part, check nothing is damaged, and have every tool on the table. No soldering yet.

3D view Stage 0 overview

Drag to turn · pinch to zoom · two fingers to pan · tap a part for its name.

Tick Found when you have the part, or Missing if you can't find it. Missing only blocks the stage that needs it (the card says which).

Note: Prices and links are from CART.md (read off the live pages 2026-10-29, Orrin). Nothing has been bought yet: Anthony approves the purchase. Packs give spares (1 extra ESP32, 11 chips, 5 jacks, 4 caps).

Parts to buy (CART.md)

Cart line 1 · WS2812B 8x32 LED matrix (256 px, flexible) qty 1

Thin flexible black circuit board, 320 x 80 mm, 256 square LEDs in a 32 x 8 grid. Wire leads with 3-pin connectors at both short ends; an arrow on the board shows the data direction.

BTF-LIGHTING ECO 8X32 · B088BTXHRG · $17.99 · Needed in stage 2

FoundMissing

Cart line 2 · ESP32 Wi-Fi board (runs WLED) qty 1 (2-pack)

Small board about 52 x 28 mm (size assumed), silver metal can (the WROOM-32 module) at one end, USB-C at the other, two rows of pins underneath. Two in the pack: one is a spare.

AITRIP 2PCS ESP32-WROOM-32 USB-C, CP2102 · B0HD9VJG9V · $14.99 · Needed in stage 2

FoundMissing

Cart line 3 · Level shifter chip SN74AHCT125N qty 1 (12-pack)

Black 14-pin chip (DIP-14), about 19 x 6.6 mm body, printed 'AHCT125'. A notch or dot marks pin 1.

VANXY 12pcs SN74AHCT125N DIP-14 · B0GHN5GY56 · $7.59 · Needed in stage 3

FoundMissing

Cart line 4 · 5V 6A power supply (5.5 mm barrel) qty 1

Black power brick with a wall cord and a 5.5 x 2.1 mm barrel plug. Label: 5V 6A, centre positive.

ALITOVE Upgrade 5V 6A 30W · B0GX5N2DKV · $17.99 · Needed in stage 2

FoundMissing

Cart line 5 · Panel-mount DC jack 5.5x2.1, pre-wired qty 1 (6-pack)

Metal threaded barrel socket with a nut, red and black 18 AWG wires already soldered on (15 cm).

DaierTek 6pcs METAL, 18 AWG 15 cm · B0BD46CP5Y · $9.99 · Needed in stage 2

FoundMissing

Cart line 6 · 1000 uF 16V capacitor (optional, recommended) qty 1 (5-pack)

Can about 10 x 20 mm (est.), two legs. A light stripe with minus signs marks the NEGATIVE leg; the longer leg is positive.

E-Projects 5-pack · B07YN6DS58 · $6.63 · Needed in stage 4

CART.md: the buy box said 'add to cart to see price'; $6.63 is the same item in 'Frequently bought together'. Confirm at checkout.

FoundMissing

Cart line 7 · Smoked acrylic front, 1/8 in qty 1

Dark grey see-through sheet 12 x 24 in, 1/8 in (3.0-3.2 mm) thick, protective film both sides.

Sibe-R-Plastics 12 x 24 in dark gray transparent #2074 · B0859KVQTT · $14.15 + $11.30 delivery · Needed in stage 5

FoundMissing

Printed parts (out/*.stl)

Printed · Front shell, left half (shell_L.stl) qty 1

Matte black, 169 x 92 x 37 mm: the left half of the bezel with the window, acrylic rebate and panel pocket. Joint block with a screw pocket at the cut end.

out/shell_L.stl (+ .3mf) · Picture = CAD render · Needed in stage 1

FoundMissing

Printed · Front shell, right half (shell_R.stl) qty 1

Matte black, the right half: same, plus the USB-C slot in its end wall and an insert hole in each joint block.

out/shell_R.stl (+ .3mf) · Picture = CAD render · Needed in stage 1

FoundMissing

Printed · Louvre grid, left half (grid_L.stl) qty 1

Matte black 6 mm deep grid of 10 mm square cells, 160.6 x 80 mm. Owns the centre divider.

out/grid_L.stl (+ .3mf) · Picture = CAD render · Needed in stage 1

FoundMissing

Printed · Louvre grid, right half (grid_R.stl) qty 1

Matte black grid, 159.4 x 80 mm (no divider on its cut edge).

out/grid_R.stl (+ .3mf) · Picture = CAD render · Needed in stage 1

FoundMissing

Printed · Rear cover, left half (rear_L.stl) qty 1

Matte black 3 mm plate with vent slots, 3 pressure ribs and 6 screw holes.

out/rear_L.stl (+ .3mf) · Picture = CAD render · Needed in stage 1

FoundMissing

Printed · Rear cover, right half (rear_R.stl) qty 1

Matte black plate with the jack hole, ESP32 cradle, perfboard rails, cap cradle, 2 wire clips, 2 pressure ribs and zip-tie slots.

out/rear_R.stl (+ .3mf) · Picture = CAD render · Needed in stage 1

FoundMissing

Printed · Base, left half (base_L.stl) qty 1

Walnut-look wood-fill PLA, a slim 179 x 84 x 13.5 mm plinth with a tilted pocket (it has a floor), 2 screw holes underneath.

out/base_L.stl (+ .3mf) · Picture = CAD render · Needed in stage 1

FoundMissing

Printed · Base, right half (base_R.stl) qty 1

Wood-fill PLA, the right half of the base.

out/base_R.stl (+ .3mf) · Picture = CAD render · Needed in stage 1

FoundMissing

Spares from the skimmer (REUSE.md)

Spare · ruthex M3 heat-set inserts (18 used) qty -

Small knurled brass cylinders, M3 x 5.7 mm. ~86 left after the skimmer.

From the skimmer spares (REUSE.md), $0 · Needed in stage 1

FoundMissing

Spare · HVAZI M3 socket-cap screws: 16 x M3x10, 2 x M3x12 qty -

Stainless socket-head screws from the M3 kit; 2.5 mm hex key. M3x12 assumed in the kit: check.

From the skimmer spares (REUSE.md), $0 · Needed in stage 1

FoundMissing

Spare · 2 mm stainless rod (4 pins x 11 mm) qty -

uxcell 304 rod, 2 x 100 mm (11 left). Cut 4 pieces 11 mm long.

From the skimmer spares (REUSE.md), $0 · Needed in stage 1

FoundMissing

Spare · 26 AWG silicone wire, blue + black qty -

Thin soft wire: data and the small 5V/GND taps only. Power runs on the jack's 18 AWG and the panel's own leads.

From the skimmer spares (REUSE.md), $0 · Needed in stage 3

FoundMissing

Spare · Heat-shrink kit + zip ties qty -

Sopoby heat-shrink assortment, GTSE 4 in zip ties.

From the skimmer spares (REUSE.md), $0 · Needed in stage 3

FoundMissing

Spare · 3M VHB tape qty -

Grey double-sided foam tape, 12 mm wide. 4 small pads hold the panel to the grid.

From the skimmer spares (REUSE.md), $0 · Needed in stage 5

FoundMissing

Spare · Perfboard ~30 x 40 mm qty -

Plain 2.54 mm-pitch prototype board, cut to 30 x 40 mm. Not in REUSE.md: any scrap perfboard (check you have one).

From the skimmer spares (REUSE.md), $0 · Needed in stage 3

FoundMissing

Steps

0.1 Check the LED panel and find its input end

⏱ 5 min (est.) · Parts: LED panel (row 1) · Tools: eyes

Finding the panel's input end
Diagram · Finding the panel's input end
3D stand-in: panel
3D stand-in at true size (not a photo; sizes from CART.md / assumed)

Lay the panel LEDs-up on a clean table. Look for kinked corners or LEDs knocked off.

Turn it over. Find the small arrow printed along the board and the pads/wires labelled DIN (data in), 5V and GND at one short end. That is the input end. The other end says DOUT.

Stick a bit of masking tape on the input end and write IN.

Pass: No damage; input end found and labelled.

Don't do yet: Don't bend the panel sharply or fold it: the flex board cracks.

0.2 Check the ESP32 boards

⏱ 3 min (est.) · Parts: ESP32 (row 2) · Tools: eyes

3D stand-in: esp32
3D stand-in at true size (not a photo; sizes from CART.md / assumed)

Find the labels next to the pins: GPIO16 (may say 16 or RX2), 5V (or VIN) and GND. Find the two small buttons (EN and BOOT) and the USB-C socket.

Put the second board back in its bag: it's the spare.

Pass: Both boards undamaged; you know where 16, 5V and GND are.

0.3 Check the level-shifter chips

⏱ 2 min (est.) · Parts: SN74AHCT125N (row 3) · Tools: eyes

SN74AHCT125N pin map with what each pin connects to
Diagram · SN74AHCT125N pin map with what each pin connects to

Read the print on one chip: it must say AHCT125 (not HC125 or HCT125 from another drawer). Find the notch or dot: that end is pin 1.

Pass: Chip reads AHCT125, legs straight.

0.4 Check the power supply label

⏱ 2 min (est.) · Parts: power supply (row 4) · Tools: eyes

3D stand-in: psu plug
3D stand-in at true size (not a photo; sizes from CART.md / assumed)

Read the label: 5V 6A output, barrel plug, the polarity symbol shows centre positive (the dot in the middle connects to +).

Pass: 5 V, 6 A, centre positive.

Don't do yet: Don't plug it in yet.

0.5 Check which jack wire is + with the meter

⏱ 5 min (est.) · Parts: DC jack (row 5) · Tools: multimeter

Meter: jack centre pin to the red wire
Diagram · Meter: jack centre pin to the red wire

Meter on beep. One probe on the jack's centre pin, the other on the red wire's bare end.

Then the outer metal sleeve to the black wire.

Pass: Centre pin beeps to red, sleeve beeps to black. If yours is the other way round, swap the colours in every later step and mark the wires with tape.

0.6 Check the capacitor marking

⏱ 1 min · Parts: capacitor (row 6) · Tools: eyes

Capacitor polarity: stripe to GND
Diagram · Capacitor polarity: stripe to GND

Find 1000 uF and 16V (or higher) on the can. Find the light stripe with minus signs: that leg is negative (GND). The longer leg is positive.

Pass: 1000 uF, >= 16 V, stripe found.

0.7 Check the acrylic, keep the film on

⏱ 2 min · Parts: acrylic sheet (row 7) · Tools: eyes

3D stand-in: acrylic
3D stand-in at true size (not a photo; sizes from CART.md / assumed)

Peel back a tiny corner of the film to see the smoked colour, then press it back. The film stays on until Stage 5.

Pass: Sheet uncracked, 1/8 in thick (3.0-3.2 mm on calipers).

0.8 Lay out the spares and tools

⏱ 10 min (est.) · Parts: inserts, screws, rod, wire, heat shrink, VHB, perfboard · Tools: every tool in the Tools list

3D stand-in: inserts
3D stand-in at true size (not a photo; sizes from CART.md / assumed)
3D stand-in: joint pins
3D stand-in at true size (not a photo; sizes from CART.md / assumed)

Count out 18 inserts, 16 x M3x10 and 2 x M3x12 screws, and cut 4 pins of 2 mm rod, 11 mm long (saw, then file the ends smooth).

Put every tool from the Tools list (Stage 1 cards) on the table.

Pass: All counted; tools laid out.

STOP 0: checkpoint

  • Every cart line, printed part and spare is ticked Found or Missing.
  • Panel input end labelled IN; jack red = centre (+) confirmed with the meter.
  • The missing list (shown here) is written down.

Troubleshooting, Stage 0

SymptomLikely causeFix
Chip says HC125 or HCT125Wrong chip from another drawerUse only AHCT125 (the VANXY pack). HCT may work; HC won't
Can't find GPIO16 labelSome boards print 'RX2' or just '16'Use the pinout on the seller's listing; on 38-pin boards it's next to 17 (TX2)
Jack red goes to the sleeveWired the other way at the factorySwap the meaning of the colours; label the wires + and -
No M3x12 in the kitKit sizes varyM3x10 works in the joint too (5 mm of thread engagement)

🔒 Locked: finish Stage 0 first (every tick, its STOP box). You can read ahead.

Goal: Get the 8 printed parts, check they fit, press in 18 heat-set inserts and dry-fit every half.

3D view Stage 1 overview

Drag to turn · pinch to zoom · two fingers to pan · tap a part for its name.

Note: Printing is ordered by Anthony (Craftcloud quote from the STL/3MF files in out/; out/print_sheet.md lists them). Print cost is ~$30-60 (est.) until a real quote. Nobody orders from this guide.

Tools (pictures are illustrations: any similar tool is fine)

Temperature-controlled soldering iron + stand

Used in steps: 1.4, 3.3, 3.4, 3.5, 3.6, 4.3, 4.4, 4.5

Thin rosin-core solder (0.5-0.8 mm)

Used in steps: 3.3, 3.4, 3.5, 3.6, 4.3, 4.4, 4.5

Multimeter (DC volts, beep)

Used in steps: 0.5, 3.7, 4.2, 4.7, 4.8, 4.10

Wire strippers (18 + 26 AWG)

Used in steps: 3.3, 4.3

Flush cutters

Used in steps: 4.6

Heat gun (heat shrink)

Used in steps: 4.3

2.5 mm hex key (M3 screws)

Used in steps: 1.5, 5.2, 6.1, 6.2, 6.4

Digital calipers

Used in steps: 1.2

Hobby knife + plastic scoring knife

Used in steps: 1.3, 3.1, 5.1

Metal straightedge / ruler

Used in steps: 3.1, 5.1

240 grit sandpaper + small file

Used in steps: 1.3, 3.1, 5.1

Alligator-clip test leads (about 6)

Used in steps: 2.4, 3.8

Helping hands or masking tape

Used in steps: general

USB-C DATA cable (not charge-only)

Used in steps: 2.1, 2.2, 6.2

Computer with Chrome or Edge

Used in steps: 1.1, 2.1, 2.2, 2.3, 2.5, 2.6, 2.9, 7.1, 7.2, 9.1, 9.2, 9.3 ...

Phone (WLED app, Alexa app)

Used in steps: 2.3, 2.5, 2.6, 2.7, 2.8, 2.9, 4.9, 4.10, 4.11, 5.6, 7.2, 7.3 ...

Safety glasses

Used in steps: 1.4, 5.1

Small saw or rotary tool (2 mm rod)

Used in steps: general

Steps

1.1 Get a print quote with the right settings

⏱ 15 min (est.) · Parts: out/*.stl or out/*.3mf (8 files) · Tools: computer

Print settings for the quote
Diagram · Print settings for the quote
CAD render: assembly front
CAD render · assembly front (from cad/ticker.py)

Upload the 8 files. Settings: PLA, matte black for shell, grid and rear cover halves; wood-fill PLA (walnut) for the two base halves. 0.2 mm layers, 3-4 walls, 15-20 % infill, no supports.

Orientation is already set in the files: shells and grids front face down, rear covers outer face down, base flat bottom down.

PartQtyMaterialEst. weight
shell_L, shell_R1 + 1matte black PLA~70 g each (est.)
rear_L, rear_R1 + 1matte black PLA~58 / ~62 g (est.)
grid_L, grid_R1 + 1matte black PLA~25 g each (est.)
base_L, base_R1 + 1wood-fill PLA~71 g each (est.)

Pass: Quote shows all 8 parts in the right material; no supports added.

Don't do yet: Don't let the print service rotate the shells: front face down gives the clean bezel.

1.2 Measure the prints

⏱ 10 min (est.) · Parts: all 8 printed parts · Tools: digital calipers

CAD render: shell L
CAD render · shell L (from cad/ticker.py)
CAD render: shell R
CAD render · shell R (from cad/ticker.py)

Join each shell half's pocket edges in your head: measure the panel pocket (should be 160.5 mm per half along, 81 mm tall) and the acrylic rebate (86.6 mm tall, 3.4 mm deep).

Lay each long part on a flat table: no rocking (warp).

Pass: Within about 0.3 mm of the numbers; nothing warped more than about 0.5 mm (est.).

1.3 Clean up holes and edges

⏱ 10 min (est.) · Parts: shells, rear covers, base · Tools: hobby knife, sandpaper

CAD render: rear R
CAD render · rear R (from cad/ticker.py)

Trim any strings in the window, the USB-C slot and the vents. Lightly sand the cut faces at the split so the halves meet flat.

Pass: Halves meet with no gap you can see light through.

1.4 Press the 18 heat-set inserts

⏱ 30 min (est.) · Parts: 18 ruthex M3 inserts, shell halves · Tools: soldering iron, glasses

Pressing a heat-set insert
Diagram · Pressing a heat-set insert

Iron about 220 C for PLA (est.; check the insert pack). Set an insert on its hole, press straight down slowly with the iron tip until it's flush, lift straight off.

WhereHow manyHole faces
Rear-cover bosses (top + bottom walls, back edge)12 (6 per half)the back
Joint blocks, RIGHT half only (cut face)2the split, toward the left half
Base bosses (bottom wall)4 (2 per half)down, through the bottom

Pass: All 18 flush and straight: an M3 screw goes in by hand without forcing.

Don't do yet: Don't push sideways or the insert tilts. Don't overheat: the boss melts out.

1.5 Dry-fit the two shell halves

⏱ 10 min (est.) · Parts: shell_L, shell_R, 2 pins, 2 x M3x12 · Tools: 2.5 mm hex key

Shell joint: pins, M3x12 screw and insert
Diagram · Shell joint: pins, M3x12 screw and insert

Push the two 2 mm pins into the joint blocks of the left half (top and bottom). Bring the halves together. From inside the left half, put an M3x12 through each screw pocket into the right half's insert and snug it.

Run a finger over the front seam.

Pass: Front seam flush (no step you can feel), window straight.

Don't do yet: Don't overtighten: snug only. They come apart again for Stage 5.

1.6 Dry-fit the grid, rear covers and base

⏱ 10 min (est.) · Parts: grid_L/R, rear_L/R, base_L/R, 2 pins · Tools: -

CAD render: grid L
CAD render · grid L (from cad/ticker.py)
CAD render: base L
CAD render · base L (from cad/ticker.py)

Grid halves: they just sit side by side (the left one owns the centre divider).

Rear covers: lay them on the back of the shell; the 12 holes line up with the inserts.

Base: push 2 pins into one half, join the halves; the pocket is one continuous recess.

Pass: Everything lines up; the shell's bottom sits in the base pocket leaning back about 10 deg.

STOP 1: checkpoint

  • 8 prints checked, sized and cleaned.
  • 18 inserts in, straight.
  • Shell halves join flush; base halves join; rear covers line up.

Troubleshooting, Stage 1

SymptomLikely causeFix
Insert went in crookedPressed at an angleReheat and pull it out with the iron + pliers; fill and redo, or skip that one (11 others hold)
Halves don't meetElephant foot or a blob at the cut faceSand the cut face flat on sandpaper on a table
Shell warpedLong thin print cooled unevenlyAsk for a brim / enclosure reprint; the acrylic and screws pull small warps flat
Wood-fill base is roughWood-fill textureSand 240 grit; wipe on a little furniture oil or wax for a walnut look

🔒 Locked: finish Stage 1 first (every tick, its STOP box). You can read ahead.

Goal: WLED on the ESP32, on your Wi-Fi, and the panel lighting every pixel the right way round, on the bench.

3D view Stage 2 overview

Drag to turn · pinch to zoom · two fingers to pan · tap a part for its name.

Warning: Bench setup: the panel runs from the 5V supply, the ESP32 runs from the computer's USB. Only the GND wires are joined between them. Never join the USB 5V and the supply's 5V.

2.1 Install the USB driver if the board doesn't show up

⏱ 5 min (est.) · Parts: ESP32 · Tools: computer, USB-C cable

3D stand-in: esp32
3D stand-in at true size (not a photo; sizes from CART.md / assumed)

Plug the ESP32 into the computer with a data USB-C cable. On a Mac, recent macOS usually sees the CP2102 on its own. If no port appears in the next step, install the Silicon Labs CP210x VCP driver from silabs.com and allow it in System Settings > Privacy & Security.

Pass: The board's red power LED is on.

2.2 Flash WLED from install.wled.me

⏱ 5 min (est.) · Parts: ESP32 · Tools: computer (Chrome or Edge), USB-C cable

Flash WLED from install.wled.me
Diagram · Flash WLED from install.wled.me

Open install.wled.me in Chrome or Edge (Safari can't do Web Serial). Pick the latest stable release, click Install, choose the port that says CP2102 / usbserial, and wait for 'Installation complete'.

If it can't connect: hold the BOOT button, click Install, let go when it starts writing.

Pass: Installer says done; the board restarts.

Don't do yet: Don't plug the panel or the 5V supply into the ESP32 yet.

2.3 Join WLED to your Wi-Fi

⏱ 5 min (est.) · Parts: ESP32 · Tools: phone or computer

Flash WLED from install.wled.me
Diagram · Flash WLED from install.wled.me

The installer can send your Wi-Fi details directly. If not: join the Wi-Fi network WLED-AP (password wled1234), a page opens; WiFi Settings: enter your home network.

Same page: set mDNS address to ticker (so it's http://ticker.local) and note the IP address it shows.

Pass: You can open http://ticker.local (or the IP) from your phone on home Wi-Fi.

2.4 Wire the bench test

⏱ 10 min (est.) · Parts: panel, DC jack, PSU, ESP32 · Tools: clip leads

Bench test wiring with clip leads
Diagram · Bench test wiring with clip leads

PSU unplugged. Clip: jack red to panel 5V, jack black to panel GND.

Clip: ESP32 GPIO16 to panel DIN (directly for now; the level shifter comes in Stage 3).

Clip: ESP32 GND to panel GND (the common ground).

ESP32 stays on the computer's USB.

Wiring:

FromToWire
Jack red (+)Panel 5Vclip lead
Jack black (-)Panel GNDclip lead
ESP32 GPIO16Panel DINclip lead
ESP32 GNDPanel GNDclip lead (common ground)

Pass: 4 clips on, nothing touching anything else.

Don't do yet: Don't connect ESP32 5V/VIN to anything in this stage.

2.5 Set LED Preferences (and a 1,500 mA bench limit)

⏱ 5 min (est.) · Parts: ESP32 · Tools: phone or computer

WLED LED Preferences
Diagram · WLED LED Preferences

WLED > Config > LED Preferences:

SettingValue
LED typeWS281x
Colour orderGRB
Length256
Data GPIO16
Automatic Brightness LimiterON, max current 1500 mA (bench)
LED voltage / current per LED5 V, 55 mA (WLED default)

Save. Now plug the PSU into the wall and into the jack.

Pass: WLED reboots; the panel may light the default orange.

Don't do yet: Don't set the limit higher on clip leads.

2.6 Set up the 2D matrix

⏱ 5 min (est.) · Parts: ESP32 · Tools: phone or computer

2D matrix wiring order: vertical serpentine
Diagram · 2D matrix wiring order: vertical serpentine

Config > 2D Configuration: Strip or panel = 2D Matrix, panel 32 wide x 8 high, one panel. Start with: first LED top left, vertical, serpentine ON (what BTF 8x32 owners report; your panel may differ, so the test below decides).

Pass: Saved.

2.7 All-pixels and colour test

⏱ 5 min (est.) · Parts: panel · Tools: phone

All-pixels and colour test
Diagram · All-pixels and colour test

Main page: effect Solid, colour white, brightness about 10 %. Count: every LED lit, no dark ones.

Then Solid red, green, blue: each must show its own colour.

Pass: 256 lit; red shows red (write the numbers in the PASS CHECK below).

2.8 Orientation test with scrolling text

⏱ 10 min (est.) · Parts: panel · Tools: phone

Orientation test results and fixes
Diagram · Orientation test results and fixes

Effect Scrolling Text. Segment name (pencil icon on the segment) = TICKER 123. Hold the panel with the input end on the RIGHT as seen from the front (that's how it sits in the case).

What you seeFix in 2D Configuration
Reads correctly, moves right to leftNothing: done
Mirrored left-rightChange first LED left <-> right
Upside downChange first LED top <-> bottom
Jumbled / zig-zag stripesToggle serpentine; if still wrong toggle vertical

Pass: TICKER 123 reads correctly from the front.

2.9 Back up the WLED settings

⏱ 2 min · Parts: ESP32 · Tools: phone or computer

WLED LED Preferences
Diagram · WLED LED Preferences

Config > Security & Updates > Backup configuration. Keep the file: a reflash then takes a minute.

Pass: cfg.json saved.

✅ PASS CHECK (required): bench LED test

Answer with what you actually saw or measured. The STOP box unlocks when every answer is in range.

STOP 2: checkpoint

  • WLED reachable at ticker.local (or its IP).
  • PASS CHECK above answered correctly: 256 LEDs, colours right, text reads right.
  • Settings backed up. PSU unplugged again.

Troubleshooting, Stage 2

SymptomLikely causeFix
Only the first LED lights or random flickerNo common GND, or 3.3 V data too weakCheck the GND clip; if still flaky it's what the level shifter (Stage 3) fixes
Nothing lightsWrong GPIO, PSU off, panel output end usedGPIO 16 in LED Prefs; clip to the DIN end (arrow points away from it)
Installer can't find a portCharge-only cable or no driverTry another USB-C cable; install the CP210x driver
Red shows greenColour orderSet GRB (or try RGB) in LED Preferences
ticker.local doesn't openmDNS blocked on some networks/AndroidUse the IP address shown in WLED or your router

🔒 Locked: finish Stage 2 first (every tick, its STOP box and its PASS CHECK). You can read ahead.

Goal: A 30 x 40 mm perfboard with the SN74AHCT125N wired so the ESP32's 3.3 V data comes out as clean 5 V.

3D view Stage 3 overview

Drag to turn · pinch to zoom · two fingers to pan · tap a part for its name.

Note: Why: the ESP32 outputs 3.3 V and WS2812B wants about 3.5 V+ for a clean 'high'. It often works without, but the chip removes the flicker risk (CART.md).

3.1 Cut and fit the perfboard

⏱ 10 min (est.) · Parts: perfboard · Tools: knife, straightedge, sandpaper

Perfboard layout
Diagram · Perfboard layout
CAD render: rear R electronics
CAD render · rear R electronics (from cad/ticker.py)

Score along a row of holes on both sides, snap, sand the edges. Target 40 x 30 mm.

Slide it into the rails on rear_R from the open end: it should slide with light friction.

Pass: Slides in and stops at the end stop; doesn't fall out when tipped.

3.2 Place the chip, notch to the left

⏱ 5 min (est.) · Parts: SN74AHCT125N, perfboard · Tools: -

SN74AHCT125N pin map with what each pin connects to
Diagram · SN74AHCT125N pin map with what each pin connects to

Push the chip through the middle of the board, notch toward the left (pin 1 bottom-left, looking at the chip side). Bend two corner legs on the back so it stays put.

Note: A DIP-14 socket is nicer but isn't in the cart; solder the chip directly (11 spares in the pack).

Pass: Chip centred, all 14 legs through.

3.3 Power the chip: pin 14 to 5V, pin 7 to GND

⏱ 10 min (est.) · Parts: 26 AWG wire · Tools: iron, solder ( ), strippers

SN74AHCT125N pin map with what each pin connects to
Diagram · SN74AHCT125N pin map with what each pin connects to

Solder a blue 26 AWG pigtail (~150 mm) to pin 14 (VCC) and a black one to pin 7 (GND). Label them 5V and GND with tape.

Wiring:

PinNameGoes to
14VCC5V rail (pigtail)
7GNDGND rail (pigtail)

Pass: Shiny cone joints, no bridges.

3.4 Enable channel 1: pin 1 to GND

⏱ 5 min (est.) · Parts: wire offcut · Tools: iron, solder ( )

SN74AHCT125N pin map with what each pin connects to
Diagram · SN74AHCT125N pin map with what each pin connects to

Link pin 1 (1OE) to pin 7 (GND) on the back with a short wire offcut. 'OE' low = output on.

Pass: Beep between pin 1 and pin 7.

3.5 Tie off the 3 unused channels

⏱ 10 min (est.) · Parts: wire offcuts · Tools: iron, solder ( )

SN74AHCT125N pin map with what each pin connects to
Diagram · SN74AHCT125N pin map with what each pin connects to

Pins 4, 10, 13 (2OE, 3OE, 4OE) to pin 14 (5V): those channels off.

Pins 5, 9, 12 (2A, 3A, 4A) to pin 7 (GND): no floating inputs.

Wiring:

PinsNameTie to
4, 10, 132OE, 3OE, 4OEpin 14 (5V)
5, 9, 122A, 3A, 4Apin 7 (GND)
6, 8, 112Y, 3Y, 4Ynothing (leave open)

Pass: Beep checks match the table; no pin bridged to its neighbour.

3.6 Data in and data out

⏱ 10 min (est.) · Parts: 26 AWG blue wire · Tools: iron, solder ( )

Data path: GPIO16 > 74AHCT125 > panel DIN
Diagram · Data path: GPIO16 > 74AHCT125 > panel DIN

Pin 2 (1A): blue pigtail ~150 mm labelled DATA IN (it goes to ESP32 GPIO16).

Pin 3 (1Y): blue pigtail ~200 mm labelled DATA OUT (it goes to the panel DIN).

Note: A 330 ohm resistor in series with DATA OUT is good practice, but it's not in spares. With the chip this close to the panel it's skippable. If you get one later, put it at pin 3.

Wiring:

PinNameGoes to
21AESP32 GPIO16
31Ypanel DIN (optional 330 ohm)

Pass: Two labelled data pigtails.

3.7 Meter checks (nothing powered)

⏱ 5 min (est.) · Parts: perfboard · Tools: multimeter

Meter: shifter checks
Diagram · Meter: shifter checks

Beep: 5V pigtail to GND pigtail must not beep. Pin 1 to GND pigtail beeps. Pin 14 to 5V pigtail beeps. Pin 2 to pin 3 must not beep.

Pass: All four as stated.

3.8 Bench test through the shifter

⏱ 10 min (est.) · Parts: perfboard, panel, ESP32, PSU · Tools: clip leads

Data path: GPIO16 > 74AHCT125 > panel DIN
Diagram · Data path: GPIO16 > 74AHCT125 > panel DIN

Same bench setup as Stage 2, but: GPIO16 > DATA IN, DATA OUT > panel DIN, perfboard 5V > jack red, perfboard GND > jack black + ESP32 GND. ESP32 still on USB. Plug in the PSU; run Scrolling Text.

Pass: Same picture as Stage 2, no flicker.

STOP 3: checkpoint

  • Meter checks passed.
  • Panel works through the shifter on the bench.
  • PSU unplugged.

Troubleshooting, Stage 3

SymptomLikely causeFix
Panel dark through the shifterPin 1 not to GND, or 5V missing on pin 14Measure pin 14 to pin 7 with the PSU on: about 5 V
Chip gets warmOutput shorted or reversed chipUnplug. Check notch direction and pin 3 isn't touching 5V/GND
Works, then flickersLong ground pathShorten the GND between ESP32, chip and panel; all grounds meet at one splice

🔒 Locked: finish Stage 3 first (every tick, its STOP box). You can read ahead.

Goal: Permanent wiring on rear_R: jack, splice, 1000 uF cap, ESP32 on the 5V rail, shifter, panel. Then a measured power-on and full-brightness test before anything is closed up.

3D view Stage 4 overview

Drag to turn · pinch to zoom · two fingers to pan · tap a part for its name.

Warning: This stage is the one that matters for safety. The PASS CHECK must be answered with real meter and WLED readings before Stage 5 unlocks.
Whole ticker wiring: supply, jack, splices, cap, ESP32, level shifter, panel
Diagram · Whole ticker wiring: supply, jack, splices, cap, ESP32, level shifter, panel

4.1 Fit the DC jack in rear_R

⏱ 5 min (est.) · Parts: DC jack, rear_R · Tools: pliers or spanner

DC jack through the rear cover
Diagram · DC jack through the rear cover

Push the jack through the hole from the inside (wires inside), nut on the outside. Tighten firmly.

Note: Hole is 11.2 mm for an M11 thread (assumed). If your jack is the 12 mm kind, drill/ream the hole to 12 mm or set JACK_HOLE in cad/ticker.py before printing.

Pass: Jack doesn't spin when you twist the barrel.

4.2 Identify the panel's input power leads

⏱ 5 min (est.) · Parts: LED panel · Tools: eyes, multimeter

Finding the panel's input end
Diagram · Finding the panel's input end

At the IN end: the 3-pin connector carries 5V, GND, DIN. Many BTF panels also have a separate red/white power pair at that end. Read the labels at the pads where each wire is soldered: trust the pad labels, not the wire colours.

Use the separate power pair if there is one (thicker); otherwise the connector's 5V and GND.

Pass: 5V, GND and DIN wires identified and taped.

4.3 Make the 5V and GND splices

⏱ 20 min (est.) · Parts: jack leads (18 AWG), panel leads, 26 AWG wire, heat shrink · Tools: iron, solder ( ), strippers, heat gun

Power path from the supply to the panel
Diagram · Power path from the supply to the panel
ESP32 powered from the 5V rail
Diagram · ESP32 powered from the 5V rail

5V splice: jack red + panel 5V + perfboard 5V pigtail + a new blue 26 AWG wire to the ESP32 5V/VIN pin (~150 mm).

GND splice: jack black + panel GND + perfboard GND pigtail + a new black 26 AWG wire to an ESP32 GND pin.

Heat shrink over the wires before soldering; twist, solder, slide over, shrink.

Wiring:

SpliceJoins
5Vjack red, panel 5V, shifter 5V (pin 14), ESP32 5V/VIN
GNDjack black, panel GND, shifter GND (pin 7), ESP32 GND

Pass: Firm pull doesn't break either splice; no bare copper.

Don't do yet: Don't use the 26 AWG wire for the panel's power: only the jack's 18 AWG and the panel's leads carry the amps.

4.4 Solder the 1000 uF cap across the splices (polarity!)

⏱ 10 min (est.) · Parts: 1000 uF cap · Tools: iron, solder ( ), heat shrink

Capacitor polarity: stripe to GND
Diagram · Capacitor polarity: stripe to GND

At the panel input: the cap's long (+) leg to the 5V splice, the stripe (-) leg to the GND splice. Sleeve both legs in heat shrink. It sits in the cap cradle on rear_R.

Why: it soaks up the inrush when you plug in and smooths the LED current (BTF/Adafruit practice).

Pass: Stripe leg on GND. Legs sleeved.

Don't do yet: Don't reverse it.

4.5 Wire the data path

⏱ 10 min (est.) · Parts: ESP32, perfboard pigtails, panel DIN · Tools: iron, solder ( ), heat shrink

Data path: GPIO16 > 74AHCT125 > panel DIN
Diagram · Data path: GPIO16 > 74AHCT125 > panel DIN

ESP32 GPIO16 to perfboard DATA IN (solder to the header pin, sleeve it).

Perfboard DATA OUT to panel DIN (through the mating 3-pin connector, or solder + sleeve).

Wiring:

FromTo
ESP32 GPIO1674AHCT125 pin 2 (1A)
74AHCT125 pin 3 (1Y)panel DIN
ESP32 5V/VIN5V splice
ESP32 GNDGND splice (common ground)

Pass: Every wire labelled; nothing on the panel's DOUT end.

4.6 Mount the ESP32, perfboard and cap on rear_R

⏱ 10 min (est.) · Parts: ESP32, perfboard, cap, 2 zip ties, rear_R · Tools: cutters

Inside the right rear cover: ESP32, shifter, cap, jack
Diagram · Inside the right rear cover: ESP32, shifter, cap, jack
CAD render: rear R electronics
CAD render · rear R electronics (from cad/ticker.py)

ESP32: pins down onto the two ledges, USB-C toward the right end (the end with the jack), between the posts. One zip tie through the two slots over the module.

Perfboard: slide into the rails. Cap: into its cradle, one zip tie round it.

Route the 26 AWG wires under clip 1 and the jack leads under clip 2.

Pass: Nothing loose when you shake rear_R gently.

4.7 Meter check before power

⏱ 5 min (est.) · Parts: the wired rear_R · Tools: multimeter

Meter: no short between 5V and GND
Diagram · Meter: no short between 5V and GND

PSU unplugged, USB unplugged. Beep between the 5V and GND splices: a short chirp (cap charging) is fine, a continuous beep is a short.

Pass: No continuous beep (PASS CHECK).

4.8 First power-on (glasses on)

⏱ 5 min (est.) · Parts: PSU · Tools: multimeter

Meter: volts at the panel input
Diagram · Meter: volts at the panel input

Plug the PSU into the wall, then into the jack. No USB. The ESP32's LED comes on, WLED appears at ticker.local within ~20 s.

Meter on DC volts at the panel 5V/GND input: write it in the PASS CHECK.

Pass: 4.85-5.3 V; WLED reachable; nothing smells or smokes.

4.9 Set the ABL to 4,500 mA

⏱ 2 min · Parts: ESP32 · Tools: phone

WLED LED Preferences
Diagram · WLED LED Preferences

LED Preferences: Automatic Brightness Limiter max current 4500 mA. Save.

Pass: Saved; WLED reboots.

4.10 Full-brightness current test (2 minutes)

⏱ 5 min (est.) · Parts: whole wiring · Tools: multimeter, phone

Full-white current test with ABL 4500 mA
Diagram · Full-white current test with ABL 4500 mA

Solid white, brightness 100 %. Open Info: read the estimated current. Meter at the panel input while it's on. After 2 minutes, unplug and touch the jack, splice and leads.

Note: 4.5 A is near the limit of many 5.5 x 2.1 mm jacks (their rating wasn't on the DaierTek listing we read). If the jack gets more than warm, use ABL 3500 mA: text scrolling uses far less anyway.

Pass: <= 4500 mA, >= 4.6 V under load, nothing too hot (PASS CHECK).

4.11 Normal text test

⏱ 2 min · Parts: panel · Tools: phone

All-pixels and colour test
Diagram · All-pixels and colour test

Brightness ~40 %, Scrolling Text HELLO PIN. Typical text lights 10-25 % of pixels: Info should show well under 2 A (est.).

Pass: Clean scrolling, no flicker.

✅ PASS CHECK (required before final assembly): power-on and current test

Answer with what you actually saw or measured. The STOP box unlocks when every answer is in range.

STOP 4: checkpoint

  • PASS CHECK answered with real readings and in range.
  • Cap polarity confirmed (stripe on GND).
  • PSU unplugged again before Stage 5.

Troubleshooting, Stage 4

SymptomLikely causeFix
ESP32 resets when LEDs go brightVoltage dip on the railCheck the cap is in; shorten the 5V/GND to the ESP32; lower ABL
Voltage under load < 4.6 VThin or long power path, weak spliceRedo the splice, use the panel's thicker power pair, keep leads short
WLED estimated current > 4500ABL off or not savedLED Preferences: enable ABL, 4500, Save; reboot
Jack hotJack rating below ~4.5 AABL 3500 mA; or a higher-rated jack (ask before buying)
Nothing lights after wiringData from the shifter to DOUT end, or DIN wire brokenRe-check the IN end; beep pin 3 to DIN

🔒 Locked: finish Stage 4 first (every tick, its STOP box and its PASS CHECK). You can read ahead.

Goal: Acrylic cut and seated in the joined shell, grid behind it, panel behind the grid, lit and crisp.

3D view Stage 5 overview

Drag to turn · pinch to zoom · two fingers to pan · tap a part for its name.

Cross-section: bezel, acrylic, grid, LEDs, panel, electronics gap, rear plate
Diagram · Cross-section: bezel, acrylic, grid, LEDs, panel, electronics gap, rear plate

5.1 Cut the acrylic to 330 x 86 mm

⏱ 20 min (est.) · Parts: acrylic sheet · Tools: plastic scoring knife, straightedge, sandpaper, glasses

Score and snap the acrylic
Diagram · Score and snap the acrylic

Film ON. Mark 330 x 86 mm along the 24 in side. Clamp the straightedge, score 8-10 passes along the line, turn over and score once more over the same line, then snap it over a table edge.

Sand the edges flat with 240 grit on a flat surface. Test-fit in the rebate; take a little more off until it drops in.

Pass: Drops into the rebate without forcing, no cracks.

Don't do yet: Don't saw or drill it without backing: acrylic chips and cracks.

5.2 Join the shell halves for good

⏱ 5 min (est.) · Parts: shell_L, shell_R, 2 pins, 2 x M3x12 · Tools: 2.5 mm hex key

Shell joint: pins, M3x12 screw and insert
Diagram · Shell joint: pins, M3x12 screw and insert

Same as the Stage 1 dry fit, screws now firm (not crushing).

Pass: Front seam flush.

5.3 Peel and seat the acrylic

⏱ 5 min (est.) · Parts: acrylic · Tools: -

Cross-section: bezel, acrylic, grid, LEDs, panel, electronics gap, rear plate
Diagram · Cross-section: bezel, acrylic, grid, LEDs, panel, electronics gap, rear plate

Peel the inside film, clean with a soft cloth (mild soapy water if needed; no alcohol on extruded acrylic). Lay the shell face down on a towel. Drop the acrylic into the rebate. Leave the front film on until the end.

Pass: Acrylic flat in the rebate, no dust trapped (look through the front).

5.4 Drop in the louvre grid

⏱ 2 min · Parts: grid_L, grid_R · Tools: -

CAD render: grid L
CAD render · grid L (from cad/ticker.py)

Left half first (it has the centre divider), then the right half, both behind the acrylic.

Pass: Grid sits flat, square to the window.

5.5 Fit the panel, input end on the right

⏱ 10 min (est.) · Parts: LED panel, 4 VHB pads · Tools: scissors

Cross-section: bezel, acrylic, grid, LEDs, panel, electronics gap, rear plate
Diagram · Cross-section: bezel, acrylic, grid, LEDs, panel, electronics gap, rear plate
3D stand-in: panel
3D stand-in at true size (not a photo; sizes from CART.md / assumed)

Stick 4 small VHB pads on the grid's outer frame (corners). Lower the panel LEDs facing the grid, with the IN end on the right as seen from the front (on your left now, with the shell face down).

Press it gently onto the pads. The panel's leads fold back toward rear_R's electronics.

Pass: Panel flat on the grid, leads at the electronics end.

Don't do yet: Don't press on single LEDs; press on the panel edges.

5.6 Light test before closing

⏱ 5 min (est.) · Parts: everything · Tools: phone

Orientation test results and fixes
Diagram · Orientation test results and fixes

Rest rear_R behind the shell (don't screw it). Plug in the PSU. Scrolling Text, then Solid white 10 %.

Pass: Square, crisp pixels; no cell bleeding into its neighbour much; text reads correctly from the front.

STOP 5: checkpoint

  • Acrylic seated, grid in, panel taped, light test good.
  • PSU unplugged.

Troubleshooting, Stage 5

SymptomLikely causeFix
Acrylic cracked while snappingNot scored deep enoughScore more passes; you have 12 x 24 in of sheet (4+ strips)
Text mirrored nowPanel turned round vs the bench testFlip it, or change first-LED left/right in 2D Configuration
Light bleeds between cellsGrid not tight to the panelThicker VHB pads; ribs on the rear cover press it forward
Dust behind the acrylicStaticLift out, blow off, refit

🔒 Locked: finish Stage 5 first (every tick, its STOP box). You can read ahead.

Goal: Both rear covers screwed on, the USB-C reachable, the ticker screwed into its walnut-look base.

3D view Stage 6 overview

Drag to turn · pinch to zoom · two fingers to pan · tap a part for its name.

6.1 Screw on rear_L

⏱ 5 min (est.) · Parts: rear_L, 6 x M3x10 · Tools: 2.5 mm hex key

CAD render: rear L
CAD render · rear L (from cad/ticker.py)

Ribs toward the panel. 6 screws into the inserts, snug in a cross pattern.

Pass: Plate flat, no rattle.

6.2 Check the USB-C lines up, then screw on rear_R

⏱ 10 min (est.) · Parts: rear_R (wired), 6 x M3x10 · Tools: 2.5 mm hex key, USB-C cable

USB-C through the end-wall slot
Diagram · USB-C through the end-wall slot

Lower rear_R in, tucking the panel leads into the free space by the cap. Push a USB-C cable through the end-wall slot into the ESP32: it should go straight in.

Unplug the cable, then 6 screws.

Pass: USB-C plugs in through the slot; no wire pinched under the plate.

6.3 Join the base halves

⏱ 3 min · Parts: base_L, base_R, 2 pins · Tools: -

CAD render: base L
CAD render · base L (from cad/ticker.py)

Pins into one half, push the halves together on a flat table.

Pass: Seam tight, pocket continuous.

6.4 Set the ticker in the base and screw it

⏱ 10 min (est.) · Parts: ticker, base, 4 x M3x10 · Tools: 2.5 mm hex key

Ticker into the base, side view
Diagram · Ticker into the base, side view
CAD render: sightline section
CAD render · sightline section (from cad/ticker.py)

Drop the ticker into the pocket (it leans back ~10 deg and sits on the pocket floor). Lift the pair, tilt it, and drive the 4 screws up through the base into the case-bottom inserts.

Pass: Ticker firm in the base; no wobble. From your chair, the bottom row of LEDs sits clear above the walnut.

6.5 Plug in and route the cable

⏱ 2 min · Parts: PSU · Tools: -

CAD render: assembly rear
CAD render · assembly rear (from cad/ticker.py)

PSU into the jack on the back; run the cable down behind the base.

Pass: WLED back on; text scrolling.

6.6 Peel the front film

⏱ 1 min · Parts: acrylic · Tools: -

CAD render: lit front
CAD render · lit front (from cad/ticker.py)

Peel the outside film. Done.

Pass: Clean smoked front.

STOP 6: checkpoint

  • Case closed, USB-C reachable through the slot.
  • Ticker screwed into the base and running.

Troubleshooting, Stage 6

SymptomLikely causeFix
Rear cover won't sit flatWire or zip tie under itRe-route under the clips; trim zip-tie tails
Ticker rocks in the baseSlot clearanceA strip of felt or VHB in the slot front
USB-C won't reachBoard not pushed to the right endLoosen the zip tie, slide the board toward the slot

🔒 Locked: finish Stage 6 first (every tick, its STOP box). You can read ahead.

Goal: PIN Ticker Control on your phone and Mac: type anything, pick scroll mode, speed, font, colours and effects, save native WLED presets (Alexa can call them) and set schedules.

3D view Stage 7 overview

Drag to turn · pinch to zoom · two fingers to pan · tap a part for its name.

The demo above runs in this page with a simulated 32 x 8 display: try it now, before the ticker exists. It doesn't talk to any ticker.

Note: WLED serves plain http, and browsers block an https page from calling a device on your Wi-Fi. So the real app runs from the ticker itself (step 7.1) or from your Mac (step 7.2). A copy on an https website can only run the demo. Full details: app/README.md.

Try it: PIN Ticker Control, demo mode (a simulated display in this page; it doesn't talk to any ticker)

7.1 Put the app on the ticker

⏱ 5 min (est.) · Parts: ticker, app/dist/pin-ticker.htm · Tools: computer

Control app screenshot: mobile home
Control app screenshot (against the mock WLED in the tests, not a real ticker)

On the Mac, open http://ticker.local/edit (WLED's file editor; use the IP if .local doesn't resolve).

Upload app/dist/pin-ticker.htm from this repo (one self-contained file).

On the phone, open http://ticker.local/pin-ticker.htm. Same address as WLED, so no setup: it connects by itself.

Pass: The app says Connected and its preview matches the panel.

7.2 Add it to your home screen (and the Mac)

⏱ 3 min · Parts: phone, Mac · Tools: phone, computer

Control app screenshot: desktop
Control app screenshot (against the mock WLED in the tests, not a real ticker)

iPhone (Safari): Share > Add to Home Screen. It opens full screen like an app. It needs your home Wi-Fi.

Mac: bookmark the same address, or run python3 -m http.server 8787 --directory app in the ticker folder and open http://localhost:8787. From localhost the browser can install it and cache it offline; enter ticker.local as the device.

Pass: The app opens from the home-screen icon.

7.3 Install the starter presets

⏱ 3 min · Parts: ticker · Tools: phone

Starter presets 1-10 (native WLED presets)
Diagram · Starter presets 1-10 (native WLED presets)
Control app screenshot: mobile presets
Control app screenshot (against the mock WLED in the tests, not a real ticker)

First back up what you have: WLED Config > Security & Updates > Backup presets.

App > Presets > Install starter pack. It writes native WLED presets with fixed ids, so WLED's own app and Alexa see them too:

idNameWhat it shows
1MarketBTC/SPY line in green (live prices while the feed script runs, Stage 9)
2Weatherweather line in white (live while the feed runs)
3Messageyour last saved message
4Partycolour effect, no text
5Nightdim, slow
6Rotateplaylist: cycles through the others
7-10Up / Down / Alert / Hello PINgreen / red / amber / white lines
Note: Ids 1-9 matter: WLED gives Alexa at most 9 preset devices, and stops at the first missing id.

Pass: All 10 presets show in the app and in WLED's own preset list.

7.4 Type a message

⏱ 5 min (est.) · Parts: ticker · Tools: phone

Control app screenshot: mobile text
Control app screenshot (against the mock WLED in the tests, not a real ticker)

Text tab: type anything (ASCII; up to 64 characters). Pick Scroll, Static or Bounce, the speed, the direction and the font size, then the colours. The preview shows what the ticker will do. Send.

Note: Static only holds still when the text fits on 32 pixels (about 5 characters); longer text has to scroll. Bounce isn't a WLED feature: the app makes it from a 2-step playlist (forward, then reverse). A # starts a clock code like #TIME.

Pass: The ticker shows your text, the way the preview did.

7.5 Effects, palettes and brightness

⏱ 5 min (est.) · Parts: ticker · Tools: phone

Control app screenshot: mobile effects
Control app screenshot (against the mock WLED in the tests, not a real ticker)

Effects tab: the list comes from your ticker's WLED, with search. Pick a palette and brightness. The current limiter (ABL 4,500 mA, Stage 4) still caps the power whatever you pick.

Pass: An effect runs; brightness changes.

7.6 Save it as a preset

⏱ 3 min · Parts: ticker · Tools: phone

Control app screenshot: mobile presets
Control app screenshot (against the mock WLED in the tests, not a real ticker)

Presets > Save current > pick an id and a name. Ids 1-9 can become Alexa devices (Stage 8). Playlists: pick presets and how long each one shows.

Pass: The new preset appears in the list and in WLED's own app.

7.7 Schedules

⏱ 5 min (est.) · Parts: ticker · Tools: phone

Control app screenshot: mobile schedules
Control app screenshot (against the mock WLED in the tests, not a real ticker)

First set the clock: WLED Config > Time & Macros > time zone (NTP on).

App > Schedules: for example 07:00 Mon-Fri > Market, 22:30 every day > Night. These are WLED's own time-controlled presets: the ticker runs them by itself, with no Mac or phone on.

Note: Live prices and weather only update while tools/ticker_feed.py runs on the Mac (Stage 9).

Pass: The schedule shows in WLED's Time & Macros page.

7.8 Pick the boot preset

⏱ 2 min · Parts: ticker · Tools: phone

WLED LED Preferences
Diagram · WLED LED Preferences

WLED Config > LED Preferences > apply preset 3 (Message) at boot. Default brightness ~40 % (est.).

Pass: After a power cut the ticker comes back on your message.

STOP 7: checkpoint

  • The app opens from the ticker on your phone and sends text.
  • Starter presets 1-10 are installed.
  • At least one schedule is saved.

Troubleshooting, Stage 7

SymptomLikely causeFix
App says it can't reach the tickerOpened from an https page, wrong address, or phone on another Wi-FiOpen it from http://ticker.local/pin-ticker.htm or your Mac; use the IP instead of .local (Android)
/edit upload fails or the page is missingOlder WLED, or the file system is fullUpdate WLED (OTA), delete old files in /edit, or use the Mac way (7.2)
Characters show as ?Not in WLED's fontUse plain ASCII letters, digits and symbols
Schedule fires at the wrong timeTime zone not setWLED Config > Time & Macros: time zone + NTP
Presets changed in the app don't show in WLEDWLED page cachedReload the WLED page

🔒 Locked: finish Stage 7 first (every tick, its STOP box). You can read ahead.

Goal: Alexa turns the ticker on and off, sets brightness, and starts presets by voice; routines add your own phrases ("Alexa, market mode"). Free, no developer account.

3D view Stage 8 overview

Drag to turn · pinch to zoom · two fingers to pan · tap a part for its name.

Note: WLED pretends to be a Philips Hue bridge, so the Echo controls it on your Wi-Fi. Alexa can switch presets but can't carry text: free text by voice is step 8.5 (Siri). Everything here, with sources: docs/ALEXA.md. Not tried on a real Echo yet.

8.1 Turn on Alexa in WLED

⏱ 3 min · Parts: ticker · Tools: phone

Alexa through WLED's Hue emulation
Diagram · Alexa through WLED's Hue emulation

Use WLED v16.0.1 or newer (an Echo discovery fix landed there).

Config > Sync Interfaces > Alexa Voice Assistant: Emulate Alexa device ON, invocation name Ticker, Also emulate devices to call the first 6 presets (the maximum is 9). Save, then reboot the ticker.

Give the ticker a fixed IP in your router (a DHCP reservation).

Pass: Saved; the ticker is back on after the reboot.

8.2 Discover in the Alexa app

⏱ 5 min (est.) · Parts: Echo · Tools: phone

Alexa through WLED's Hue emulation
Diagram · Alexa through WLED's Hue emulation

Echo and ticker on the same Wi-Fi (not guest Wi-Fi). Say "Alexa, discover devices", or in the Alexa app: Devices > + > Add Device > Other > Discover (wording varies).

You should get Ticker plus Market, Weather, Message, Party, Night, Rotate.

Pass: 7 devices found.

8.3 Voice test

⏱ 3 min · Parts: ticker · Tools: Echo

Alexa through WLED's Hue emulation
Diagram · Alexa through WLED's Hue emulation

"Alexa, turn on Market." "Alexa, set Ticker to 30 percent." "Alexa, set Ticker to red." "Alexa, turn off Ticker."

Note: "Turn off Market" turns the whole ticker off (that's how WLED does it). Red changes the text colour.

Pass: All four work.

8.4 Routines: your own phrases

⏱ 10 min (est.) · Parts: Echo · Tools: phone

Alexa routine: voice phrase to a preset device
Diagram · Alexa routine: voice phrase to a preset device

Alexa app > More > Routines > + (wording varies). When this happens: Voice, type the phrase. Add action: Smart Home > device > Power on. Save.

SayAction
Alexa, market modeMarket: on
Alexa, weather modeWeather: on
Alexa, party timeParty: on
Alexa, ticker nightNight: on
Alexa, ticker rotateRotate: on
Alexa, ticker offTicker: off
Note: If Alexa answers something else, the phrase clashes with a built-in one: put "ticker" in it.

Pass: "Alexa, market mode" switches the ticker to Market.

8.5 Optional: your own words by voice (Siri)

⏱ 10 min (est.) · Parts: iPhone · Tools: phone

iPhone Shortcut: dictated text to the ticker
Diagram · iPhone Shortcut: dictated text to the ticker

Alexa can't send text to WLED. The free way is an iPhone Shortcut: Dictate Text, then Get Contents of URL http://ticker.local/json/state, method POST, JSON body {"on":true,"seg":[{"id":0,"n":"<dictated text>","fx":122}]}. Name it "Ticker message".

"Hey Siri, ticker message" > say your words > they scroll. Home Wi-Fi only. Exact steps: docs/ALEXA.md.

Note: Free text through Alexa itself needs a custom skill, an Amazon developer account and a way into your home network. Not set up: Anthony decides on any sign-up.

Pass: Your dictated words scroll on the ticker.

STOP 8: checkpoint

  • Alexa turns the ticker on/off and starts Market by voice.
  • At least one routine works.

Troubleshooting, Stage 8

SymptomLikely causeFix
Alexa finds nothingEcho on guest Wi-Fi / another network, or old WLEDSame network; WLED v16.0.1+; unplug the Echo and the ticker, plug both back in, discover straight away
Preset devices missingA gap in ids 1-6, or names changed after discoveryFill the gap; save Sync Interfaces; discover again
Newer Echo still finds nothingSome newer Echo models don't do local Hue discovery (reported, not confirmed)Use the WLED app or the control app; Siri for voice (8.5)
"Night mode" does something elseClashes with a built-in Alexa phraseUse "ticker night"

🔒 Locked: finish Stage 8 first (every tick, its STOP box). You can read ahead.

Goal: BTC, SPY, weather and a custom line scrolling in green/red/amber, pushed by tools/ticker_feed.py on the Mac.

3D view Stage 9 overview

Drag to turn · pinch to zoom · two fingers to pan · tap a part for its name.

9.1 Copy and edit the config

⏱ 5 min (est.) · Parts: tools/ticker_feed.example.json · Tools: computer

Live data feed into the WLED JSON API
Diagram · Live data feed into the WLED JSON API
Control app screenshot: mobile data
Control app screenshot (against the mock WLED in the tests, not a real ticker)

Copy tools/ticker_feed.example.json to tools/ticker_feed.json. Set wled_host (ticker.local or the IP), latitude/longitude/place for your weather, your custom line, and which sources are on.

Pass: Config saved.

9.2 Dry run (pushes nothing)

⏱ 2 min · Parts: the script · Tools: computer

Live data feed into the WLED JSON API
Diagram · Live data feed into the WLED JSON API

In Terminal, in the ticker folder: /usr/bin/python3 tools/ticker_feed.py --dry-run

It prints each line and the JSON it would send.

Note: Use Apple's /usr/bin/python3. The python.org installer's python3 can fail with CERTIFICATE_VERIFY_FAILED until you run its 'Install Certificates.command'.

Pass: BTC, SPY, weather and your custom line print with colours.

9.3 Push for real

⏱ 2 min · Parts: ticker · Tools: computer

Live data feed into the WLED JSON API
Diagram · Live data feed into the WLED JSON API

/usr/bin/python3 tools/ticker_feed.py --once pushes the next line. Run it 4 times: the lines rotate.

Or --loop to keep going every 60 s while the Terminal is open.

Pass: The ticker shows the price in green (up) or red (down).

9.4 Optional: run it every minute (launchd)

⏱ 5 min (est.) · Parts: tools/com.pin.ticker-feed.plist · Tools: computer

Live data feed into the WLED JSON API
Diagram · Live data feed into the WLED JSON API

The sample plist is not installed. If you want it: fix the two paths inside, copy it to ~/Library/LaunchAgents, launchctl load it (instructions at the top of the file). It runs only while the Mac is awake.

Pass: A new line every minute; the log is /tmp/ticker-feed.log.

9.5 Follow the presets (Alexa + app)

⏱ 5 min (est.) · Parts: ticker · Tools: computer

Live data feed into the WLED JSON API
Diagram · Live data feed into the WLED JSON API

/usr/bin/python3 tools/ticker_feed.py --follow watches which preset is on. While Market (preset 1) is the last one applied it pushes market lines; while Weather (2) is, weather lines; any other preset stops it. So "Alexa, market mode" gives live prices, as long as the Mac is awake and running it.

The control app's Data tab writes the config (ticker_feed.json): download it into tools/.

Pass: Turning on Market in the app starts live prices within a minute.

9.6 Know what each source is

⏱ 2 min · Parts: - · Tools: -

Live data feed into the WLED JSON API
Diagram · Live data feed into the WLED JSON API
LineSourceKey?Notes
BTCCoinGecko public APInorate-limited; 24 h change
SPYYahoo Finance chart JSONnounofficial, may be delayed or change; vs previous close (TODO in the script)
WeatherOpen-Meteonoset your lat/lon
Customyour config-ASCII only

Pass: You know SPY is the fragile one.

STOP 9: checkpoint

  • Dry run prints every line.
  • The ticker shows live prices in colour.

Troubleshooting, Stage 9

SymptomLikely causeFix
CERTIFICATE_VERIFY_FAILEDpython.org Python without certificatesUse /usr/bin/python3, or run 'Install Certificates.command'
WLED not reachableWrong host or Mac on another networkUse the IP from WLED instead of ticker.local
SPY skippedYahoo blocked or changed the endpointSet "spy": false, or swap fetch_spy for a keyed API
Text shows but no scrollingEffect not Scrolling TextThe script looks it up by name; check the WLED version has it

Generated by tools/guide_v2.py from tools/guide_content.py. Nothing on this page loads from the internet (links open only when you tap them) and no photo is uploaded anywhere: Check my part only shares a photo when you tap Send.