Doc 4a · Wire the Zones For Real — The Supply, the Chain, and the Tape¶
Engineered Lighting prototype series · August 2026
The chapter Doc 4 stages 1–4 point at. Those stages' diagrams are schematics — they show which signal meets which signal. This is the other half: what those connections look like when you are holding the actual parts, which arrive with no bare wires, no labels you chose, and one terminal block that carries mains.
Five things bite first-time builders here, and none of them are in the schematics:
- The supply is not a lab brick with binding posts. It is the fixture's own IRM-90-24ST, and its screw block puts 120 V mains two finger-widths from the 24 V you came for.
- Two chips do all the work — the PCA9685 and the ULN2803 — and the stages assume you know what they are. You don't have to. This chapter tells you.
- There are two of the first chip, and every schematic on this site draws one. Seven zones need more channels than a single hub has — and the second hub adds no wires to the ESP32, which is exactly what makes it hard to picture.
- Soldering to LED tape is easy, and ruining LED tape is easier. The difference is wire gauge, strain relief, and practicing on the spool tail first.
- Your multimeter cannot see through LEDs, and not knowing that will send you chasing a fault that does not exist.
Everything below is verified against the manufacturers' own datasheets, and every number was measured on this bench before it was printed here.
Words this chapter uses — open this if any of them are new
None of these are hard, but they appear below without being introduced, and a checkpoint you can't read is a checkpoint you can't trust.
| Word | What it means here |
|---|---|
| Continuity | The meter setting that beeps when two points are connected to each other. "It beeps" and "it has continuity" say the same thing. |
| OL | What the meter shows when there is no connection — short for over limit, the display's way of saying "infinite resistance". On this bench OL is often the healthy answer, so read each checkpoint for which one it wants. |
| Pigtail | A short wire landed under a terminal screw, so that everything afterwards connects to a wire instead of to the screw. It is how you avoid working near the mains block once power is on. |
| Bus | One shared connection point that many wires join — here, the lever-nut block where every zone gets its +24 V. |
| Star | The single block where every ground meets. Called a star because the wires radiate from one centre instead of being chained one to the next. |
| Rail | A supply voltage treated as a place: "the 3V3 rail" means anywhere that carries 3.3 V. |
| AWG | Wire thickness. Bigger number = thinner wire. 24 AWG is thin and floppy (tape pads); 18–20 AWG is thicker and carries the 24 V runs. |
| Tinned | A bare wire end coated with solder. Correct before soldering to a tape pad; wrong under a screw terminal, where solder slowly squashes and the screw goes loose. |
| Silkscreen | The printed lettering on a circuit board. It is the authority on which pin is which — always outranks wire colour, memory, or a diagram. |
| I2C, SDA, SCL | The two-wire language the brain uses to talk to the dimmer hubs. SDA carries the data; SCL is the clock that paces it. Every hub listens to the same two wires. |
| PWM and duty | Dimming by switching fully on and off very fast. Duty is the share of time it is on — 40% duty looks about 40% bright. |
| OE (Output Enable) | A pin that turns all of a hub's outputs on or off at once. It must sit low (connected to ground) or the hub answers on I2C perfectly while emitting nothing. |
| Pull-up resistor | A small resistor already on the board that holds a signal wire up at its supply voltage when nothing else is driving it. It is why the hub's VCC voltage matters so much. |
| Common anode | How this tape is built: all three colours share one +24 V wire, and each colour is switched on its negative side. |
| DIP and the notch | A chip package with two rows of legs. The half-moon notch marks the pin-1 end, and is the only reliable way to tell which way round it goes. |
The order this happens in
The sections below are grouped by subject, so they read well as reference but not as a running order. On the day, work them in this sequence — and finish each one before starting the next, because every stage's checkpoints assume the previous stage's numbers are already true.
| # | What you do | Section | Ends when |
|---|---|---|---|
| 1 | Identify the supply, land the mains feed and four pigtails, prove the output | Your supply | CP1–CP4 pass, cover on |
| 2 | One fuse, the WAGO bus, the ground star, the buck measured | The 24 V backbone | CP5–CP7 pass |
| 3 | Learn the two chips, then wire the control side — both hubs | The chain | CP8, CP8b and CP8c pass |
| 4 | Practice joints, then solder one zone and strain-relieve it | Tape work | CP9–CP11 pass |
| 5 | First power on that one zone — watched, not walked away from | CP12 | Three whites lit, supply steady |
| 6 | Repeat 4–5 for the remaining zones, one at a time | Tape work | Each zone lights from the app |
The photo figures, by step. Four of the figures below are photographs of the actual parts with every pad named and every wire drawn on. Open the one for the step you are on and work from it: step 3 has the two hubs on one bus, the A0 blob before and after, and how to read the ULN2803; steps 4–6 have one zone's whole trip, pad to pad. Every figure enlarges on click.
Two things worth knowing before you start. The supply's mains feed comes first, and it needs a powered E26 socket to screw into — check you have one now, not at step 1. And do one zone completely before starting the second: a fault found on zone 1 is a fault you fix once, while the same fault repeated across seven zones is a day.
If a zone is dark at step 5 or 6, do not start guessing — go to When a zone is dark and work the rungs in order. Each rung you pass clears a suspect, which is the whole point of doing them in order.
Your supply, before anything else¶
Doc 4 stage 1 says "bench supply" and draws a lab brick. On this bench the supply is the Mean Well IRM-90-24ST — the exact part Doc 8 later mounts inside the fixture body. Same rail, same protection, same screw block: run the fixture's own documented supply from day one and the fixture's power chapter validates itself while you build zones.
Doc 8 describes that block as "L, N, +Vo, −Vo" — which under-describes the thing in front of you. The ST's output side duplicates its terminals: two +Vo screws and two −Vo screws, internally one output. Six screws total, and the pair at the AC/L–AC/N end is mains — on the mounted unit in the photo below, that end is uppermost.
And here is the diagram's subject in the flesh — this build's own unit, already mounted on the fixture frame. It is shown with the terminal cover off for this photo only; the rules below put it back:

