Tesla · Lighting, Switches & Sensors · Fall 2025
Universal RGBW LED controller
Lighting designers needed a firmware engineer every time they wanted to try a colour preset. I proposed a standalone controller so they don’t, and built it from scratch, including my first PCB.
- 7 weeks
- concept to handoff
- 6×
- more LEDs per controller
- 2 revs
- schematic, A → B
- 10+ h
- a day, continuous duty
01Requirements
Done in 2 months, by December 2025
Reliable for 10+ hours a day
Enclosed and sturdy enough to carry between Fremont and LA
Full LED control, no firmware help needed
02Three prototypes in seven weeks

Arduino, keypad, knob and LCD from parts on hand. One strip, one colour channel at a time.

ESP32, five sliders, programmable buttons and an OLED. Several strips at once.

My own 2-layer board in an SLA-printed enclosure, handed off to the studio.
While waiting for components, I built P1 in an online ESP32 simulator to check the pin mapping, the UI flow and multi-strip control. Debugging the software and wiring early cut bring-up time once the hardware arrived.

ESP32, OLED, R/G/B/W and brightness sliders, strip-select buttons, four LED strips (shown as rings).

Selected strip, RGBW values (0–255) and brightness (0–100%).

On the bench.
03Choosing the microcontroller
P0 ran out of pins and needed a cable for every firmware update. I scored three options; ESP32 won on wireless updates and room to grow.
| Criterion (pass/fail) | Weight | ESP32 | Pico W | STM32 |
|---|---|---|---|---|
| Upgradable without a hardware redesign | 3 | ✓ 3 | ✗ 0 | ✓ 3 |
| Reliable for 40+ hours a week | 3 | ✓ 3 | ✓ 3 | ✓ 3 |
| Built-in wireless firmware updates (OTA) | 3 | ✓ 3 | ✗ 0 | ✗ 0 |
| Supports peripherals on different buses | 2 | ✓ 2 | ✓ 2 | ✓ 2 |
| Fast boot and recovery after a power cycle | 1 | ✓ 1 | ✓ 1 | ✓ 1 |
| Weighted total | 12 | 6 | 9 |
Each option either met what P1 needed or didn’t (✓ = weight, ✗ = 0). The Pico W can do over-the-air updates with a custom bootloader; the ESP32 has OTA built into its framework, which is what I scored.
04Schematic: Rev A, then Rev B
Several Rev A parts couldn’t arrive in time, so Rev B swaps each one for an equivalent I could get within a day. The circuit works the same.


- Level shifting1 × 74HCT244 (8 buffers)2 × 74AHCT125 (4 + 4)
- Button inputsMCP23017 chip, 16 buttonsSame chip on a module, 8 buttons
- Sliders6 sliders4 sliders (R, G, B, W), all on ADC1
- LED outputs8 channels6 channels, what the studio runs
- Input protection1 A fuse + series diode15 A time-delay fuse
05Power and protection
9 A max load is 60% of the selected 15 A fuse rating, below the 75% derating guideline. The 12 A adapter current-limits on overload; the fuse provides additional fault protection if a higher-current source is connected.
Fuse voltage rating exceeds the maximum system voltage.
Selected to tolerate the expected startup inrush from the 1000 µF bulk capacitor without nuisance opening.
06PCB
2-layer, mixed-signal, laid out in KiCad and reviewed with the EEs. I had it fabricated, then hand-soldered and assembled it.





07Does the buck converter need a heatsink?
Display 0.12 A + ESP32 0.25 A
79% efficiency, from my own load sweep
Thermal resistance network, IC to air
Conservative: all heat from one IC, no radiation
08Enclosure

- A rib under the PCB stops it flexing when buttons are pressed.
- Bosses and 1° draft ribs locate the board and set its height.
- Slider walls and keycap slots keep the controls aligned.
- Display bosses set the screen flush with the top.
- Snap-fits allow tool-free opening during testing.
0.5 mm deflection needs 13.45 N, in Formlabs Tough 1500



Easy to open, debug and change the fuse
Tougher, secure, no snap-hook undercuts in the tool













































