[Show/Hide Left Column]


Hack₂O is a project aimed at creating a DIY irrigation system in the H.A.C.K., a place, where not all hackers are obsessed with supplying the necessary amount of water to plants(external link). The main part is the base and the stepper motor of a flatbed scanner, which can lift and lower the end of a pipe, thus controlling the water flow, depending on the relative height of the end of the pipe and the water level in the tank. For now, the tank is a paint can, which can hold up to 16 liters of water, and has been placed above one of the windows of the hackerspace.


Current state

The physical manifestation of Hack₂O at H.A.C.K. currently consists of three parts.

Cron controller

The AVR-NET-IO(external link) board is connected to the water flow controller via I²C(external link) and the Internet via Ethernet. It synchronizes its internal clock to an NTP server and sends irrigations commands to the water flow controller using a simple crontab.

Water flow controller

It consists of a paint can and the scanner base, latter has an Arduino and the motor driver circuit attached to it by screws. When the Arduino receives an I²C packet, it lets the water flow for the specified number of seconds. The details can be seen on the following photo.


Water distributor

The system uses a sprinkler (created from a plastic bottle using soldering iron) to distribute the water evenly over the flower.


The sprinkler is connected to a cone, which collects the water from the flow controller. The whole distributor can be seen on the following photo.


Water level measurement

A metal rod is submerged in the water tank with eight contact pads attached to it. The metal rod is connected to the 5 volts power supply of a 74HC299 shift register, which has the pads connected to its parallel load inputs. Any controller connected to this circuit can parallel load the sensor data into the shift register and then right shift the data out using only three pins (mode, clock, data).


4power (5V=)input


At the rising edge of the clock pin the water level sensor does one of the following depending on the state of mode pin.
  • If the mode pin is pulled to ground, it shifts its contents to right, thus banging LSB to the data line.
  • If the mode pin is pulled to high, it loads the sensor data into the shift register.
An example code(external link) which implements the operations above using an Arduino board can be found in the GitHub repository. It queries the water level every second and sends the measured value via serial line.





Automatic calibration

After startup, the firmware moves the head downwards until a wire loop attached to it hits the bottom of the scanner. In this moment, the head is in a well-known position, so any further movement can be calculated from here.

Periodic control


An AVR-NET-IO(external link) board is connected to the Arduino via I²C(external link) by latter being the slave on address 20 (0x14). The communication is being done in one byte packets, the Arduino echoes back the byte as a form of acknowledgement.

If the byte sent by the AVR-NET-IO is zero, nothing happens (except for the echo), so it serves as a kind of ping function which can be used in future releases as a monitoring feature. If the byte is non-zero, the head is kept down for the time specified by the byte in seconds.

The exact connections can be seen on the right-hand image.

Important note about acknowledgement

When using the Arduino Wire library(external link) in slave mode, Wire.send() must be called in the request handler. This isn't mentioned in the Wire page of the Arduino wiki, but in the header comment of TwoWire::send().

Interfacing the stepper motor with an Arduino

Arduino pinDriver IC pinPurpose
91motor logic (driver 1)
113motor logic (driver 2)
85motor logic (driver 3)
117motor logic (driver 4)
GND8ground (motor and logic)
Vin9motor power (12-24 V)

Assuming the connection used above, the following line will initialize a Stepper(external link) object, which can be used to control the motor by calling the appropriate methods (setSpeed, step).

Stepper myStepper(100, 8, 10, 9, 11);

The datasheet of the driver IC can be downloaded in PDF(external link).

Arduino firmware

The full source code along with the necessary Ethersex patch is available at the GitHub repository(external link) under MIT license.

Python QT4 GUI

A Python GUI was added to make experimentation easier (it's much easier to click twice than to enter 8+ characters without any mistakes). It's been deprecated since, because of autocalibration and the switch from serial line to I²C.


Project log


First beta version, hacked the hardware together, firmware is capable of performing a full (lower-wait-lift) irrigation cycle after initial calibration.


Added hot glue to the outside of the tank outlet, took photo and uploaded it to wiki after annotation. The applied amount of glue seems to be able to keep the water inside the tank. A video has also been taken: http://vsza.hu/hack2o.avi(external link)

A Python QT4 GUI was added with basic functionality.


Checked the tank outlet, and after two days it's still not even wet, so the tank part is working perfectly.


Successfully uploaded an Ethersex(external link) OS to the AVR-NET-IO(external link) board with NTP support, so it seems it's going to be able to provide a daily irrigation signal to the Arduino. Maybe later it can also be used to send notification about successful irrigation process and monitor the water level. Also, stepper motor controlling code should be migrated to that board as well so the Arduino could be replaced entirely by this board.


Automatic calibration has been added.


The AVR-NET-IO(external link) board can now control the Arduino with I²C(external link) signals, so the project can be considered to be in its working beta state.


The sprinkler and the flower have been added, so the project is now up and running.


It turned out that by desing the Arduino Stepper library keeps the stepper motor powered all day to keep it in place, which can overheat it. Since the structure stays in one place without this, a few lines of code(external link) has been added to release the motor after use.

A water level measurement prototype has also been created and successfully tested.


Fixed I²C acknowledgement issue(external link) and a simple debug format bug(external link).

Plans / To-do / Wishlist

  • automatic calibration (done by 2010-07-26)
  • water level measurement in tank (work in progress)
  • web interface
  • e-mail alerts
  • avoid Arduino usage

Contributors to this page: dnet922 points  .
Page last modified on Saturday 21 of August, 2010 18:38:03 CEST by dnet922 points .

Upcoming events

1)  Thu 04 of Sep., 2014 16:00 CEST
Buhera szakkör
2)  Thu 04 of Sep., 2014 19:00 CEST
Build night with Sugru
3)  Thu 11 of Sep., 2014 16:00 CEST
Buhera szakkör