- DANGER — the mains block (AC/L + AC/N). Wall voltage lives on these two screws whenever the cord is plugged in. Unplug — not switched off — before any tool or probe goes near it.
- The output block: four screws, two +Vo and two −Vo, internally one 24 V output. CP1–CP3 happen here — on these bare screws, unplugged, before any pigtails are landed.
- The pigtail ends. Every powered reading (CP4: 24 V ±5% on every +/− pairing) happens out here on wire ends, cover on, fingers never on the block. Pair A → the fuse → the LED bus; pair B → the 5 V buck, deliberately unfused — after CP1/CP2 prove the doubled screws are common.
Four rules before a screwdriver goes anywhere near it. Each one is named after the way it fails:
- Unplug it — not "switched off." A power strip's rocker can break the neutral and leave line sitting on the block; its neon lamp proves nothing after the lamp dies. The named failure is a screwdriver landing across L and N on a block you believed dead — at mains that is not a spark, it is an arc that machines the tip and ends the afternoon. Cord out of the wall, in your line of sight, before every touch.
- L and N land under their marked screws only. The named failure is the lead that landed one screw over — a mains wire on +Vo puts 120 V onto the 24 V side and into everything downstream of it. Read the moulded markings, not the wire colors, and look twice before tightening.
- The terminal cover goes back on before EVERY power-up. Not the final one. Every one. The named failure is the probe you left resting on the bench: it rolls, and a live L screw is exactly probe-tip sized. So is a stray strand of stripped copper. So is a knuckle.
- Strain relief on the cord. The named failure is one snag: it pulls L out of its screw and leaves it waving bare inside the bench. Anchor the cord so a tug lands on the anchor, never on the screws.
There is no earth screw on this block, and there is not supposed to be: the IRM is Class II — double-insulated. Do not go looking for a ground to add.
The cord itself — which wire is which¶
The mains feed on this bench is an E26 socket-to-wire adapter — a lamp socket with two 18 AWG leads, black and white. Get this straight once, because guessing it backwards is the most dangerous mistake this chapter can host:
- Black = LIVE (hot) → lands on AC/L. In North American wiring, black is never ground. Ever.
- White = NEUTRAL → lands on AC/N.
- There is no ground wire, and this block takes none. Two leads is correct for a Class II supply. A green or bare wire has no home here.
- You also need something for it to screw into. The adapter ends in a lamp base, not a plug — so it needs a powered E26 socket: a socket-to-plug cable, a desk lamp, a clamp light. Check you have one before the day starts; the BoM stocks the adapter and nothing to receive it, which is an easy way to reach a supply you cannot switch on. Whatever you use must not be on a dimmer — wall switch or in-cord. A dimmer chops the AC waveform, and this supply should never be asked to eat that.
And then the rule that outranks the colors: treat both leads as live whenever the adapter is screwed into a powered socket. A lamp socket can be miswired upstream — shell hot instead of shell neutral — and the adapter's leads inherit whatever the socket does. The colors tell you where each lead lands; they never tell you a lead is safe to touch. Unplugged is the only safe.
Landing the leads under L and N — strip, seat, tighten, tug, cover on — is the same screw ritual as the output side, done first, cord out of the wall.

- DANGER — the screw base. Mains the moment it is screwed into a live socket. It goes into the socket last, after everything below is landed and covered — and comes out first for any change.
- The black lead = LIVE → lands under AC/L.
- The white lead = neutral → lands under AC/N.
- CAUTION — the factory connector on the ends: cut it off. It exists for downlights, not for screw blocks. Snip it, strip 7–8 mm of fresh copper on each lead, and land bare stranded wire under the screws — never the connector, never tinned ends.
And the meter that settles every checkpoint from here on — with one honest limitation worth knowing now:

