How to make a changing cloud lamp using an Arduino, addressable LED, buttons, and photoresistor! Using very minimal and basic skills.
So you’ve decided that you want to make a cloud lamp! You’ve come to the right place. In this tutorial I will walk you through all the steps of crafting a cloud lamp, including variations on material, style, and craft.
This project was completed in October 2021 as an assignment for the Physical Computing class at ITP in Brooklyn, New York. The original intent was to design a color-changing lamp that could also play a song to match the mood of the lighting. I hope that this tutorial can be updated one day to include the audio functionality.
Design your cloud shape!

This cloud shape was designed by Tony Li, my classmate at ITP. Use a 3D modeling software to design your cloud shape! My preferred software is Rhino for 3D modeling, but Tony used Cinema 4D. Once you have your cloud shape, we have to talk about how you’re going to make it.
Build the cloud!

This is the most important part of the process. Craft is everything, and without it, all our work would be an arts and crafts project. We 3D printed our cloud in transparent PLA, and had to scale it down to fit the printer bed. Remember that this cloud is also a container - you have to craft it so that it can hold lights and has a bit of transparency so that the lights can glow through. Another idea would be to make perforations in the model that let light pierce through.
Ways to Make It: 3D printing 3D printing is really simple if the machine is well-calibrated. If it’s not, it can be an absolute nightmare. If you have never 3D printed something before, I recommend having an assistant on hand to help you out if things go wrong. It took me 2 weeks and 3 full attempts to print each half of the cloud lamp, not even counting the minute fails, and I used to run the 3D printer lab in architecture school. Plus, on a machine that you’re unfamiliar to, it will take a while to understand its weird little habits. If you already have your 3D model ready, you have to export it as an STL file, and ‘slice’ it in a proprietary software so that the printer can read the file. Ultimakers and Ender models use Cura; Makerbots use Makerbot software; Prusa machines use Prusa 3D. I opted for a quick low-res print at a 0.2mm layer thickness to emphasize the low-res nature of the cloud form. The Makerspace at NYU had transparent filament loaded on just one Ultimaker, so I cycled through that machine several times. TIP: Add more support than you think you need! Supports are designed to be easily removable and they will add time to your overall print, but it’s definitely better than reaching the end of your print and having it fail. I printed my pieces with the interior facing the bed so that support would be added to the interior face of the model, and the exterior would have a nicer finish Note: There are many other ways to 3D print this, including SLA and resin printing, which produce very smooth and clean surfaces that may be optimal for light to pass through. TIP: The more space there is between the exterior shell and the interior container, the more diffused the light will be. Or paint the model in a light speckled coat of paint to diffuse the exterior surface.
Ways to Make It: Vacuform One idea that I had was to take a huge block of wood and craft it into a cloud using power tools. You can do it by hand or with a CNC! This entire cloud has to be split half and placed in a vacuform machine that will heat up a sheet of plastic and cool it to the shape of the form. This is an awesome way to make many cloud models en masse! Note: You cannot mold plastic with a plastic form. If you try to mold a 3D print, the print will melt with the forming plastic.
Assemble the Cloud!

What parts do you need?
The physical cloud model
Addressable LED strip - I used WS2812B lights
Arduino UNO (or Nano)
Breadboard
5V power supply
Photoresistor
Buttons! (I used 3)
220 Ohm Resistors
1000 uf capacitor
How will you attach everything together?
How are you displaying your cloud?
If you’re going to hang it, drill a hole at the top of the cloud to let cables out
If it will sit on a stand, drill a hole at the bottom of the cloud
Stick your LEDs in there
If the cloud will sit on a stand, it’s nice to stick the photoresistor on the top face of the cloud. This will require a small hole to let it come out.
The Breadboard Reference these tutorials to get the breadboard straight:
Connect the Arduino to ground and have your power source ready (either through the port or the power pin)
All components need to be connected to power and ground!
The LEDs need a 5V power source and a 1000 uf capacitor
The output pins send values through ground
Resistors are connected on the ground line
Code the Cloud!
Here are the components for my file:
Link the FastLED library (and see their tutorials on editing the light colors and values) The FastLED library is easily installable from the Arduino library manager (yay!)
#include <FastLED.h>
//define how many LEDs you are using on the strip
#define LED_COUNT 15
#define LED_PIN 5
//include this line to link FastLED and the LED count
CRGB leds[LED_COUNT];
Write your global variables for the pins, their “read” values, and the light mode
//led reads
int green = 2;
int greenRead;
int red = 3;
int redRead;
int blue = 4;
int blueRead;
int photo = A0;
int photoRead;
int mode =0;
//mode 1 = calm - blue button
//mode 2 = work - green button
//mode 3 = party - red button
Set up the pin inputs and outputs
void setup() {
// put your setup code here, to run once:
pinMode(green, INPUT); //green button
pinMode(red, INPUT); //red button
pinMode(blue, INPUT); //blue button
pinMode(photo, INPUT); //photoresistor
pinMode(LED_PIN, OUTPUT); // LED strip
//this line is specific to the LED strip, and can be edited using notes from FastLED
FastLED.addLeds<WS2812B, LED_PIN, GRB>(leds, LED_COUNT); //LED strip
}
The main event! For every LED, if the light in the room is dim, the lights will turn on. If a button is pressed, then the color mode for the LEDs will change. If the light in the room is high, the lamp will not be lit. The color modes reflected in this sketch are very simple - ‘red,’ ‘green,’ and ‘blue.’ I encourage you to watch the FastLED tutorials to design your own lighting schemes, that’s where the real fun lies!
void loop() {
// put your main code here, to run repeatedly:
//is the light on? photoresistor
photoRead = analogRead(A0);
//print the photoresistor value in the Serial Monitor.
//check the photoresistor values every time you run the sketch in a new place. they're very sensitive and might need to be replaced
Serial.println(photoRead);
//turn on the lamp when it's dark
for(int i=0; i < LED_COUNT; i++){
greenRead = digitalRead(green);
redRead = digitalRead(red);
blueRead = digitalRead(blue);
//this if loop turns the cloud on when the lights in the room go out
//the photoread value will need to change based on the photoresistor you're using
//and the light levels in the room
if(photoRead<600){
//the green, red, and blue buttons change the mode when they are pressed
if(greenRead == HIGH){
mode = 1;
} else if(redRead == HIGH){
mode = 2;
} else if(blueRead == HIGH){
mode = 3;
}
if(mode==1){
//mode 1 leds
leds[i] = CRGB::Green;
FastLED.show();
} else if (mode==2){
//mode 2 lights
leds[i] = CRGB::Red;
FastLED.show();
} else if (mode==3){
//mode 3 lights
leds[i] = CRGB::Blue;
FastLED.show();
}
} else {
leds[i] = CRGB::Black;
FastLED.show();
}
}
}