Introduction: WasserStation: Arduino Based Water Storage System

About: Never stops thinking.

This project has been started as an alternative water source to tap-water for my coffee maker project (JavaStation) but can be utilized for many other projects where you need water for a small kitchen appliance or watering flowers.
It is basically a mini version of the current water network we have, using the same principles. The water is pumped up to a tower (in this case to a small 10L plastic can), holding potential energy and requires minimum power (opening a valve) to be released and arrive to it's destination.

You might want to extend the tank of some device but not to risk a possible water flooding in your home due to malfunction.

Why else would you consider storing water?

FEMA recommends that everyone have enough water to last three days should your regular water source be disrupted. Three days of water should be enough to get you through the periods of water shut-off or contamination that can happen during natural disasters like earthquakes, tornadoes, and ice storms.

The hard way to find out is just to have the water cut for half day when you cannot cook or wash your hand except using expensive bottled water.

So whether you have water for couple of hours, days or weeks somewhere stacked up it is better than not having any.

Step 1: Pump Types and Operation

Like most pumps, a centrifugal pump converts rotational energy, often from a motor, to energy in a moving fluid. A portion of the energy goes into kinetic energy of the fluid. Fluid enters axially through eye of the casing, is caught up in the impeller blades, and is whirled tangentially and radially outward until it leaves through all circumferential parts of the impeller into the diffuser part of the casing. The fluid gains both velocity and pressure while passing through the impeller. The doughnut-shaped diffuser, or scroll, section of the casing decelerates the flow and further increases the pressure. It is important to note that the water is not pushed radially outward by centrifugal force (non-existent force), but rather by inertia, the natural tendency of an object to continue in a straight line (tangent to the radius) when traveling around circle. This can be compared to the way a spin-cycle works in a washing machine.
If you would like to learn more on pumps here is a great article which explains their operations more in depth: https://www.allpumps.com.au/blog/2016/01/25/class...

Just to break it down why did I go with centrifugal pump: the price to performance ratio is unbeatable, this 3$ pump is perfect for this project.

This small pump can transport 240L/H to 3meters high (maximum), calculating with 200L/H that is about 3 liters per minute so it would take around 3 minutes to fill up my 10 Liter canister.

Gear pumps are for pumping greasy material such as oil, peristaltic pumps are good for food grade, medical grade fluid transport but they are slow and expensive, same goes for piston pumps.

One thing I learned the hard way during this build that you must submerge these pumps because if their suction pipe is not under water or bubbles go in there then the pump will stop working (the only way to get the flow working again is turning on/off the circuit to flush the bubbles out of the impeller). As my original build log shows I was planning to build the pump itself into the same box as the circuit. This would only work in the case if a tank with a bit higher elevation than the pump would be attached to the suction to provide constant water flow.

Step 2: Hardware Design

WasserStation is a simple water pump with water level detection to fill up a tank.


This instructable is not for those who might be wondering why not just have a water pump with a 12V adapter what you plug in then watch the tank fills up (with the current pump would take about 5 minutes).

That is 5 minutes you can spend on something else, while doing this build you will learn a lot of interesting things about the water systems, pumps and also a small trick in software design about the progress indicator.

You can easily use this build to create countless of variations for your needs for example:

1, Having an outdoor water tower where you want to pump water from a well during the day using solar power

2, You have an indoor water tank attached to the main tap with an electric solenoid valve which needs to be refilled periodically

3, Have an outside tank for non drinking water where pumping water from a river to water plants later

4, Have big enough property to have an own water tower to store water for potential energy to run a mini generator (guess what all the modifications you would need, to add a high voltage 110V/230V capable relay which can turn on a larger pump)

Ultrasonic water detection is quite reliable and will work well in cases where you are dealing with a closed tank not an open pool area.

If you building this system for drinking water make sure that all the equipment are food grade, the pipes, water can, connectors. In my build I using 1 Y connector where there was no better way to waterproof the build but hotglue it. Since the components pushed together strong, it would not even be necessary that is just a precaution because I don't want to deal with leakage, not in 1 year not in 5 years.

If you store water for a longer time it also worth to check the system for algae. This never happens with my build since the water is enough approximately for 3-4 weeks.

Sorry but there is no circuit diagram this time. I didn't even bother making a PCB for this project it is so simple. The relay directly attached to the Arduino, so as the LCD so as the ultrasonic sensor through an external connection.

One more note about the design: you need to have air holes somewhere on the top of the can, not too big and not too many to avoid dirt going into the water but if there is vacuum in the tank the water will obviously not flow.

