Every Liter Counts! Arduino Water Doser "Shield"




Hi! With this instructable , you can dose a desired amount of water. The system can work in mL and L. We will use an Arduino UNO, a flow meter to count the amount of water, a LCD to show the status , push buttons to change settings and a relay to activate a solenoid valve.

The system can have many applications: water the garden, mix water with some ingredients, fill a tank, control water consumption, etc.

In a first attempt, i tried to make it on a breadboard, but due the 8 push buttons (a lot of wires), disconnections, wrong measures and the need to test outside or near a water source, I decided to make a "shield".

If you never made a PCB, maybe this is a good time. It is easy, you only need to be careful with the involved elements. I made a quick guide for the PCB . If you need more details , you can find good tutorials on this page.

NOTE: The accuracy of measurement , is given by the quality of the flow meter. This is not a high precision doser. You will need patience to calibrate the system, but the final result is pretty accurate.

Watch the video!

Teacher Notes

Teachers! Did you use this instructable in your classroom?
Add a Teacher Note to share how you incorporated it into your lesson.

Step 1: Materials


-One side copper board 13x10 cm minimum ( Glass fiber recommended)

-Ferric chloride

-Plastic container

-Plastic gloves

-Thermal transfer paper (the yellow one)

-An Iron (for thermal transfer)

-Solder Iron , Solder wire, polishing pad

-Drill , 1mm drill bit


-Arduino UNO

-LCD 16x2

-Water flow meter ( I am using the YF-S201)

-10K resistors x 8

-1K resistor

-10K trimpot

-Push buttons x 8

-Single row male straight pin headers x 21-pin

-Single row curved pin headers x 6-pin

-Female pin header conectors 2 x 6-pin

-5V relay module

-Solenoid valve (12, 24 VDC recomended)

-Conectors, wires

And Piping according to your needs

Step 2: Preparing the PCB

Maybe this is the harder step, if you never made a PCB. You only need to follow the directions.

There is a lot of ways to make a PCB, this one works for me:

1.- Prepare the board by polishing the copper surface. You need get a smooth and brilliant surface. Then wash it with dish detergent. Once you did that , do not touch the surface again (finger prints). Let it dry

2.- Print the files (PDF) on the thermal transfer paper. In my case, I have a paper for toner (not ink), so you need the correct printer for your paper. Print on the smooth/brilliant surface of the paper.

Note: The files are ready to transfer, do not use mirror to print. If you want, print first on normal paper to make sure.You will see the letters backwards, but it is ok.

3.-Put the paper with the printed surface downward, and fit it to the board(copper surface). Put some tape to fix it

4.-Now, use a hot iron to transfer the tracks to the copper surface. Do this by moving the iron , and press for about

2-3 minutes.

5.- Let it cool and then remove all the paper. You can wash it carefully to remove the remainig paper. Do not damage the tracks!.

6.-Prepare the solution in the plastic container.Use plastic gloves!. I use a proportion of one part of ferric chloride for two of warm water (40 C). I needed 300 ml to make the PCB (100ml of ferric chloride and 200ml of warm water) , but it depends on the size of your container.

7.- Put the board in the solution, move the container, now and then, "making waves" to remove the copper. Normally , it takes about 20-30 minutes.Check the board constantly.

8.-Once all the copper was removed, retire and wash the board (use plastic gloves to manipulate). Polish again to remove the ink and see the copper tracks.

9.-You can cut the remainig parts of board if you want.

10.-Now you have to drill the holes. Use a 1mm drill bit. The holes are marked in the center of the circles with no copper.

11.-Now, you can transfer the top.The printed paper has to fit with the holes. Use the corners of the push buttons lines as reference. You can do this against a strong light or the sun. Put some tape to fix it.

Repeat the steps 3-5.

And the PCB is ready!

Step 3: Making the "Shield"

Now, mount and solder the components. First the pin headers. You need push the pins, to get a "long pin" or you can use other type of pin header. See the picture.

Then the resistors. Every resistor is marked on the top with the respective value.Continue with the push buttons , trimpot , curved pin headers and female pin header.

WARNING:You need to put some tape in the "cover" zone , to avoid contact with the metallic USB socket

Mount the lcd and the arduino. "0" and "A5" show you the correct way to mount it.

NOTE: Your final shield may differ from mine, because i have fixed some issues (relay connector, "cover" zone, Contrast stamp)

