Gardena water timer controller using Arduino Uno

Teodor Costachioiu
Feb 25, 2015 · 4 min read
Image for post
Image for post

In this blog post, I will show how to drive a water valve from a Gardena water timer/computer using Arduino Uno.

The controller I used in this example is — or better say was — a T14E model, but any other controller with the same water valve will work.

Image for post
Image for post
Gardena Water timer

The idea came when my dog decided to take one of the water timers as his toy, and chewed it beyond recognition. The electronics and the case were completely damaged, but I was able to recover the water valve. So, why not try to control it with an Arduino? The are vast possibilities to explore: using a real-time clock to control it as the original electronics worked, or control it via wi-fi, etc.

Image for post
Image for post
The water valve inside the Gardena controller

As you can see in the above picture, the water valve uses a RCA connector for the control signals. I used the original electronics from another sprinkler to determine how it works, and the waveforms look like this, without the water valve connected:

Image for post
Image for post
Signal to turn on the water valve
Image for post
Image for post
Signal to turn off the water valve

With teh water valve connectes, the signals look like this:

Image for post
Image for post
Waveform for opening of the Gardena valve — taken with the original controller.
Image for post
Image for post
Waveform for closing the valve — with the original controller
Image for post
Image for post
Detailed view of the valve closing waveform

Initially, I thought this is simple: a 9V negative pulse should have opened the valve, while a 9V positive pulse should close it. I used an Ardumoto shield to replicate this, but when doing extensive tests I went into trouble: some old valves open correctly, but they don’t close. Back to measurements, this time with the original controller and the valve connected. The results show for opening that a 500ms negative pulse is applied, and the voltage across the valve is about 7V. Considering the internal resistance of the valve winding, it looks that for opening there’s a 10-ohm series resistor in circuit working as a current limiter. For closing the series resistor is 100 ohms.

After many tries, I ended up with the following schematic:

Image for post
Image for post

With respect to the RCA sleeve, to turn on the water a 9V negative pulse with a duration of 500ms is applied. To turn the water off a positive pulse of 150 ms is applied to the center pin. The simplest way to replicate this is to use an H-bridge, such as the Ardumoto shield, but with a twist: a circuit made from two resistors and a diode is inserted in series with the valve.

The circuit works as follows: for opening the valve, the diode D1 is open, so the current flows both through the R1 (10 ohm) resiohmsr and R2 (1oo ohm) resistor. The voltage drop across the valve is about -7V. When closing the valve, D1 is blocked, and current flows only through R2. Voltage across the valve is 2.5 V. A little higher than the original controller, but it works fine.

The following code demonstrates how to turn on and off the water:

If things are not working either reverse the pins for the valve, or change in the code the dir_a from HIGH to LOW and from LOW to HIGH.


Below is a comment from my old website, with a code example for Esp-12E with the L9110 H-bridge module

I managed to find a sequence that worked for me and is very different. I am using NodeMCU Esp-12E with the L9110 H-bridge module. I have followed the diode / resistor bridge as described in the article.

The pulses I produce go from -9v to +9v and vice versa (and not via 0v) and I noticed that after a few seconds after the pulse I can disengage the H-bridge but not immediately.

The sequence that opens the valve for me is:

pwm.setduty(speedPin, 1023);
gpio.write(directiondPin,gpio.LOW);
tmr.delay(750)
pwm.setduty(speedPin,0);
gpio.write(directiondPin,gpio.HIGH);

and the close is slightly longer wait reverse pulse:

pwm.setduty(speedPin, 0);
gpio.write(directiondPin,gpio.HIGH);
tmr.delay(1200)
pwm.setduty(speedPin,1023);
gpio.write(directiondPin,gpio.LOW);


Originally published at https://electronza.com on February 25, 2015. Moved to Medium on May 1, 2020.

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch

Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore

Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store