Step 3: Hardware Parts


  • 1x Go&Camp Wasserkanister 10l mit Hahn (McTrek Outdoor Sports)
  • 1x Y JOINER Piece 3 WAY PLASTIC BARBED CONNECTOR PIPE HOSE Reducer Air Fuel Water 2x 12V
  • 12mm N/C Plastic Electric Solenoid Valve Magnetic Water Air Normally Closed
  • 1x Mini DC-DC Buck Converter Step Down Module Power Supply For aeromodelling (12->5V)
  • 1x 12V DC 5W Micro Mini Ultra-quiet Brushless Water Pump Oil Car Submersible 0~75℃
  • 1x SIP-1A05 Reed Switch Relay
  • 1x Arduino Pro Micro
  • 1x LCD display screen -> Winstart 2004A-CTI-JT
  • 1x on/off switch 1x 3.5 power jack 1x 4 pin connector for ultrasonic 1x 10kOhm variable resistor for LCD contrast wires, breadboard

Step 4: Software Design

This code is simple since it is not communicating with any PC, Xbee or other devices just reads in values from the ultrasonic sensors, turns the pump on and off and shows a nice display.


I also take advantage of using an RGB LCD screen to change the background light depending on water levels:

const int LCD_R = A1; // BackLight - R
const int LCD_G = A0; // BackLight - G
const int LCD_B = 15; // BackLight - B

At start the pump is always turned off, then a water_check() routine is called to check the water level. One thing to note here that the HC-SR04 ultrasonic sensor only works reliably up to 2-3 cms distance of an object so that is our stop value the 100 %. The rest of the values could have been determined by all sorts of scientific calculations if we would have all day but since I wanted this project to be completed as soon as possible once again I followed the good old unix KISS principle and simply checked the sensor readout at certain water levels and hard coded those into the code (same as JavaStation). This will always depend on the size, shape of the tank you are using and it is a measurement you must do to calibrate your own build.

A 5 minute hold timer is applied in case of the tank is full. Using hold timers is a good practice in circuits employing pumps, compressors. These devices shouldn't be turned on and off repeatedly and in this case there is absolutely no point to do so.

/* Water level is on full no need to keep polling it every second, lock for 1 minute. */
if (water_level >= 100) 

If the tank is not on 100% then the pump will be turned on and the LCD will display the water level in both % and CM.

The max fillup time check is a simple but effective check against overflows if you don't want to employ additional sensors.

You measure how much time would it take to fill your tank up, add a bit more like +1 minute to it. This check will shut the pump down right away and interrupts the main program flow since something clearly went wrong. From this point the Arduino have to be power cycled.

#ifdef MAX_FILLUP_TIME              
       wait_count++;
       if (wait_count==MAX_FILLUP_TIME)
          {
            #ifdef DEBUG
               Serial.println("WSTATION_ERROR_REFILL");
            #endif
               myISR();
          }      
#endif

If the water level is under 20 then the backlight is red, if it's between 20 and 80 then it switches to green, if it's over 80 then blue and when the tank is filled up to 100% then to cyan.

To create a nicer looking progress bar on a cheap non-graphical LCD screen I use a clever trick. One character is segmented into 5 additional smaller frames making the progress bar look more connected (although you will still see the gaps between characters).

For example the first column of a character field is light up:

  B10000, 
  B10000,
  B10000,
  B10000,
  B10000,
  B10000,
  B10000,
  B10000

Then the first + second column together:

 B11000, 
  B11000,
  B11000,
  B11000,
  B11000,
  B11000,
  B11000,
  B11000

That is all to it, you can easily modify this code to fit to your needs for different size tanks and LCD screens.

Step 5: Closure and ToDo List

Hopefully this short instructable was informative for you and will help to make your own water storage build succeed. Although this is a simple build a couple of improvements could be done:


-Add water overflow (moisture) sensors on the walls of the tank for extra safety (done in my other project JavaStation).

-Mount the ultrasonic sensor with a plug and a small chamber for easier replacement (in case it would get flooded :P)

-Install a forward flow valve in case you feed the pipe down. One of the major flaw of the ultrasonic builds is if the water is pouring down from a distance it will cause a messy water surface and the sensor readings will fluctuate as well with in the range of +/- 20%, against this the best practice is to feed down the input pipe to the bottom of the tank which results a clear surface however it presents another problem that when the pump is stopped that pipe will start flowing water back. For this you have to use a forward flow valve.