
Ledify
notaroomba/ledify
A super small addressable LED controller with USB-C PD up to 100W, a switchable 5V/12V output and Bluetooth!

A super small addressable LED controller with USB-C PD up to 100W, a switchable 5V/12V output and Bluetooth!
Ledify is an open-source printed circuit board by notaroomba, from the notaroomba/ledify repository on GitHub. It is a 2-layer board with 12 parts on 61 nets, routed with 29 tracks and 16 vias.
It is built around the ESP32-C6, FUSB302BMPX and USBLC6-2P6, with the DO5022P-103MLD and VS-6TQ045STRL-M3 among its other parts. Its parts include 5 capacitors, 4 ICs, 1 diode, 1 connector and 1 inductor. It belongs with the ESP32 and RISC-V boards of this library.
Key Features • PCB • Firmware • Credits • License
Designed in KiCad with attention to RF design and high current power delivery. The board is 4 layers with a solid ground plane under the ESP32, the flash and the antenna feed, and the LED buck follows the layout in the LM61495 datasheet.
| GPIO | Net | Function |
|---|---|---|
| 2 | LED_SW_V | LED voltage select (low = 5V, high = 12V) |
| 3 | LED_ENABLE | LED buck enable |
| 5 | LED_CON | LED data (SIG pad) |
| 6 | MIC_OUT | Microphone I2S data |
| 22 | MIC_CS | Microphone I2S word select |
| 23 | MIC_SCK | Microphone I2S bit clock |
| 10 | I2C_SDA | I2C data (FUSB302B, OPT4001) |
| 11 | I2C_SCL | I2C clock (FUSB302B, OPT4001) |
| 16 | USB_PD_INT | FUSB302B interrupt |
| 18 | SPI_MISO | Sensor SPI |
| 19 | SPI_MOSI | Sensor SPI |
| 20 | SPI_SCK | Sensor SPI |
| 21 | CS_IMU | BMI323 chip select |
| 7 | CS_BARO | BMP581 chip select |
| 12 | DN | USB D- |
| 13 | DP | USB D+ |
| 9 | CHIP_BOOT | Boot button |
| 8 | - | Strapping pin, pulled up to 3V3 |
Rev 1 works; these are the changes queued for rev 2, each with the reason it is worth a spin of the board.
| Change | Why | How |
|---|---|---|
| Measure the strip current | The power limit and the warnings are arithmetic from the frame; a measurement catches strips that draw more than the model and lets the firmware show real watts | INA226 (I2C, address 0x40 next to the FUSB302 at 0x22 and the OPT4001) with a 2 mΩ 2512 shunt high side on the LED rail after the buck (10 A gives 20 mV, 1 mA resolution; 0.2 W in the shunt). Its VBUS pin reads the rail, so it also sees the 12 V setting. ALERT to GPIO14 for an over-current interrupt |
| Second data output | Two strips from one board, or a strip fed from both ends with the data going into each half | A second SIG pad on GPIO17 (a second RMT channel in firmware). Both outputs through a 74AHCT1G125 each: 3.3 V data into 5 V pixels is out of spec today and works only over short leads |
| 5.2 V setting for long strips | A one-end-fed 5 V strip sags towards the far end and goes warm; starting 0.2 V higher is what long-strip supplies do | 499 kΩ from U6 FB to the drain of a 2N7002, gate from GPIO0 with a 100 kΩ pull-down. In parallel with the 24.9 kΩ bottom resistor it makes 23.7 kΩ, so 1.0 V × (1 + 100/23.7) = 5.22 V on command; the 12 V setting (14.3 kΩ switched in by Q1) is untouched |
| Power injection pads | The real fix for the sag is a second feed into the far end, and it needs a 10 A home on the board | A second VCC/GND pad pair next to the first, both on the wide copper of the LED rail |
| A user button | The BOOT button already toggles the output in firmware, but it sits under the case and shares the strapping pin | A button on GPIO1 with its own pull-up, away from the strapping pins |
| Microphone port | Board 1's ICS-43434 passes the electrical checks but hears nothing: the acoustic port is suspected | Confirm the port hole in the copper and solder mask under the mic, and keep the mic away from the buck inductor |
Free GPIOs after rev 1: 0, 1, 14, 17 (4 and 15 are strapping pins). The feedback network today: 100 kΩ top, 24.9 kΩ bottom, 1.0 V reference, 5.02 V; Q1 adds 14.3 kΩ in parallel for 12.0 V.
The firmware in firmware/ is an ESP-IDF v6.1 project with drivers for everything on the board: USB-PD negotiation on the FUSB302B, the LED strip, the light sensor, IMU, barometer and microphone. It takes the same text commands from three places: the USB serial console, Bluetooth (it advertises as Ledify with the Nordic UART service, so nRF Connect or Bluefruit Connect work) and MQTT. Point it at a Wi-Fi network and a broker and it shows up in Home Assistant on its own as a light with eight effects (solid, rainbow, temperature, spectrum, meter, sound, VU, pulse), an auto-brightness switch, sliders for the pixel count and the sound, light and temperature tunables, a chip-type select and illuminance, temperature, pressure and sound sensors. The colour source, brightness source and overlay can also be mixed freely, so a rainbow VU meter that dims in a dark room is three commands. Brightness is capped automatically to what the USB-PD contract can supply, so a long strip on a laptop port dims instead of browning out.
| Command | Action |
|---|---|
on / off | LED buck on or off |
rgb R G B | Fills the strip with a color (0-255 each) |
level N | Brightness cap (0-255) |
count N | How many pixels to drive (up to 1000, also a slider in Home Assistant) |
type ws2812 | Chip type: ws2812 (B/C/D/E, WS2813, WS2815), ws2811, sk6812, sk6812w, ws2816 |
mode NAME | Preset, also the Home Assistant effect: solid, rainbow, temp (blue-white-red from the temperature), spectrum (bass/mid/treble bars), meter, sound, vu, pulse |
color / bright / overlay | Mix your own: colour source, brightness source (level or sound), overlay (none, vu, pulse) |
auto on / auto off | Brightness follows the ambient light sensor, off below a night threshold |
gain N, lux LO HI, night N, temp LO HI | Saved tunables for the sound, light and temperature styles; temp 21.5 feeds a temperature in |
volt 5 / volt 12 | Selects the output voltage, turns the output off first. 12V needs a 15V+ PD contract |
status | JSON with the PD contract, network state, lux, temperature, pressure, motion and sound level |
pd / net | The charger's offered voltages / Wi-Fi and MQTT state |
wifi SSID PASS | Saves the Wi-Fi credentials and restarts |
mqtt URL USER PASS | Saves the broker and restarts |
ota URL | Updates the firmware over Wi-Fi, with automatic rollback |
The output always boots at 5V and off, and the board asks the charger for the highest voltage up to 20V as soon as it starts. Credentials, the strip length, the chip type and the tunables are stored in the ESP32's NVS partition, never in the code. SIG is 3.3V logic going to the strip's DIN; the wiring notes, MQTT topics and the Mosquitto-on-Railway broker setup are in firmware/README.md.
cd firmware
source ~/.espressif/tools/activate_idf_v6.1.sh
idf.py build
idf.py -p /dev/cu.usbmodem2101 flash monitorThis project uses:
MIT
notaroomba.dev · GitHub @NotARoomba ·
| Qty | Value | Footprint | References |
|---|---|---|---|
| 3 | 400pF | Package_TO_SOT_SMD:SOT-666 | C2, C3, C8 |
| 1 | 4.7uF | Package_TO_SOT_SMD:SOT-666 | C1 |
| 1 | 470nF | Package_TO_SOT_SMD:SOT-666 | C4 |
| 1 | DO5022P-103MLD | lcsc:IND-SMD_L18.0-W15.2 | L1 |
| 1 | ESP32-C6_C5364646 | lcsc:QFN-40_L5.0-W5.0-P0.40-TL-EP3.3 | U1 |
| 1 | FUSB302BMPX | Package_DFN_QFN:WQFN-14-1EP_2.5x2.5mm_P0.5mm_EP1.45x1.45mm | U4 |
| 1 | LM2678T-5.0/NOPB | lcsc:TO-220-7-L10.5-W4.5-P1.27-BL | U5 |
| 1 | USBLC6-2P6 | Package_TO_SOT_SMD:SOT-666 | U2 |
| 1 | USB_C_Receptacle_USB2.0_16P | Package_DFN_QFN:Texas_X2QFN-12_1.6x1.6mm_P0.4mm | J2 |
| 1 | VS-6TQ045STRL-M3 | lcsc:TO-263AB_L10.0-W9.2-P5.08-LS15.4-BL | D1 |
12 parts, built around the ESP32-C6, FUSB302BMPX, USBLC6-2P6 and DO5022P-103MLD. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.
From the notaroomba/ledify repository on GitHub, at the commit this page was made from: the board is pcb/ledify.collab/base/ledify.kicad_pcb and its schematic pcb/_restore_backup_2026-09-29T14-25-15-173/ledify.kicad_sch. PCBKit opens the board in the browser, with nothing to install.
Its repository states no licence, so its author keeps all rights: ask notaroomba before reusing the design.

notaroomba/ledify
A super small addressable LED controller with USB-C PD up to 100W, a switchable 5V/12V output and Bluetooth!

sequoia-hope/rp2350-motor-controller
An RP2350 based brushless motor controller

pdyxs/glider
Fork of zephray/glider (Modos Glider e-ink monitor) with a DP AUX polarity fix and a standalone GCC firmware build


kinggh0stee/WellD
ESP32-C6 Zigbee well monitor — reads a 4–20 mA pressure transducer and DS18B20, reports water level, temperature, and battery to Zigbee2MQTT with OTA update support


AngeloDuenas/SmartwatchProject
This is an ESP32 demo project showcasing LVGL v7 with support for several display controllers and touch controllers. The demo application is the lvdemowidgets project from the lvexamples repository.

