Wireless RGB Lighting Control System

Jul. 2025 - Sept. 2025

Designed and implemented a BLE-based wireless RGB lighting control system during an internship at NZXT, coordinating two RGB peripherals from a single central controller while investigating EMI/RFI performance inside a PC enclosure.

Embedded Systems BLE Firmware Arduino EMI/RF Measurement System Design

Project Overview

During a summer internship at NZXT, I designed and implemented a proof-of-concept wireless RGB lighting control system using Bluetooth Low Energy (BLE). The system uses a central Arduino Nano 33 BLE to coordinate two independent RGB peripherals (an SK9822 LED strip and a set of NZXT F420 RGB fans) entirely wirelessly, enclosed inside a PC case. In addition to building the prototype, I performed RF measurements to characterize the electromagnetic environment inside the chassis and authored a report recommending next steps for NZXT to evolve the prototype into a manufacturable product.

The Problem

System Architecture

Central Controller
Arduino Nano 33 BLE (nRF52840) that manages BLE connections, generates RGB frames and cycles lighting modes via a button interrupt
Peripheral 1 — LED Strip Controller
Arduino Nano 33 BLE that receives RGB data and commands over BLE and drives a 100-LED SK9822 strip via SPI with a 3.3V→5V level shifter
Peripheral 2 — UART Bridge
Arduino Nano 33 BLE that receives BLE data and forwards it over UART to a Raspberry Pi Pico, which generates the WS2812B timing-critical signal for RGB fans
Lighting Modes
RGB Live (continuous 19 Hz frame streaming) and four command-based presets (Rainbow, Theater Chase, Color Wipe) which can be toggled by a button on the central

Key Technical Decisions

RF Measurement Results

Performance Results & Limitations

What I Did

Recommendations Delivered to NZXT

Some Lessons and Regrets

Ultimately, I am proud of the work that I did this project. However, there are a few decisions I wish I made differently, and a few aspects I wish I prioritized more.

Sticking with Arduino's core was the biggest constraint I'd revisit. Arduino's Mbed OS layer and the ArduinoBLE library hid the parts of the chip I needed most. ArduinoBLE / Mbed Cordio capped me at 3 simultaneous connections and didn't expose TX power, connection interval, or other BLE settings. The Nordic SoftDevice layer exposes all of those, which matters for both scaling to more peripherals and for adjusting the RF environment inside the case. Additionally, this would have given me more experience working with lower level software and more opportunities to learn.

To be clear on why I stuck with Arduino: the goal of this project was to prove the concept was feasible, not to ship a full product. Arduino got me to a working prototype much faster than programming with Nordic's SDK would have. Moving to the SDK is the correct next step for anyone taking this toward a product.

I also wish I had looked into synchronization techniques like packaging an animation start time with the data. One change that would've certainly helped with synchronization would have been to use BLE's connectionless mode. This is where the central stops connecting and instead stuffs the RGB/command bytes into its advertising packets. The LED devices become passive observers (scanners) that read the payload off the air without ever connecting.