Project tutorial
Project Rising Water

Project Rising Water © GPL3+

Make water defy gravity, all while creating fantastic lighting effects!

  • 1 comment
  • 8 respects

Components and supplies

Ph a000066 iso (1) ztbmubhmho
Arduino UNO
11026 02
Jumper wires (generic)
Pcb products
Custom PCB
Water Pump
Water Tube
Ethernet Breakout Board
Wire, Wrapping Wire
Any funnel Will do as long as it's 5.5 inches in diameter
General Magnets
On/Off switch for power
Waterproof RGB light strip
09939 01
Rotary potentiometer (generic)
Alphanumeric LCD, 16 x 2
29c8785 40
Pushbutton Switch, Momentary
12C LCD Backpack
Ac/Dc 12v power supply
73ac8746 40
Ethernet Cable, 1 m

Necessary tools and machines

Laser cutter (generic)
Table Saw
70y8518 40
Drill / Driver, Cordless
Hy gluegun
Hot glue gun (generic)
Nail Gun

Apps and online services

Ide web
Arduino IDE
A free software that we used to design svg. files for our laser cutter.

About this project

Rising Water is a project for our advanced physics class at Animas high school. Our class consists of two seniors, Cole and Evan, and a two sophomores, Taylor and Kian, and our teacher Kurt. We started to study a phenomenon called the Wagon Wheel effect. The Wagon Wheel effect is the perception off light of a moving object being interrupted rapidly as the object moves making the object look as if it is moving in the opposite direction that it is spinning. We see this most of the time on TV or video with vehicle wheels. The rims of the wheels look to be moving in the direction of the vehicle then at a certain point the rim will start to look as though it is going backwards. The reason this happens is due to the camera breaking up the light into frames. We wanted to demonstrate this effect and looked for a project to show it. We found a YouTube video by isaac879 and his RGB time fountain project. We wanted to replicate his project and began planing it.

We started by creating a 555 timer circuit to try and control a small set of LED's to flash rapidly. We then studied mosfets and how they work and adding them into our basic circuit. Next, we tried to run some strips of RGB LED's using our circuit. After succeeding with that we moved into controlling our frequency of the blinking LED's with an Arduino using the mosfets to ground switch the lights. While doing this we also created a voltage divider to limit the amount of voltage coming to the Arduino while also fully powering the LED's.

Next, we added more to the code and after some trouble shooting we added the color changing function. This took some time because we had to figure out how to use a potentiometer to fade in and out of the three primary colors allowing us to create a whole host of colors. After some tedious math work we figured it out and moved on.

This lead us to our final product as shown below.

We use a simple water pump to push water to the top and create a steady stream of dripping water. As the water is falling we then use our strobing LED's set to a specific frequency enabling us to make it appear like the water is falling slower or even falling up.

This is the schematic for our circuit. The download for it is in the Hardware section. The file is for Fritzing. See notes under download for minor changes to the LCD portion.


Scrolling LCDArduino
This is our basic code for scrolling our LCD screen without delay allowing us to implement it into final code without breaking it.
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,16,2);  // set the LCD address to 0x27 for a 16 chars and 2 line display

const int  buttonPin = 2;    // the pin that the pushbutton is attached to
const int ledPin = 13;       // the pin that the LED is attached to
int buttonState = 0;         // variable for reading the pushbutton status

unsigned long previousMillis = 0;        // will store last time LED was updated
const long interval = 700;           // interval at which to blink (milliseconds)

int mode = 0;

void setup()
  int previousMillis = 0;
  int interval = 500;

  pinMode(ledPin, OUTPUT); // initialize the LED pin as an output:
  pinMode(buttonPin, INPUT_PULLUP); // initialize the pushbutton pin as an input:

  lcd.init(); // initialize the lcd 
  lcd.backlight();  // Print a message to the LCD.
    lcd.print("Rising Water");