Step 4: Pipeline

To be honest, i do not know the name in english for all the components, anyway, the pipeline depends on your application.See the pictures to have an idea of how to make the pipeline . Don´t forget to make a well connected and sealed circuit, because the pressure of water can splash out all the place and the electronics!

WARNING:The flow meter has an arrow ,indicating the flow direction.

Step 5: Calibration

With the "shield" and the pipeline ready, test your water flow meter.

You need a water source. I tested the sensor near the wash machine ,using the water supply connector on my solenoid valve (the same type)Arduino can not drive a solenoid valve,that is why i used a relay, so you need an external power source,according to the voltage of your solenoid valve, see the schematic. Use the "COM" and "NO" to interrupt one line. I am using a 220V solenoid valve from an old wash machine. If you need to buy the solenoid valve , i recommend a low voltage one (12 or 24 volt). Do not forget to choose one that you can supply.

Even if the flow meter indicates the pulses x liter, you need to test it, due the particular shape of your piping.

For example, my flow meter output is 450 pulsesxliter, but in the test i only got 400. Other factor, I could not work with the supply valve fully opened, because the readings became unstable.So you need to calibrate the water supply valve too.

NOTE:Do not forget to work within the parameters of your sensor, in my case, 1-30 l/min and 1.75 Mpa.

Like i have said, all depends on the quality and specs of the flow meter.

Connect the sensor to the shield. The top has printed the respective connectors.

+ = 5V (Red Wire)

- = GND (Black Wire)

S = Signal or Pulse (Yelow Wire)

The relay module has the same marks.

I prepared a code to count the pulses. You can use START/STOP and RST CNT. Use a 1 liter bottle, bucket or beaker, and press the start button. Stop when you reach 1 liter. Repeat a few times to get a pattern. Press the RST CNT button to reset the counter and start again.

Now, you know the pulses x liters of you sensor.

Watch the video.

Step 6: The Water Doser

Hardware Features:

LCD: Show the status, "SP" is the set point or desired amount of water and "CNT" is the counter. I introduced a code that makes the lcd , works like two screens. The ml function and the L function are completely independent.

START/STOP: Is a "toggle" function. to keep the Relay and the system runnig when you release the button. If you push again, the system stops and the relay is "OFF".All buttons do not work if the system is ON

UNIT:Change between ml and L, keeping the settings and values of the previous screen. Also is a "toggle" function. If it is low, you are on ml screen and if it is high, you are on L screen.

RST SP: Reset the set point on the current screen, to enter a new one.

RST CNT: Reset the counter on the current screen to start a new count. If the counter is higher or equal to the set point, the system will not start.

Adders Buttons: You have 4 push butons to change the set point, +1, +10, +100, +1000. This is a easy way to change the settings. The adders buttons do not work while the system is running. You can´t add +1 on the ml function.

Software Features:

I took the sensor as a push button (pushed very fast!) It uses the same "debounce" function of all buttons. The sensor sends a "high" when completes a round (every 2,5 ml aprox). The rest of the time is "low", the same effect when you push a button.

You only need to introduce your pulses x liters and the ml x pulse as follows:

In the previous step, you tested the sensor and got your output pulses. Try to round the number.

float cal_1=2.5; //Calibrate ml x pulse

