Desk Lamp with Modular Communication System

Last Updated March 27th, 2026

My friends and I designed and entered a modular desk lamp that we called a LinkLite into a competition at our University. This competition was the Lutron Lighting Innovation competition.

Click here for a video demonstration and explaination of the project!

Our project was a battery powered (charged via USB-C) cylindrical lamp with a top that could twist as well as push down as a button. When you twist the top, it increases and decreases the brightness. When you press and twist the top, you control the warmth of the light it emits. Theres a side button, that when pressed, the lamp shines a primary color: red, blue, or green. Think of it like a radio, and that's the frequency/channel its tuned to. Once a second LinkLite is within range and on the same channel, they sync their states automatically. So, if one were to be made darker and more cooler, the second would sync without delay. It uses a leaderless communication protocol derived from ESP-NOW.

Here's a picture of the finished product along with a cross section of our CAD assembly.

The competition's prompt for us was to make some sort of project that incorporates light in any way, so it was very open ended. We thought of making some sort of personal light source that was very minimal in design, and not too complex for the end user. We ended up getting 2nd place in the competition out of 42 teams who signed up!

Technical Info

As for the electronics, we incorporated an ESP-32D dev board, an AS5600 magnetic encoder, a 2500mAh 3.7 LiPo Battery, a FM5324GA battery charger IC, and a standard strip of decorative wall LEDs. Below is the schematic of our electrical components. I soldered the ESP-32D to a perfboard with its connections exposed via JST connectors.

Below is the layout diagram I created for soldering the perf-board, as well as a photo of the perf-board and ESP-32D board side by side.

As for the communication protocol, we used ESP-NOW with our own leaderless Last Write Wins (LWW) protocol. Click here to read more about the packet anatomy and how we send/sync states between LinkLites.

Embeded below is the C++ code that we ran on the ESP-32D for our LinkLite project, it includes the control code as well as the sync/communication code for anyone curious how we did it or looking for examples of modern ESP-NOW communication code.