A Low Cost Approach to Graphical Waterfall

Hi my Friends,
World is full of genius persons and i amazed to see how computer made life easier and how the ideas evolves and takes it shapes in real world...Long story short, sometime ago i saw a graphical fountain on You-tube:

Watching this video amazed me and convinced me to make a cheap but high quality version of the same... Looking at the fountain, it seems that water droplets are controlled through 100's of solenoid valves and each of the solenoid valve is controlled through computer in a complex manner and a complex programming...
So to make a computer controlled graphical fountain, we require:

1- A complex software that generate images into binary data and send to micro-controller.
2- Electronic hardware that plays as a bridge between Computer and Solenoid valves.
3- Mechanical structure that hold overhead reservoir with solenoid valves and a drain.

All above tasks are doable..... So i started making program and electronics hardware at the same time... when i tired from electronics i started programming... so eventually both the software and hardware completed at the same time..
The following picture of software shows how a number of solenoid valves can be operated in a manner to make beautiful stunning water effects....The Software is user friendly and designed to operate in following steps:
1- You have to select an image
2- Select the number of solenoid valves you have installed on the fountain. The greater the number of valves the greater the resolution and beauty of fountain.
3-Convert this image into '1' and '0' i.e. binary data... If you check the 'Add each design to one file' checkbox..you will have different designs in a single file
4-Open the computer USB port at which the micro-controller is installed.
5-Press 'SEND' button and see the stunning effects..

6- A Loop checkbox and STOP button is added. If the 'Loop Checkbox' is ticked, the graphical hexadecimal data will be send to the micro-controller in a loop. So we will able to continuously run the graphical fountain and repeat the designs.
7- Pressing the Stop button will check how many bytes are in shift registers. Then the software will send numbers of '0X00' to finalize the shiftout function. After shifting out the software will turnoff all the valves by sending 5-bytes '0X00' to the controller.

That's cool! Did you get the hardware completed?

msut be on the moon the see it slowly !

Nice effect

Hi Coyote,
The hardware is almost complete. I am using 40 Solenoid valves 24VDC 260mAmp.
Here is the PCB sketch where i am using Qty:05EA shift registers 74HC595 and the PCB also serves as a simulator with 40 LED installed. The PCB also contains 40 IRF540 to drive the solenoid valves.

Here is the completed PCB:

and here is 6inch diameter PVC Header pipe with 40 drains dia 8mm each. The Pipe also have connections for inlet / outlet of water supply.

Here is the solenoid valves i am using for this project:

Here are the 40 solenoid valves attached to the rig.

A small video where i am experimenting with a single solenoid valve. the simulator also works great:

Great project :slight_smile:

Thank you EVP...
Some more updates:
For fast response of the solenoid i made a RC circuit. resistor 47Ohm 5Watt, capacitor 50V 100mFarad... Now i will use 33V power supply to drive the Solenoid.

Also installed the fixture for Header pipe and solenoids, you can see the sump of galvanized sheet.

Today i did tubing and wiring of solenoids...

wow .. it's nice and very big project :sweat_smile:

This looks very impressive, can't wait to see the final product!

Today i did wiring work from solenoid valves to microcontroller. ... lets see whats happen... I know the wiring is not organized so dont point ]:smiley:

Today i did wiring work from solenoid valves to microcontroller. ... lets see whats happen... I know the wiring is not organized so dont point ]:smiley:

Points at wiring

This is first test of graphical waterfall consist 40 solenoid valves. All the things working fine but the graphics are hardly visible due to:
1- I have long tubing downstream the solenoids...If small metallic nozzles directly connected to the solenoid i would have got good results.
2- The Height of the solenoid. The solenoid are installed at about 8feet height, i think to see the graphical effect it must be 20 feet or above.

Any comments to improve will be highly appreciated:

Maybe some food coloring in the water would help the visuals better?


Yes or ink and maybe a strong uv light as well. I want this project to work i might have a go myself i think it needs more hight as well, you might have to take it out side.

Awesome project!!! :smiley:
Yeah, some dark food color would definitely help and maybe some white sheet as background.

Can't wait to see more.

Thanks for all of your help and suggestions… I am going to abandoned this project as i got poor results… But i hope someone will come here with clever ideas and make this whole thing work. Following is the last video of the show:

I can attach the the visualbasic files (Source Code) so that the software can be further improved to get realistic results. I am sorry the source code is not well commented and please don’t ask me programming related questions:

I am attaching the Arduino Sketch for controlling the 40 solenoid valves. May be someone can improve the sketch and send me so that i can try on my hardware. Following is my email address:

