Voron CFW LED Lighting — Configurable Addressable Build
Lighting Mod Addressable Klipper Wiring V2.4
CFW (configurable) LED lighting turns your Voron's frame into a fully addressable light source you control from Klipper — dimming, colour, and per-LED effects all scripted to printer state. Unlike a fixed white light bar, a configurable addressable setup lets you run white light while printing, a soft blue while the chamber heats, and a rainbow sweep when the job completes. This guide walks through a complete build from parts to a working Klipper config.
Last updated: August 2026. Covers a single-zone addressable build (the simplest configurable setup) that can be expanded to multiple zones later. All pricing reflects China-direct sourcing.
What This Mod Does
- Configurable colour: Any colour from the full RGB spectrum, plus white on SK6812 (RGBW) strips.
- State-aware lighting: Klipper macros change the LEDs automatically — heating, printing, paused, finished, error.
- Brightness control: Dim for overnight prints, full brightness for maintenance and time-lapses.
- Expandable: Start with one zone, add a second or third later without rewiring the controller.
Parts List
- LED strip: SK6812 RGBW (recommended for true white) or WS2812B RGB, 30 LEDs/m, IP30. ~2m is enough for a V2.4 300mm frame.
- Printed diffuser channels: 4x vertical corner channels (ABS/ASA). STLs from the Voron User Mods repository.
- Power: A 24V-to-5V buck converter rated 5A or higher, or a dedicated 5V 5A PSU.
- Level shifter: 3.3V-to-5V for the data line if driving from a Raspberry Pi or 3.3V MCU.
- Wiring: 22 AWG silicone wire (red/black for power, plus a data wire), JST-XH connectors.
- Supporting parts: 1000µF capacitor (across 5V/GND at the strip input), heat-shrink tubing, zip ties.
Step 1 — Mount the Strips
Cut the LED strip into four equal lengths matching the height of your vertical frame extrusions (typically 4x 300–400mm). Solder short leads to each strip's 5V, GND, and data pads, then slide each strip into a printed diffuser channel with the LEDs facing into the diffuser. Snap the channels onto the four front vertical extrusions so the light points inward and downward into the chamber.
For a V0.2 or smaller build, two strips (left and right) are usually enough — the smaller chamber needs far less light. For a Trident, the fixed bed makes it easy to route all wiring underneath and up the back of the frame out of sight.
Step 2 — Wire Power and Data
Power: Wire all four strips in parallel to the 5V output of the buck converter (or the 5V PSU). For runs longer than 1m, inject power at both ends of each strip to prevent voltage drop — a strip that fades from bright white at the connector to yellow at the far end is under-powered, not faulty.
Data: Chain the strips in series — data-in of strip 1 connects to the level shifter output, data-out of strip 1 to data-in of strip 2, and so on. If you are driving from a Raspberry Pi or a 3.3V MCU, put a 3.3V-to-5V level shifter on the data line. The data signal degrades over distance, so keep the total data run under 2m.
Wiring summary:
- 24V PSU → buck converter (set to 5V) → LED strip 5V (all strips in parallel)
- MCU/Pi data pin → level shifter → strip 1 data-in → strip 2 data-in → strip 3 → strip 4
- All GNDs tied together (PSU, converter, Pi, strips) — a common ground is essential
- 1000µF capacitor across 5V and GND at the first strip to smooth power-on spikes
Step 3 — Klipper Configuration
Klipper drives addressable LEDs through the [neopixel] section. For an SK6812 RGBW strip use color_order: GRBW; for WS2812B RGB use color_order: GRB. Set chain_count to the total number of LEDs in your chain.
[neopixel cfw_light] pin: PA15 chain_count: 60 color_order: GRBW initial_RED: 1.0 initial_GREEN: 1.0 initial_BLUE: 1.0 initial_WHITE: 0.5
Step 4 — State-Aware Macros
The real value of configurable lighting is automation. Add a delayed macro that samples the printer state and sets the LEDs accordingly, then call it from your print start/end/error macros.
[delayed_gcode cfw_state_leds]
initial_duration: 1
gcode:
{% if printer.print_stats.state == "printing" %}
SET_LED LED=cfw_light RED=0.0 GREEN=0.5 BLUE=0.5 WHITE=0.5
{% elif printer.print_stats.state == "error" %}
SET_LED LED=cfw_light RED=1.0 GREEN=0.0 BLUE=0.0 WHITE=0.0
{% elif printer.idle_timeout.state == "Idle" %}
SET_LED LED=cfw_light RED=1.0 GREEN=1.0 BLUE=1.0 WHITE=1.0
{% else %}
SET_LED LED=cfw_light RED=0.0 GREEN=0.0 BLUE=1.0 WHITE=0.3
{% endif %}
For animations (rainbow, breathing, chase), install the community "LED Effects" Klipper plugin and trigger effects from your print-finished macro.
Troubleshooting
- Wrong colours or flickering: Usually a missing level shifter on the data line, a missing common ground, or a data run that is too long.
- Strip fades from white to yellow: Voltage drop — inject power at both ends of each strip.
- First LED stuck or garbled: The 1000µF capacitor at the strip input is missing, or the data wire runs too close to the heated-bed AC wiring.
- No light at all: Check the buck converter output is actually 5V (many ship preset to a different voltage), and that chain_count matches your real LED count.
Cost Breakdown (China-direct)
| Part | Cost (CN) |
|---|---|
| SK6812 strip 2m | $8–12 |
| Printed diffuser channels (pre-printed) | $10–15 |
| Buck converter + level shifter | $6–10 |
| Wiring, connectors, capacitor | $5–8 |
| Total | ~$30–45 |