Skip to content


Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?

Latest commit


Git stats


Failed to load latest commit information.
Latest commit message
Commit time

Raspberry Pi Plant Monitor

This is a relatively simple system for monitoring and watering multiple (up to 4) pots.


For the bill of components and assembly instructions see the blog post.


IMPOIRTANT: in order to use the ADC, you need to enable I2C interface via raspi-config.

The system is operated by running watering_station periodically (i.e. hourly), which will keep track of the state of each pot and initiate watering when needed.

As user pi run crontab -e and add the invocation of watering_station to your crontab. In my case, it looks like:

25  *  *  *  *  $HOME/bin/watering_station >> $HOME/log/watering_station.log 2>&1

By default the script runs mostly quietly. Run watering_station -h to see the available options.


Copy the example .watering_station.config to your home directory and edit it. Configuration mostly deals with hardware setup (i.e. which GPIO pins and channels correspond to each pot) and pot- and sensor-specific cut-off levels for dry soil (which should be calibrated experimentally).

Stats processing

The system implements a simple but relatively flexible framework for collecting the sensor and watering stats. Once stats are gathered, they can be passed to a stats processor object, which can perform custom processing of such stats. Such custom stats processor class is implemented as a subclass of StatsProcessor. Two example processors are provided:

  • StatsPrinter simply prints the stats on stdout.
  • StatsCSVLogger appends the stats to a CSV file. It also demonstrates how such processor can be configured via a special section in the configuration file.

It should be easy to implement a class to do more elaborate stats processing, e.g. uploading them to Google BigQuery, saving in a database etc.

Stats processor is specified via stats_processor directive in the [general] section of the configuration file.

Shutdown button

Raspberry Pi doesn't have any hardware based method to shut down. One can either turn the power off which is a terrible idea for any OS or to log into the machine and shut it down via the command line. Neither is super convenient.

To make it slightly easier, I've added a hardware button connected to GPIO and a script to power the device off when the button was pressed for 5 seconds (to avoid accidental presses). The script is called shutdown_button (shocking, I know). To install and activate, do the following:

  • Copy (or symlink) shutdown_button into ~/bin directory of user pi.

  • By default the script assumes the button is connected to GPIO pin 25. If it is not, change the shutdown_button.service file to pass an appropriate value via --pin option to the script.

  • Set up systemd configuration for the script and start it:

sudo cp shutdown_button.service /etc/systemd/system/
sudo systemctl start shutdown_button.service

Now you can check the status to verify that the script is running:

sudo systemctl start shutdown_button.service


Raspberry Pi-based plant monitoring and watering system







No releases published


No packages published