Where cal_1 = 1000/pulses per liters (my case; 1000/400 = 2.5 ml x pulse

int cal_2= 400; //Calibrate pulses x liters

This is a perfect round number to work. I don´t know if you will be so lucky than i was.Make a last calibration to adjust the error to minimum

The variables are "int" ,so if you need bigger numbers, change to "long" or "unsigned long"

On the video, you can see the operation of the shield. With a little patience, you can achieve a near-perfect performance.

Step 7: Auto Reset

Edited 10-23-2018 ,Testing

Request from users. After the counter reaches the setpoint will be set to 0 automatically to start a new count. You can always use the Reset button while the system is not running.

Backyard Contest 2016

Participated in the
Backyard Contest 2016

Maker Olympics Contest 2016

Participated in the
Maker Olympics Contest 2016

Low Water Gardening Challenge 2016

Participated in the
Low Water Gardening Challenge 2016

1 Person Made This Project!


  • Made with Math Contest

    Made with Math Contest
  • Multi-Discipline Contest

    Multi-Discipline Contest
  • Robotics Contest

    Robotics Contest

83 Discussions


Question 5 weeks ago

Hola, Nicolás. Qué buen proyecto, gracias por compartirlo. Estoy haciendo algo similar, pero mis resultados con el medidor de flujo son muy pobres, a pesar de repetidos intentos de calibración. Creo que la causa más probable es la presión del agua, yo alimento el circutio desde una botella y el agua solo cae por gravedad. En tu video no se alcanza a ver cómo alimentas el circuito, si es directamente desde la llave o cómo, pero se ve que el agua viene a buena presión incluso teniendo todos los elementos horizontalmente. ¿Podrías aclarar como haces esa parte? Si tienes fotos, serán de mucha ayuda, Gracias.

1 answer

Answer 5 weeks ago

Hola! efectivamente, la alimentación es desde la la llave que alimenta mi lavadora, como lo explico en el paso 5 "calibration". Es difícil mantener la presión desde un recipiente ya que la presión depende de la altura de la columna y no será suficiente para hacer girar la paleta interna del sensor, sobre todo cuando el nivel sea bajo. Te recomiendo que uses una bomba en conjunto con la válvula solenoide, si no puedes conectarte a la red. El usuario 242424h lo hizo de esa manera. Lee los comentarios más abajo. Saludos!


Tip 3 months ago on Step 3

really great project .... i do all things but it not work .... i know the problem with me ..... connect it in breadboard ... i cant understand this connect in it ..... please can u do it in breadboard .

1 reply

Reply 3 months ago

This project was made directly with Proteus ARES, so I didn't made a schematic. But it's simple:
Arduino pins(2,3,4,5,6,7) to LCD (RS,E,D4,D5,D6,D7).
LCD : Vss,RW,K to gnd . Vdd and A to 5V
Pot extremes to gnd and vcc and pot center to VO
All switches configured as "pull down"arduino pins(8,9,10,11,14,15,16,17)
Pin 12 to sensor signal and pin13 relay signal, both conected to gnd and vcc respectively.


5 months ago

SP is lost on LCD screen when start button is pressed and the sensor does not count pulses

WhatsApp Image 2019-05-22 at 02.44.23.jpeg
1 reply

Reply 5 months ago

I can't see the shield. Did you wire up the circuit?


7 months ago

can you tell me how to change the program to add more than one output, so it can fill more than one fill.


8 months ago on Step 7

Thanks for a quality project. Sir, Is can I add a dc pump on the place of Solenoid valve. If yes then how? and what is the coding ?


10 months ago


1 reply

Reply 10 months ago

Sorry, my friend, I don't know if I get you wrong but "Company" means profit to me and you can't use these projects for commercial purposes. You can see that at the beginning of this tutorial: "Creative Commons".
On the other hand, if you can't modify the code that means that you need to learn more about coding and Arduino and that's up to you. I hope you understand.


11 months ago

hi, very good job ,thanks alot.
plz. i want to use keypad 3*4 instade of bottons ... only lcd 2*16 and keypad 3*4..and i don,t need ml unit , only unit of Litre i want ...
plz, can you modify the code for me?
lcd to pins (7,8,9,10,11,12,13)
keypad to pins(A0 ~ A5)
thanks for advance..

1 reply

Reply 11 months ago

Sorry, my friend, I don't like keypads, when I need that kind of interface, I go for touch screens. This tutorial is intended to help your way for your own projects but I can't write codes for you. You can find lots of tutorials with keypads, then you can apply that on this project. I hope you understand.


12 months ago on Step 7

This updated auto reset is working perfectly as expected. Thanks a lot

1 reply

1 year ago

Anyone made this from these instructables directions? Working ? Made PCB unfortunately have to see pictures cos there is no schematic, picture shows some transistors as well while there is no transistors in directions? Display backlight turnsoff but nothing else, at the end I will ditch PCB and try on protoboard , but thinking to turn to other similar working project.

NOT COOL to post instractable that wont work!!!

3 replies

Reply 1 year ago

when we reply here , down to the window say '' be positive and constructive''. Nicolas project working just fine ( better than fine) and i will give him my images when i finished a project because i have lot of work that period. so... be polite my friend because here are one of a guy that i admire of his responsibility. read careful the instructions and if u have any questions just ask with respectfull to the person that he give as great picture for our imagination. Read carefull because its a working project


Reply 1 year ago

There Nikolas now you have admirer , male admirer who isn't afraid to come out ...(in non-constructive way)