- Auto mode — it picks volts/ohms/continuity by what the probes touch. All the checkpoints in this chapter run in Auto plus the beeper.
- The continuity beeper — CP1, CP2, CP7 through CP11 all live on this icon.
- CAUTION — two jacks, volts and ohms only. This meter has NO current range. Every checkpoint in this chapter that talks about current is therefore a watch-and-expect check, not a measurement — see CP12. (The wiring is protected by the fuse and by the supply's own overload hiccup either way.)
- NCV — hold the top edge near a wire and it warns of live mains without touching. A free extra check before fingers go anywhere near the supply end.
The sequence that makes powered probing safe¶
The trick is to arrange things so the meter never has to visit the block while it is live. In this order:
- Unplugged: prove the bare terminals — checkpoints CP1–CP3 in the table. Continuity: the two +Vo screws beep to each other (CP1), the two −Vo screws beep to each other (CP2). Then resistance mode across + and −: a short chirp that climbs to tens of kΩ or OL as the output capacitors charge from the meter — that climb is normal (CP3). A beep that never stops is a short; do not plug in.
- Land four pigtails — 18–20 AWG stranded, one per output screw, long enough to reach the WAGOs with slack. Fresh-stripped bare copper under each screw, never tinned ends — solder cold-flows under a screw and the joint quietly loosens (Doc 3a learned this the hard way). Tug each one. If it moves, do it again.
- Fit the cover.
- From here, every powered reading is pigtail-to-pigtail, cover on (CP4): plug in and read 24 V ±5% across every +/− pigtail pairing. The screws stay covered for the rest of the build.
The load split falls out of the pigtails for free: one +/− pair → the fuse → the WAGO +24 V bus (its − mate goes to the ground star), and the other pair → the D24V22F5 buck. One fuse — the single T3.15AL250V on the bus pair's + leg — and only one, which has been the site's law since stage 1.
Be honest about what that fuse does: it protects the wiring. The IRM is a 3.75 A supply that answers overloads by dropping into hiccup mode, so it will never push enough current to blow a 3.15 A time-delay fuse selectively — do not expect the fuse to save a chip or point at a faulted zone. It exists so that if a fault ever feeds the bus past the supply's own protection, the sacrificial weak point is a 50-cent cylinder and not your 18–20 AWG wiring. That is worth $7. It is not worth more.

- The inline holder — it unscrews in the middle and the fuse lives inside. It goes in one place only: the bus pair's + leg, between the pigtail and the +24 V WAGO.
- The fuses — 3.15 A slow-blow ceramic, 5 × 20 mm, ten of them. "Slow-blow" is the property that matters (it rides through power-up inrush); 3.15 is the IEC value that is "3 A". One in the holder, the box in the drawer.
If CP1 or CP2 does not beep
Stop. Your unit's doubled terminals are not common on that rail, and nothing about this chapter's split is safe to assume anymore. Run single-pair operation: one proven +/− pair feeds the fuse and the bus, the buck moves to the bus after the fuse (exactly as stage 1's diagram draws it), and the second pair gets capped — insulated, folded back, out of the story. Never bridge unproven terminals yourself. A bridge you add to a block you don't understand is a decision the datasheet didn't approve.
The 24 V backbone¶
Stage 1's diagram is already connector-level here — the WAGOs are drawn as WAGOs. What it cannot show is the routine, so here it is — the same five steps every lever nut on this bench gets:
- Strip 11 mm — to the gauge moulded into the block's side, not by eye.
- Lever fully up. Halfway is a spring pressing on nothing.
- Insert to the stop.
- Lever down.
- Tug it. If it moves, do it again.

- Lever up = open. This one is ready to take a wire; the litany above closes it.
- The five-port blocks — these become the +24 V bus and the ground star: one wire in from the supply side, the rest fan out.
- Two- and three-port blocks — joins and taps along the way.
- The inline splice — wire-to-wire, for extending a lead without a block.
The bus pigtail's + lands in the fuse holder; the fuse's far side lands in the +24 V bus WAGO. Its − mate lands in the ground star WAGO — and that WAGO is the single floor the whole bench measures against. Every ground goes directly to the star, never chained device-to-device. The named failure is zone-to-zone brightness mismatch: chained grounds turn shared return current into small voltage offsets, and two zones at identical settings visibly disagree — a wiring fault that looks exactly like a software bug and isn't.
The breadboard carries signals only — I2C, dimmer lines, milliamps. A breadboard rail gives up around 1 A; tape current through one is how rails melt and mysteries begin. All real current lives on the WAGOs and 18–20 AWG wire.
Three checkpoints close the backbone: 24 V at the bus after the fuse (CP5), 5.0 V at the buck output measured before the ESP32 is connected (CP6 — a swapped VIN/GND survives; fix it and re-test), and one resistance sweep proving supply−, the star, the ESP32's GND, and every ULN pin 9 all sit within 1 Ω of each other (CP7).
The buck itself, before it goes anywhere (it ships bare — two wires soldered to IN and GND are all it needs today):

- IN — 24 V from the supply's pair-B pigtail, straight off the PSU. Not through the fuse: the single T3.15AL250V guards the LED bus only. (Only in the single-pair fallback does IN come off the fused bus instead.)
- GND — two pads, same net: the corner pad and the in-row pad between IN and OUT. Use either; one goes to the ground star.
- OUT — expect 5.0 V here on the meter. That is CP6, and nothing connects to this pin today.
- PG and EN — the first two holes in the row. Leave both empty.
The chain, demystified¶
Stage 2's diagram shows the whole chain at once — it stays where it is; this section is the close-ups. Two part numbers do everything, and neither is an explanation. Here is what each one is.
First, sort the parts box. One board in it looks like it belongs in this chain and does not — it drives the spotlight, a different milestone with different physics:

This is the BoM's PicoBuck itself — the genuine SparkFun board, identified down to its published schematic (chips read AL8860; the mounting ears are the PicoBuck's snap-off tabs; the branding is on the back). ~330 mA per channel as shipped — the second sense resistor visible beside each channel's first is the 660 mA option, waiting behind an open solder jumper (Doc 4b walks the board pad by pad). It forces a fixed current through three separate outputs — the tape is a fixed-voltage, common-anode part with one shared 24 V, so there is nothing here for it to connect to. Set it aside until spotlight day — that day's chapter is Doc 4b. The rule runs both ways: the spotlight's bare LED star never touches the 24 V bus either.
And a fact both remaining boards share: they ship bare. The dimmer hubs and the spare brain all arrive with loose header strips. Solder the headers first — Doc 8's five rules, big forgiving pads, and the best possible warm-up before the tape's small ones.
Hop 1 — the PCA9685, or: sixteen dimmers on two wires¶
A PCA9685 is a chip that takes orders over two shared wires and holds sixteen dimmer signals steady by itself. The ESP32 says "channel 3 to 40%" once, over I2C; the chip keeps channel 3 at exactly 40% forever without being reminded. That is the whole job, and it is why the C6 can run 21 tape channels without breaking a sweat.
The address is a house number. Both boards hear every order on the same two wires; the number at the front of the order decides who acts on it. Board #1 answers at 0x40. Board #2 answers at 0x41 — only after its A0 jumper is bridged with a blob of solder.
An unbridged board #2 is a second 0x40, not a missing 0x41
Skip the jumper and board #2 does not sit quietly waiting to be found. It is a second device answering at 0x40 — both chips reply at once, and the bus traffic meant for the zones that already work gets corrupted by the newcomer. The failure reads backwards: you added zones 6 and 7 and zones 1 through 5 started glitching. Bridge A0 with everything unpowered, before the board's SDA and SCL ever touch the bus.

- CAUTION — VCC. Takes 3.3 V from the brain, never 5 V. This is not just a silent failure: the board's own pull-up resistors tie SDA and SCL to VCC, so 5 V here puts 5 V on the C6's GPIO 2 and 3 — past the chip's 3.6 V absolute maximum. It can kill the brain, quietly.
- CAUTION — V+, VCC's next-door neighbour. Stays EMPTY. One position over from the pin you want, and the reason to read the silkscreen letter by letter.
- SDA and SCL — the two shared wires, from GPIO 2 and GPIO 3 respectively.
- GND — to the ground star. (OE, two pins over, also stays empty — a genuine Adafruit board already holds it enabled; on a clone, verify.)
- Channel 0 — zone 1's three channels are 0, 1, 2, and the wire comes off the PWM hole of each, nothing else. See the close-up below.
- The V+/GND terminal footprint (block supplied loose) — stays unpopulated for the tape build.
- The A0 address pads — hub #2 only: bridge this pair with solder so it answers at 0x41, before its bus wires ever land. See the close-up below.
One trap the photo can't show: both ends of the board carry the same six control pins in mirrored order. Use the end shown here, and read the silkscreen every time — landing the four wires on the far end in the same left-to-right order swaps SDA with SCL and puts VCC on V+.
The two close-ups that make 5 and 7 unmistakable:


Three traps, all pre-solved in the stage YAML but not in your wiring:
- VCC gets 3.3 V. Never 5 V. At 5 V the chip's logic threshold rises above what the C6 outputs and I2C fails silently — and worse, the board's pull-ups drag SDA/SCL to VCC, putting 5 V on GPIO pins rated for 3.6 V absolute maximum. The silent failure can also be a dead brain.
- V+ stays unconnected. It is servo power for a job this board doesn't have.
- OE must sit low. On a genuine Adafruit board a pulldown already holds it there; on a clone, verify — a floating OE tri-states all sixteen outputs, and the board plays dead while the I2C scan looks perfect.
Before power touches the chain, CP8: the wire landing on PCA VCC beeps to the 3V3 rail and to nothing else. If it beeps anywhere else, rewire before power.
The other end of those two wires is the brain. This build keeps a spare ESP32-C6 board for exactly this chapter — the whole chain gets proven on the expendable board before the fixture's own brain ever touches it:

- CAUTION — 3V3. This pin powers the hub's VCC. Never a 5 V pin — see the hub trap above for why that can kill this board.
- GND — to the ground star. Every board shares one floor.
- GPIO 2 = SDA. On the antenna-side header, it is the first pin below GND — the close-up below shows the printed digits.
- GPIO 3 = SCL — the second pin below GND.
- The left USB-C port, silkscreened COM — the cable goes here to drive the test program.
Solder the header pins into the outer round holes — the inner flat pads are for surface-mounting, and a pin sunk there will not reach a breadboard. Four pins are enough: GND, 3V3, 2, 3.

The second hub — two boards, the same two wires¶
Zone 1 needs three channels and a hub holds sixteen, so every diagram up to this point has drawn one hub and been honest about it. Seven zones is 21 channels. The second hub arrives at Doc 4 stage 4, and it is the moment the wiring stops matching any picture on this site.
Here is the picture:
The second hub costs no ESP32 pins. That is the whole answer, and it is also why it is hard to picture: you go looking for the wiring that tells the two boards apart, and there isn't any. Both boards take the same four wires — 3V3, GND, GPIO 2 (SDA), GPIO 3 (SCL) — landed exactly as Hop 1 describes for the first one. What tells them apart is a blob of solder.
That is what an address is. Every order the C6 sends carries a house number at the front; both boards hear every order, and the number decides which one acts. Board #1 leaves A0 open and answers at 0x40. Board #2 gets A0 bridged and answers at 0x41. Nothing else about the two boards differs — same pins, same voltage, same wires, same everything.
Here is the same picture on the boards themselves:

Follow any one color and the story repeats four times: off the C6, onto hub #1's pad, on to hub #2's — the same order at every landing. The V+ pin wears a red X on both boards, and the one thing that tells the hubs apart sits down by the address strip: the A0 pair, ringed green and open on hub #1, ringed red and bridged on hub #2.
Where those four wires physically meet is a separate question, and the answer is: your choice. Two shapes both work.
- One row per signal on the breadboard. Four rows — 3V3, GND, SDA, SCL. The C6's wire goes into the row and so does each hub's. A breadboard row is a junction, which is exactly what a bus needs. Prefer this on the bench: every wire is separately seatable, and separately beep-testable.
- Chained, board to board. The PCA9685 carries the same six control pins at both ends, so hub #1's far header can feed hub #2 directly. Tidier, fewer breadboard rows, and it is the shape the soldered fixture ends up with — but read the trap before you use it.
The far-end header is mirrored, and the chain is where that bites
The six control pins at the other end of the board are the same six signals in mirrored order. Copy the near end's left-to-right order onto the far end and you have swapped SDA with SCL and put VCC on V+. The first is a silently dead bus; the second puts 3.3 V on the servo rail.
Read the silkscreen at the end you are actually wiring, letter by letter, every time. It is the same rule Hop 1 gives for one board — chaining is just where ignoring it costs two.
One thing genuinely does double. Each board carries its own SDA and SCL pull-up resistors, so two boards put two sets in parallel and the bus sees half the resistance it saw with one. At 400 kHz over breadboard-length runs that is harmless, and if anything it sharpens the edges. It is worth knowing because it is the kind of fact that surprises you at hub four, not at hub two.
And the trap Hop 1 already named, restated here because this is the section where it fires:
Bridge A0 before the board's bus wires ever land
An unbridged board #2 is not a missing 0x41. It is a second 0x40, answering alongside board #1, and the traffic meant for the zones that already work gets corrupted by the newcomer. The failure reads backwards: you wire zones 6 and 7, and zones 1 through 5 start glitching.
Worse, an I2C scan cannot see it. A bus with one board at 0x40 and a bus with two boards both at 0x40 produce the same scan. A scan proves you have two hubs only when it reports 0x40 and 0x41 — which is CP8c.
So bridge A0 with everything unpowered, before that board's SDA and SCL ever touch the bus, and prove the blob with CP8b rather than trusting how it looks. Solder that has wetted one pad and merely leaned on the other photographs beautifully.
What the blob looks like on the pads, and what CP8b reads on each board:

Hop 2 — the ULN2803, or: eight switches in one chip¶
A ULN2803 is eight electronic switches in one package. Put 3.3 V on IN n and the switch at OUT (19−n) — the pin directly across the chip — closes, connecting that tape wire to ground. Current then flows the full loop: 24 V bus → tape → OUT pin → through the chip → pin 9 → the star. The chip eats about 1 V doing it, so the tape sees ~23 V. That is a voltage statement, small and uniform — every channel loses the same volt, and the eye reads it as nothing at all.
This is the chip itself, and the one fact about its body that the schematic cannot teach:

- CAUTION — the notch marks the pin-1 end. Seat every chip so its notch matches the drawing/socket orientation before power. A chip seated backwards puts the tape's 24 V returns onto its logic inputs and dies on first power — across four chips and 21 channels if the habit sticks. Count pins from the notch, never from habit.
- Pin 1 = IN 1 — bottom-left corner when the printing reads upright.
- Pin 9 = GND — bottom-right corner, straight to the ground star.
- Pin 10 = COM — top-right corner, stays empty for LEDs.
- Pin 18 = OUT 1 — top-left corner, directly across from IN 1. That is the OUT = 19 − IN rule in the flesh: inputs count up along the bottom, their outputs sit straight across on top.
Pin 9 goes to the star. Pin 10 stays unconnected.
The whole map, drawn on the chip itself — the figure to have open the first time you seat one:

One closing rule for the whole chain: one I2C master and one 3V3 source on the bus at a time. The C6 gives the orders and the C6's regulator feeds the logic — wire in a second of either and the two hubs start contradicting each other on the same wires.
The fan-out — which channel drives which zone¶
Two hubs and four switch chips make 21 channels, and the map that assigns them is Doc 4 stage 4's table. Here it is as a picture, because one row of it is not what it looks like:
Read one zone at a time, left to right. Zone 4's three channels come from hub #1's channels 9, 10 and 11, enter ULN chip 2 at pins 4, 5 and 6, and leave from pins 15, 14 and 13 to zone 4's plug — always in warm / neutral / cool order.
And here is one row of the map traced across the actual parts — zone 1, pad to pad:

The colors do the bookkeeping: amber enters at channel 0, exits at pin 18, lands on W; grey and blue do the same for N and C. And the red +24 V feed goes from the WAGO bus straight to the tape's 24V+ pad — it has no business at either chip, and the figure routes it the way the bench should: around, never through.
Three things the picture is for.
Nothing from the tape touches a hub. The hubs emit 3.3 V signals and nothing else. Each PCA9685 channel is a group of three holes — PWM, V+, GND — and you take the PWM hole only, as Hop 1 says. The tape's +24 V runs from the WAGO bus straight to the tape, and the only wires that ever carry tape current are the negatives leaving the ULN's OUT pins. Hop 2 has that current's whole trip.
The channels do not run out evenly. Hub #1 gives 15 of its 16 channels to zones 1–5; hub #2 gives 6 of its 16 to zones 6–7 and keeps ten spare. That lopsidedness is deliberate — filling the first board before starting the second puts the boundary in one place instead of two.
And chip 3 is fed by both hubs. Every other ULN chip takes both of its zones from a single hub. Chip 3 takes zone 5 from hub #1 and zone 6 from hub #2, because that is exactly where the 15-channel boundary falls.
Wire zone by zone, never chip by chip
Chip-by-chip is the tempting order: you have a chip in its socket, you fill its inputs, you move on. It works for chips 1, 2 and 4, and it reaches for the wrong board exactly once — at chip 3's inputs 4, 5 and 6, which belong to hub #2.
The symptom is quiet, and it lies to the ladder: zone 5 works, zone 6 is dark, and the chip and the firmware are both blameless. CP13 passes — hub #2 really is driving its channel-0 pin at 3.3 V — while CP14 fails, because the wire between that pin and chip 3's IN 4 was never made. A missing wire between two healthy things is the one fault the rungs can bracket but not name.
Wiring zone by zone — three channels in, three out, one plug, test it, next — deletes the failure instead of catching it. It is also the order Doc 8 step 4 prescribes for the soldered build.
Tape work¶
The Valent X spool is the most expensive thing on this bench, and the work in this section is the only work that can damage it. Read all of it before the iron heats up.
Practice on the spool tail first. The spool's outer end is scrap the moment you cut your first zone. Make two or three practice joints there before touching a real zone: a lifted pad on the tail costs nothing, and a lifted pad on a cut zone costs one cut-line of tape — not the day, but not free either. Nobody's first tape joint should be one that has to work.
This is your spool at a cut line — the four pads, and the printed letters every wire label copies:

- 24V+ — the shared plus wire, common to all three channels. Comes from the fused 24 V bus (WAGO), never from a breadboard rail.
- W — the warm channel's negative wire.
- N — the neutral channel's negative. Nothing to do with mains neutral — here N is just a color.
- C — the cool channel's negative.
- CAUTION — the cut. The dashed line in the photo is where the printed cut line runs: straight across the tape, through the centres of all four pads. Each half-moon becomes a full pad for the segment on its side. Anywhere else kills the segments on both sides of your scissors.
What the letters mean, in the vocabulary every other table on this site uses:
| Pad letter | Channel | Lands on |
|---|---|---|
| W | 1800 K warm | its own ULN OUT pin |
| N | 3500 K neutral | its own ULN OUT pin |
| C | 6500 K cool | its own ULN OUT pin |
Because 24V+ is shared, a solder bridge between any two pads is a dead short — CP10's whole job is catching one.
The rules, each with its failure attached:
- Cut at the printed cut lines. Anywhere else severs traces mid-segment, and both segments on either side of the cut go dark forever.
- Label every wire from the tape's printed pad markings. Never from wire color, and never from any diagram — including ours. Your spool's pad order is the authority; a diagram is somebody else's spool. Write the label on a flag of tape at both ends of the wire before the wire ever meets the iron.
- Use 24–26 AWG silicone stranded wire for pad wires. 22 AWG solid is the canonical lifted-pad cause: it works as a lever, and every nudge of the stiff wire pries at a pad held on by adhesive and hope. The floppy stuff can't transmit a snag to the joint.
- Strip only 2–3 mm for a tape pad — a bared length that fits on the half-moon with nothing hanging over. This is not the WAGO's 11 mm; carry that habit here and the overhang becomes the stray strand CP9 exists to catch.
- Solder order, tinning, and what a good joint looks like are Doc 8's five rules — tin the pad, tin the wire, touch them together with the iron, and expect the tiny volcano, not the blobby ball. They are not repeated here; go read them.
- Strain-relieve the 4-wire pigtail within ~20 mm of the pads BEFORE the tug test. Anchor the bundle to the tape's backing so a pull lands on the anchor, not the joints. Do it in this order or the tug test is itself the pad-lift event — you would be testing the pads' adhesive, not your solder.
A warm/cool swap is the one mistake nothing here can catch
Every other error in this chapter announces itself. A bridge trips CP10, a stray strand trips CP9, an open trips CP11, a short makes the supply hiccup at CP12. Transposing W and C does none of that.
The firmware weights all three channels identically, so it has no idea which is which — warm, neutral and cool are a convention carried in the labels, not something any wire, chip or witness can verify. Solder W to the cool channel and C to the warm one and the zone lights on cue, ZB zone=1 on=1 level=255 prints exactly as it should, and CP12 through CP15 all pass. You would discover it weeks later, when a zone runs cold while its neighbour runs warm at the same setting.
That is why the labelling rule above is not bookkeeping. The tape flag you write before soldering is the only check that exists — so write it from the spool's own printed pads, every zone, every time, and never from the wire's color or from memory of the last zone.
The wire itself, so the right spool is never a guess:

- The 24 AWG silicone kit (thin, six colors) — THE tape-pad wire. Six colors means 24V+, W, N and C can each keep a color for a whole zone.
- The 20 AWG kit (thicker) — the 24 V feed runs: supply pigtails, bus-to-zone feeds.
- The heat-shrink bag — the strain-relief anchor material for the tape pigtails.
The schematic version of the same step, for the wire-flag and solder-order detail:
The meter cannot see through LEDs¶
Here is the trap that costs beginners an evening: continuity and diode-test modes source a volt or two, and the tape's LED strings need far more than that to conduct. Every pad-to-pad reading across a channel therefore reads OL on a good harness AND on a reversed one. The meter is not telling you the harness is bad. It is telling you it cannot see through LEDs — and it can't, ever, in either direction.
So polarity is proven two other ways, neither of them a beep: the pad print (which you labeled from — see above), and the first-power test with only + and ONE channel landed. A reversed connection simply lights nothing; nothing is harmed. Fix it, relight it, then land the rest.
The beep rituals earn their keep proving what they can prove:
- CP9 — each wire beeps to its own pad only, neighbours silent. A stray strand is a reflow and a re-beep, not a shrug.
- CP10 — the +24 pad to each − pad reads OL, no sustained beep. The LED string blocks the meter, so a solid beep here can only be a solder bridge. Reflow it.
- CP11 — with the zone chained in and power off, the ULN OUT pin beeps to the tape's − wire, end to end. Open means a break: beep it segment by segment until you find which joint went quiet.
Then the zone's first power is CP12 — and honesty about this bench's meter: the TM-510 has no current range, so CP12 is a watch-and-expect check, not a reading. One zone landed, power on, and for thirty seconds you watch three things: the supply stays steady (no rhythmic clicking — that hiccup is its overload protection saying short), all three whites actually light, and nothing — chip, wire, tape — gets warm. A supply that hiccups is telling you there's a short; find it, don't retry blind.
JST-XH belongs to the next chapter, not this one
The fixture build puts every zone on a JST-XH plug — the site's 3 A law for that connector holds, and a zone's ~80–160 mA clears it by a mile. But that is Doc 8's step. For bench bring-up, soldered tails straight into the WAGOs and breadboard are fine. Don't buy crimping problems before the design is frozen.
Power math, published honestly¶
Honestly twice over: these figures are derived from the tape's own rating (the spool's watts-per-foot, split across the lengths this build cuts), not yet measured — this bench's meter has no current range, so they stand as expectations until a current-capable meter visits. They are what the fuse and the supply were sized against:
| Zone | Length | Whole zone, full on | Per channel |
|---|---|---|---|
| Radial (zones 1–6) | 4.92″ — 2 segments | ≈ 80 mA expected | ~27 mA |
| Bottom ring (zone 7) | 9.84″ — 4 segments | ≈ 160 mA expected | ~53 mA |
Against the ULN2803's 500 mA per-channel ceiling, 27 and 53 mA are nowhere near the limit. But read the ceiling honestly too: it is per channel, one at a time. Run channels together and the package's total dissipation becomes the real limit long before any single channel's 500 mA does. At this build's currents that limit never comes close; if you ever scale the tape, the package is the number to check, not the 500.
You will find a watts-per-foot figure printed on the spool box. It is deliberately not printed here, and no per-foot scaling rule is either: these are the two zone lengths this build cuts, they were measured, and measured figures are what the fuse and the supply get sized against.
Why T3.15AL250V. Fuse values come from an IEC ladder of preferred sizes, and 3.00 A is not on it — 3.15 A is the value that is "3 A." Decode the letters once and the part number stops being noise: T is time-delay (it rides through inrush instead of dying at every power-up), L is low breaking capacity (fine at 24 V), 250 V is the rating ceiling, not a requirement. And the day you run twice the tape, step to T4AL250V — the BoM has stocked that fuse beside the 3.15 since Doc 4, for exactly that day.
Graduating off the breadboard¶
The gate is Doc 8's and it is one sentence: stage 7's checklist passes on the breadboard first. Soldering makes a design permanent, so prove it works loose on the breadboard first. Every hour spent soldering an unproven chain is an hour of desoldering you scheduled for later.
When the checklist passes and the iron comes out, the technique chapter is already written: Doc 8's five soldering rules. They are not duplicated here. Rule 4 — beep everything before power — is this chapter's CP9–CP11 wearing work clothes.
One part in the drawer already belongs to that chapter, not this one:

