DIY Rain Curtain Art 💧✨
A hypnotic wall of glowing water drops that fall in perfect rhythm — controlled by servos, lit up by LEDs, and choreographed entirely by your own code.
🧠 What Are We Building?
The Rain Curtain Art project is a kinetic light installation that drips water in glowing, rhythmic patterns — like a tiny indoor waterfall with a mind of its own. A row of small servo-controlled gates release single drops from a water reservoir, one after another, while an addressable LED strip glows and shifts color right beneath the falling water — creating a genuinely mesmerizing effect.
This project teaches servo timing and sequencing, addressable LED programming, and analog input control — all while building something that looks like it belongs in an art gallery.
💧 A Quick Safety Note
This project mixes water and electronics, so build with care: keep the Arduino, breadboard, and all wiring mounted well above the water line and shielded from splashes, always use a catch tray underneath, and have an adult help with wiring and testing. Never touch the circuit with wet hands.
🧰 Components Required
Everything you need, with approximate India pricing
| Component | Quantity | Approx. Price (INR) |
|---|---|---|
| Arduino Uno R3 | 1 | ₹550 |
| SG90 Micro Servo Motor (drip gates) | 6 | ₹900 |
| WS2812 Addressable LED Strip (16 LEDs) | 1 | ₹250 |
| 10kΩ Potentiometer (speed control) | 1 | ₹20 |
| Push Button (pattern select) | 1 | ₹10 |
| Small Plastic Reservoir Tube / Bottle | 1 | ₹50 |
| Silicone Drip Nozzles (set of 6) | 1 set | ₹80 |
| Fine Fishing Line / Thread | 1 spool | ₹20 |
| Water Catch Tray / Basin | 1 | ₹150 |
| Breadboard | 1 | ₹90 |
| Jumper Wires (M-M, M-F) | 1 set | ₹99 |
| 5V 2A Power Adapter | 1 | ₹180 |
| Acrylic or Wood Frame Sheet | 1 set | ₹300 |
| Hot Glue Gun + Silicone Sealant | 1 | ₹200 |
💡 Source electronics from Robocraze, Flyrobo, or Robu.in. Nozzles, tubing, and trays are easy to find at aquarium or hardware stores.
🔌 Circuit Diagram
How everything connects to the Arduino Uno
📌 Pin Connection Table
| Component | Pin on Component | Arduino Pin |
|---|---|---|
| Drip Servo 1 | Signal | D2 |
| Drip Servo 2 | Signal | D3 |
| Drip Servo 3 | Signal | D4 |
| Drip Servo 4 | Signal | D5 |
| Drip Servo 5 | Signal | D6 |
| Drip Servo 6 | Signal | D7 |
| WS2812 LED Strip | Data In | D8 |
| Push Button | One leg | D9 (other leg to GND) |
| Potentiometer | Wiper (middle pin) | A0 |
| All Servos + LED Strip | VCC / GND | External 5V 2A supply / Common GND |
🛠️ Step-by-Step Build Guide
Build the Frame
Construct a simple upright frame from acrylic or wood, tall enough to mount a water reservoir at the top, servos in the middle, and leave clear space below for the falling water and a catch tray.
Set Up the Drip Reservoir
Fit your plastic reservoir with 6 small silicone nozzles spaced evenly along the bottom, each capable of releasing a single drop when unblocked.
Attach the Servo Gates
Mount each servo just above its nozzle. Tie a fine thread from the servo arm to a small rubber stopper inside the nozzle — rotating the servo lifts the stopper briefly, releasing one drop, then lowers it to seal again.
Mount the LED Strip
Position the WS2812 strip just behind or beneath the falling water path so each drop catches the light as it falls, creating that glowing, satisfying sparkle.
Wire the Circuit
Connect all 6 servos, the LED strip, potentiometer, and push button to your Arduino as shown in the circuit diagram and pin table. Power the servos and LEDs from the external 5V 2A supply, keeping GND common with the Arduino.
Upload the Code
Install the Servo and Adafruit_NeoPixel libraries in the Arduino IDE, then upload the sketch below. Fill the reservoir with water once the electronics are safely mounted above the splash zone.
Test & Calibrate
Turn the potentiometer to adjust drip speed, and press the button to cycle between Wave, Random Sparkle, and Rainbow Chase patterns. Fine-tune each servo's open angle until drops release cleanly, one at a time.
💻 Arduino Code
Upload this sketch using the Arduino IDE (after installing Servo.h and Adafruit_NeoPixel.h)
// Rain Curtain Art - MakeMindz Robotics Project #include <Servo.h> #include <Adafruit_NeoPixel.h> #define NUM_SERVOS 6 #define LED_PIN 8 #define NUM_LEDS 16 #define BUTTON 9 #define POT_PIN A0 Servo dripServo[NUM_SERVOS]; int servoPins[NUM_SERVOS] = {2, 3, 4, 5, 6, 7}; const int CLOSED_ANGLE = 0; const int OPEN_ANGLE = 60; Adafruit_NeoPixel strip(NUM_LEDS, LED_PIN, NEO_GRB + NEO_KHZ800); int pattern = 0; // 0 = Wave, 1 = Random Sparkle, 2 = Rainbow Chase bool lastButtonState = HIGH; void setup() { for (int i = 0; i < NUM_SERVOS; i++) { dripServo[i].attach(servoPins[i]); dripServo[i].write(CLOSED_ANGLE); } pinMode(BUTTON, INPUT_PULLUP); strip.begin(); strip.show(); } void loop() { checkButton(); int speedVal = analogRead(POT_PIN); int dripDelay = map(speedVal, 0, 1023, 60, 400); // faster/slower rhythm if (pattern == 0) waveDrip(dripDelay); else if (pattern == 1) randomDrip(dripDelay); else rainbowChase(dripDelay); } void checkButton() { bool state = digitalRead(BUTTON); if (state == LOW && lastButtonState == HIGH) { pattern = (pattern + 1) % 3; delay(250); // simple debounce } lastButtonState = state; } void releaseDrop(int index) { dripServo[index].write(OPEN_ANGLE); uint32_t c = strip.Color(0, 200, 255); strip.setPixelColor(index * (NUM_LEDS / NUM_SERVOS), c); strip.show(); delay(120); dripServo[index].write(CLOSED_ANGLE); strip.clear(); strip.show(); } void waveDrip(int speed) { for (int i = 0; i < NUM_SERVOS; i++) { releaseDrop(i); delay(speed); } } void randomDrip(int speed) { int i = random(0, NUM_SERVOS); releaseDrop(i); delay(speed); } void rainbowChase(int speed) { static int hue = 0; for (int i = 0; i < NUM_SERVOS; i++) { dripServo[i].write(OPEN_ANGLE); strip.setPixelColor(i * (NUM_LEDS / NUM_SERVOS), strip.ColorHSV((hue + i * 4000) % 65536)); } strip.show(); delay(100); for (int i = 0; i < NUM_SERVOS; i++) dripServo[i].write(CLOSED_ANGLE); strip.clear(); strip.show(); hue += 1500; delay(speed); }
⚙️ How It Works
Each servo controls a tiny gate on one drip nozzle. When a servo rotates to its "open" angle, it lifts a small stopper for a fraction of a second, releasing exactly one drop of water before sealing shut again. The Arduino times these releases in different patterns — a smooth left-to-right wave, an unpredictable random sparkle, or a full-color rainbow chase — while the addressable LED strip lights up in sync, right as each drop falls. Turning the potentiometer speeds up or slows down the whole rhythm, and the button cycles through the three light-and-drip patterns.
❓ Frequently Asked Questions
Yes, as long as you follow the safety guidelines: keep the Arduino and wiring mounted well above the water line, use a catch tray, and never handle the circuit with wet hands. Adult supervision is recommended for the water and wiring steps.
Servos are cheaper, easier for beginners to wire, and don't need extra driver circuitry. Solenoid valves are faster and more precise, but they're a great upgrade once you've mastered the servo version.
Check that the thread length lifts the stopper just enough to break the seal without pulling it out completely, and adjust the OPEN_ANGLE value in the code in small steps until each nozzle releases a single clean drop.
Yes — that's a great upgrade! Add a small submersible pump in the catch tray to pump water back up into the reservoir, creating a continuous loop.
You can scale up to as many as your Arduino's digital pins allow (or add a servo driver board like the PCA9685 for many more), just remember to add more nozzles, thread mechanisms, and update NUM_SERVOS in the code.
🚀 Upgrade Ideas
🔁 Water Recirculation
Add a small submersible pump in the catch tray to continuously refill the reservoir, so it can run for hours without a refill.
🎵 Music Sync
Add a sound sensor or microphone module so the drip patterns and LED colors react to music beats in real time.
📱 App-Controlled Patterns
Add a Bluetooth module so you can switch patterns and adjust speed right from your phone instead of the button.
🔡 Falling Text Curtain
Scale up to more drip points arranged as a grid, and time them to spell out letters or simple shapes as they fall — like a mini digital water display!

Comments
Post a Comment