void loop()
  if ( millis()- previousMillis >= interval ){ //autoscroll function...
    previousMillis = millis();                 //You can do any multitasking bit here in this loop
    lcd.scrollDisplayLeft();                   //It will function without stopping the program
                                               //The interval variable is your delay                      
  buttonState = digitalRead(buttonPin); // read the state of the pushbutton value:

if (buttonState == LOW) // check if the pushbutton is pressed. If it is, the buttonState is LOW:

if (mode == 0) {
  lcd.print("Rising Water");
if (mode == 1) { // Mode 1
  lcd.print("Mode: 1");
  lcd.print("No Seizure");
else (mode == 0);

if (mode == 2) { //Mode 2
  lcd.print("Mode: 2");
else (mode == 0);
if (mode > 3){ // Resets the button presses
mode = 0;}
Final Code for Project Rising WaterArduino
the mapping function for Khrono is a little finicky and can be played with to find the correct frequency.
#include <Wire.h>  // importing LCD libraries
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,16,2);  // set the LCD address to 0x27 for a 16 chars and 2 line display

unsigned long previousMillis = 0; // millis needs unsigned log not int
float Red = 0; // output pin 11
float Blue = 0; // output pin 10
float Green = 0; // output pin 9
float bright = 0; // mapped color, sets brightness of led
float colouer = 0; // for picking color, input a3
float chrono = 0; // for picking frequency, input a2
float khrono = 0; // mapped timing, sets the blink rate
float ness = 0; // brightness of the colors
bool flip = true; // Bad variable name squad
// Thanks to paulS for cyberbullying some guy one arduino forums and also giving us a problem fix

void setup() {
  // put your setup code here, to run once:
  int previousMillis = 0;
  // serial begin for debugging purposes
  lcd.init(); // initialize the lcd 
  lcd.init(); // Second init is required
  // Print a message to the LCD.
    lcd.setCursor(4,0); // printing out the desired text.
    lcd.print("Rising Water");

void loop() {
   /* One loop reads and sets each LED brigtness equal to the value read by the potentiometer, the seconds turns the LED off after the interval is met.
     The variable flip is used to track which loop must run next. Millis is used to determine the interval of time before running each loop. */
  chrono = analogRead(A2); //reading the frequency off the potentiometer
  khrono = map(chrono, 0, 1023, 1, 100); // mapping the input into out actual frequency. Second number pair sets high and low for frequency
  khrono = ((khrono / 100) + 5.4);
  colouer = analogRead(A3); //FLIP WILL NOT FLIP FROM TRUE TO FALSE ayay it works now

  if ( ((millis() - previousMillis) >= khrono) && (flip == false )) { // Turning the colors off when the interval is met AND the other loop has run through first
    analogWrite(10, 0); //Turning off each color
    analogWrite(11, 0);
    analogWrite(9, 0);
    previousMillis = millis(); // Resetting the interval
    flip = true; // Switching to use the other loop next run through

  if ( ((millis() - previousMillis) >= khrono) && (flip == true)) {
     previousMillis = millis(); // Resetting interval

  /*The midpoint of each color range is where the color is the brightest. Overlap allows the colors to blend together.
 Subtraction is used to force the brightness into fitting the values needed.*/
  if (colouer > 111 && colouer < 573){ //Working 
     Blue = colouer-111; // Detecting and displaying blue, interval 111 to 573 on the pot
      if(Blue <= 231){
        bright = Blue; // Setting the LEDs brightness
      if(Blue >= 232){
        bright = 462 - Blue; // accounting for the midpoint so the LED dims.
        ness = map(bright,0,231,0,255); // Setting the brightness to send to the LED
        analogWrite (10,ness); // LED on
  /* Red has its highest brightness set at zero, so it wraps around the circle and allows red to blend with green and blue.
  2 loops were needed to create the desired effect. */
  if (colouer > 793) { // First half of red loop.
    Red = colouer - 793;
    bright = 1024 - Red;
    ness = map(bright, 0, 174, 0, 255);
    analogWrite (11, ness); // Turning the LED on

  if (colouer < 231) { // low end of red loop
    Red = 231 - colouer;
    bright = Red;
    ness = map(bright, 0, 341, 0, 255);
    analogWrite (11, ness); // LED on
  if (colouer > 453 && colouer < 913){ // Setting up green, interval is 453 to 913
     Green = colouer-453; // Brininging the value into the range we need to map. This line starts at zero and goes up.
      if(Green <= 190){
        bright = Green;
      if(Green > 341){ // When green passess the midpoint of its range it begins to go down to zero.
        bright = 913 - Green;
        ness = map(bright,0,213,0,255);
        analogWrite (9,ness); // Turning the LED on
  flip = false;

Custom parts and enclosures

Head and Base Boards
The top and bottom boards that cover the electronics on the top, and the water bucket and cords on the bottom.
Bucket Holder and the top of a box that fits the LCD screen
This is a simple design for holding our water bucket in place while allowing us to remove it for maintenance. It also includes the top of our head unit that fits the LCD screen into it.


This is the schematic for our circuit. It should be known that the four wires connected to the LCD screen are make shift. Our LCD has a I2C backpack with only four pins. They are ground, power, and the last two are sending and receiving serial pins.


Team AHS Advanced Physics

  • 1 project
  • 1 project
  • 1 project

Additional contributors

  • Responsible for building the circuit and designing the circuit. by Taylor
  • Worked mostly on coding but helped with design aspects as well. kian is also responsible for breaking the entire code/physical project and then in the end fixing it. he is responsible for building the code. by Kian

Published on

May 17, 2019

Members who respect this project


and 3 others

See similar projects
you might like

Similar projects you might like

Water Plant System for Plants in Vases

Project tutorial by zioalex

  • 21 respects

LED Color Sequencer

Project tutorial by Team thefantasticode.Group

  • 40 respects

LED Tower Art

Project tutorial by Doug Domke

  • 61 respects

Water Level Alerting System

Project tutorial by Pranav Kundaikar and Vinayak Shantaram Joshi

  • 20 respects

IoT -based water quality sensor

Project tutorial by aman_a_shastry

  • 21 respects

Bouncing Ball

Project tutorial by Kian Calnan

  • 7 respects
Add projectSign up / Login