//Pin connected to ST_CP of 74HC595
int latchPin = 6;
//Pin connected to SH_CP of 74HC595
int clockPin = 13;
////Pin connected to DS of 74HC595
int dataPin = 11;
byte FirstByte;
byte SecondByte;
byte ThirdByte;
byte FourthByte;
byte FifthByte;
int val;
byte serialInArray[5]; // array for storing 5 bytes as they arrive from VB software
int serialCount = 0; // for counting the number of bytes received

void setup() {
  //Start Serial for debuging purposes	
  //set pins to output because they are addressed in the main loop
  pinMode(latchPin, OUTPUT);


void loop() {
   if (Serial.available() > 0){
       serialInArray[serialCount] = Serial.read(); // read a byte sent by processing
        serialCount++;  // increment number of bytes received

    if (serialCount > 4 ) {  
	FirstByte = serialInArray[0]; 
	SecondByte = serialInArray[1]; 
        ThirdByte = serialInArray[2];
        FourthByte = serialInArray[3];
        FifthByte = serialInArray[4];

     digitalWrite(latchPin, 0);
    shiftOut(dataPin, clockPin, FirstByte); 
             shiftOut(dataPin, clockPin, SecondByte);
                 shiftOut(dataPin, clockPin, ThirdByte);
                 shiftOut(dataPin, clockPin, FourthByte);  
       shiftOut(dataPin, clockPin, FifthByte);
    //return the latch pin high to signal chip that it 
    //no longer needs to listen for information
    digitalWrite(latchPin, 1);
 serialCount = 0;
void shiftOut(int myDataPin, int myClockPin, byte myDataOut) {
  // This shifts 8 bits out MSB first, 
  //on the rising edge of the clock,
  //clock idles low

//internal function setup
  int i=0;
  int pinState;
  pinMode(myClockPin, OUTPUT);
  pinMode(myDataPin, OUTPUT);

 //clear everything out just in case to
 //prepare shift register for bit shifting
  digitalWrite(myDataPin, 0);
  digitalWrite(myClockPin, 0);

  //for each bit in the byte myDataOut�
  //This means that %00000001 or "1" will go through such
  //that it will be pin Q0 that lights. 
  for (i=7; i>=0; i--)  {
    digitalWrite(myClockPin, 0);

    //if the value passed to myDataOut and a bitmask result 
    // true then... so if we are at i=6 and our value is
    // %11010100 it would the code compares it to %01000000 
    // and proceeds to set pinState to 1.
    if ( myDataOut & (1<<i) ) {
      pinState= 1;
    else {	
      pinState= 0;

    //Sets the pin to HIGH or LOW depending on pinState
    digitalWrite(myDataPin, pinState);
    //register shifts bits on upstroke of clock pin  
    digitalWrite(myClockPin, 1);
    //zero the data pin after shift to prevent bleed through
    digitalWrite(myDataPin, 0);

  //stop shifting
  digitalWrite(myClockPin, 0);

Hi there! It is too bad that you abandoned this! I was about to suggest getting a BRIGHT backlight for the waterfall, possibly combined with food coloring as others suggested. This gives you a large amount of CONTRAST between the water and whatever is the 'background'... this is what makes an image great is the contrast.

Also once you get your light all setup, try testing it at night... wow that would be COOL!

I am interested in looking at your software code, although I need to brush up on my VB. The main reason I want to look at the SW code is I am doing a similar project using LED's. I want to make something similar to this:



If you think about it the concept is nearly identical to yours except using LED instead of solenoids... in fact it's the same as your "Test" apparatus with LED... except mine will be miniaturized in order to fit in something more portable.

Thanks for your thread, it was very interesting/entertaining. I wish you luck with future endeavors!

Hello, I think you have done two mistakes, first you have not placed solenoids on the same level ! and the second is that you have redirected water from solenoids with long pipes, the plastic valves distort the image. remove the pipes after solenoids and place the solenoids on single line !

where i can get this awesome software ?

Very interesting project!

I'd agree with the assessment that the long thin hoses right at the outlet of the solenoid valves absolutely kill the whole idea. What you are trying to achieve with the hopefully very fast solenoid valves is essentially a pulse width modulated signal. The hoses work like a capacitor of sorts, filtering your nice clean signal edges.

Once you've done that it may still not work as you may need more height than a door to form a pattern.

Also a dark background and some back lighting ore better strong side lighting (perhaps recessed in the door frames) would make these water lines more visible.