- The 1000 µF 35 V bulk capacitor — Doc 8's power-board part. It waits in the drawer today; the breadboard build doesn't use it.
- CAUTION — the stripe marks the NEGATIVE leg. Electrolytics installed backwards fail loudly and sometimes wetly. When its day comes: stripe to ground, always.
When a zone is dark¶
Work the ladder top-down. Each rung is a witness, and each failure names exactly who it indicts — never skip a rung, because every rung you pass clears a suspect.
Rung 3's far end is the radio the commands travel through. It lives in the Home Assistant box, never gets a wire from this bench, and pairing happens on HA's screen:

- Stays plugged in exactly as it is — on the day, you open Add device in Home Assistant and the fixture pairs to this.
| Rung | Witness | Healthy reading | A failure here indicts |
|---|---|---|---|
| 1 | Tap the zone in the app | It lights | Nothing. Go home. |
| 2 | The hub ACK witness: ZB pca hub=0x40 present=1 |
present=1 |
present=0 → the I2C hop: SDA/SCL seating or swapped, VCC on 3.3 V, the address jumper. Settle this before rung 3 — see the note below |
| 3 | The zone's serial line in the console: ZB zone=1 on=1 level=255 |
The line prints as you tap | Missing while rung 2 reads present=1 → the command never reached the board: the network/app side, not one wire of yours. Missing while rung 2 reads present=0 → you are still on rung 2's fault, and this rung has told you nothing |
| 4 | CP13 — DMM on the zone's PCA LED pin, zone commanded 100% | ~3.3 V (the pin's average is duty × 3.3 V) | 0.00 V at 100% with the hub ACK good → the PCA output or OE |
| 5 | CP14 — DMM on the zone's ULN OUT pin | ~1 V commanded on; commanded off it reads high and unstable, ~8–24 V through the LED string — that instability is normal | ~1 V while commanded off → a stuck ULN channel |
| 6 | CP15 — across the lit channel, tape +24 pad to that channel's − | ~23 V | 23 V present and still dark → the tape itself: a joint past the probe, a dead cut, or a reversed pad |
| 7 | Nothing anywhere | — | Back to the stage-1 ritual numbers: bus, buck, grounds |
Why rung 2 comes before rung 3 — a silent zone line is not evidence
The firmware prints ZB zone=… only after a successful I2C write to that zone's hub. With the hub absent it skips the zone entirely and prints nothing — so on an unwired or mis-wired bus, a missing zone line is the expected output and says nothing at all about whether your tap reached the board.
Read the two together or you will misread both:
present=0, no zone line → the I2C hop. Your wiring. Rung 2.present=1, no zone line → the command never arrived. Network or app.present=1, zone line prints, still dark → downstream of the chip. Carry on to rung 4.
The radio was already proven end-to-end before any of this was wired, using the spotlight endpoint — which needs no hardware. So if the hub is answering and the zone line still will not print, suspect the app, not the copper.
One meter honesty note for rung 4: a DMM averages PWM. At 40% it reads ~1.3 V, at 70% ~2.3 V — numbers that look like faults and aren't. Never probe at partial level; command 100% and expect ~3.3 V, or learn nothing.
Every zone looks identical in the app
The zone endpoints carry no per-zone name, so Home Assistant lists eight entities all called "Light" — one spotlight and seven zones — with nothing on screen to tell you which is which. Do not guess, and do not trust list order.
Map them once, from the bench, and the ambiguity is gone for good: tap one, read which number the console prints. ZB zone=3 on=1 level=255 means that entity is zone 3. Rename it in Home Assistant on the spot, then move to the next. This only works once a hub is present — before that, per the box above, the zone lines are silent and you would be renaming from guesswork.
The checkpoint table¶
Every CP this chapter has named, in one place. Print it; tape it above the bench next to stage 4's zone table.
| CP | Setup | Measure | Healthy | If not |
|---|---|---|---|---|
| CP1 | Supply unplugged, continuity | +Vo ↔ +Vo | Beeps | Isolated outputs → single-pair rule; never bridge unproven terminals |
| CP2 | Same | −Vo ↔ −Vo | Beeps | Same branch as CP1 |
| CP3 | Same, resistance mode | + ↔ − | Short chirp, then climbs to tens of kΩ/OL (output caps charging — normal) | A beep that never stops = short — do not plug in |
| CP4 | Pigtails landed, cover ON, powered | Every pigtail pairing | 24 V ±5% on all | One pair differs → isolated outputs, single-pair rule |
| CP5 | Backbone | The bus, after the fuse | 24 V | Fuse seat, holder side, leads |
| CP6 | Backbone | Buck output, not connected to the ESP32 | 5.0 V | VIN/GND swapped — survives; fix, retest |
| CP7 | Backbone, Ω | Supply− ↔ star ↔ ESP32 GND ↔ every ULN pin 9 | < 1 Ω | A ground is chained or missing |
| CP8 | Chain, power off | The wire landing on PCA VCC | Beeps to the 3V3 rail and to nothing else | Rewire before power |
| CP8b | Both hubs, unpowered, resistance — compare the two boards | Hub #2's A0 pad pair, then hub #1's | Hub #2 near 0 Ω (a bridge is a dead short); hub #1's same pair reads high — kΩ or OL | Hub #2 not near 0 Ω → the blob only looks bridged: reflow it. Hub #1 near 0 Ω → you bridged the wrong board |
| CP8c | Both hubs on the bus, C6 powered over USB (the 24 V rail is not needed) | Which addresses answer the I2C scan / hub witness | 0x40 and 0x41, both | Only 0x40 → either #2 is unbridged (two boards colliding at one address) or #2 is not on the bus at all. The scan cannot tell you which — go back to CP8b |
| CP9 | After soldering | Each wire to each pad | Beeps to its own pad only, neighbours silent | Stray strand → reflow, re-beep |
| CP10 | Same | +24 pad ↔ each − pad | OL / no sustained beep (the LED string blocks the meter; a solid beep = solder bridge) | Reflow |
| CP11 | Zone chained, off | ULN OUT pin ↔ tape − wire | Beeps | Open → beep segment by segment |
| CP12 | First power, one zone — watch for 30 s (this meter has no current range) | Supply steady, all three whites lit, nothing warm | No hiccup clicking; three colors visible; everything cool | Hiccup/trip → find the short, don't retry blind |
| CP13 | Zone commanded 100% | The zone's PCA LED pin | ~3.3 V (duty × 3.3 V; a DMM averages PWM — never probe at partial level) | 0.00 V at 100% with hub ACK → PCA output/OE |
| CP14 | Zone commanded on, then off | The zone's ULN OUT pin | ~1 V on; off = high and unstable, ~8–24 V through the LED string (normal) | ~1 V while commanded off → stuck channel |
| CP15 | Zone lit | Across the lit channel | ~23 V | Dark with 23 V present → the tape or the joints |
Before you switch on¶
- CP1–CP3 passed on the bare terminals, unplugged
- Four pigtails landed — bare stranded copper under every screw, none tinned, all tugged
- The terminal cover is on (and goes back on before every power-up after this one)
- One fuse — T3.15AL250V on the bus pair's + leg — and only one
- Every ground runs direct to the star; nothing chained
- PCA VCC beeps to the 3V3 rail and to nothing else (CP8); V+ empty; A0 on board #2 bridged before its bus wires land, and proved near 0 Ω against board #1's open pair (CP8b)
- Both hubs answer once the C6 is powered — 0x40 and 0x41 (CP8c). Only 0x40 is not "one hub missing"; it may be two hubs colliding
- Zone 6's three signal wires come off hub #2, not hub #1 — chip 3 is the one chip fed by both boards (the fan-out)
- Every tape wire beeps to its own pad only (CP9); +24 to − pads all read OL (CP10)
- The 4-wire pigtail is strain-relieved within ~20 mm of the pads — and was before the tug test
- First power-up watched, not walked away from: supply steady, all three whites lit, nothing warm (CP12)
Done when: the supply is identified and pigtailed, every pad beeps to its own wire and nothing else, and you can point at the single place every ground meets.
Then go back to Doc 4 stage 2, power up, and put three sliders on one zone. Stage 4 scales it to seven.
Sources¶
Verified against primary documents rather than forum lore:
- Diode LED Valent X Tunable White product page and spec sheet — 24 V common anode, printed cut lines and pad markings
- NXP PCA9685 datasheet — 16-channel PWM over I2C, the address pins, OE behavior, and VIH = 0.7·VDD (the 3.3 V rule)
- Adafruit 16-Channel PWM/Servo Driver (product #815) documentation — the breakout's own SDA/SCL pull-ups, the A0–A5 address pads, and the control header duplicated at both ends of the board
- TI ULN2803A datasheet — Darlington saturation (the ~1 V), the 500 mA per-channel and package-dissipation limits, pin geometry
- Pololu D24V22F5 product page — fixed 5 V, 2.5 A, nothing to mis-adjust
- WAGO 221 series documentation — the 11 mm strip gauge and lever litany
- JST XH series datasheet — the 3 A rating behind the connector law
- Mean Well IRM-90 series datasheet — the ST screw-terminal block, Class II construction, 3.75 A rating, and hiccup-mode protection
Where a reading here disagrees with a datasheet's ideal — the ~1 V, the ~23 V, the ~80 mA — the bench number is the one printed, and the section that measured it says how.