My cloud lamp and its LEDs
It's shaped like a cloud but it doesn't talk to one; it lives on the local network.
2018
I built this lamp in 2018. I designed the shape and the circuits, sourced the components, MOSFETs, transformers, transistors, wood, soldered and assembled everything, and wrote the firmware for the ESP8266 that drives it and an Android app to control it. It was the first firmware and the first app I ever wrote, back when you figured everything out from Stack Overflow and tutorials.
It has two kinds of LEDs: RGB ones that can be controlled individually, 109 of them, and warm-white ones that are dimmed together.








The app could turn the lamp on and off, set the colour and the brightness, and run a few animations.

2020
I added a wake-up light: a small Python server on my home network that fades the lamp in in the morning. I did it as a server rather than in the firmware because the firmware had no over-the-air updates, so every change meant plugging in a cable.

2026
I moved over to iPhone a while ago but kept my Android for the lamp because I didn't have time to build an iOS app. But with AI agents this changed; in a short time I was able to create an iOS app and also improve the firmware of the lamp with over-the-air updates, Wi-Fi setup instead of credentials hard-coded in the firmware, and animations. More on these animations below.

Unlocking more animations
The animations so far were pretty simple; cycle the colours through a rainbow, cycle individual circles through colours, etc. To go further and move animations across the lamp in 2D space, I needed the position of each LED. Turns out this wasn't so difficult to achieve. I took a picture with all LEDs visible and (using a tool an AI agent one-shot) I clicked every LED in the right order.
The photo gave positions in pixels; I needed centimetres. It's difficult to measure the lamp top to bottom or left to right, because it's not a square, it's circles. Instead I measured several point pairs on the image and typed in the distance between them. Again in a tool one-shot by an AI agent.
When calculating the scale some anisotropy turned up: the picture probably wasn't taken exactly at 90°. Some math resolved this; it turns out the camera was about 12° off perpendicular. With that taken into account I had an exact map of the LEDs in 2D space.
Animations
With positions in centimetres, animations can now be described with math in real units. A simple example: a wave with a wavelength of 25 cm, moving at 20 cm per second. Other more fun animations are possible too, for example a flocking algorithm with 5 blobs of varying sizes.