← Stijn Bruggeman

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 first sketch
Building the lampBuilding the lampBuilding the lampBuilding the lampBuilding the lampBuilding the lampBuilding the lampBuilding the lamp The lamp, off The lamp, on

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

The 2018 Android app The 2018 Android app The 2018 Android app

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.

The wake-up light page The wake-up light page

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.

The 2026 iOS app The 2026 iOS app The 2026 iOS app

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 2018 build with every LED marked, colour-coded by disc

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.

The 2018 build with seven measured distances drawn on it

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.

<the flock, 5 blobs>
<the lamp hanging in the room, lit>