• EUR€
  • £GBP
  • $USD

Soil Humidity and Apple Homekit

DFRobot May 06 2020 986

Project Maker: user330352

To decide whether watering the garden

Things used in this project

Hardware components

Adafruit RFM69 breakout ×1

Adafruit Feather M0 RFM69 ×1

DFRobot DHT22 Temperature and Humidity Sensor ×1

DFRobot Capacitive Soil sensor ×1

Software apps and online services

PlatformIO IDE

Microsoft Visual Studio Code Extension for Arduino


To watering the garden, when away could be difficult. And, to know, whether the plants needs water too.

So, I want to know, what the soil humidity is, to decide to water the garden. (see my other projects to identify the water level in my cistern too).

After messing around with Wifi and BLE I use 433 MHz connection for better coverage. The sensor itself stands on the ground between plants (many obstacles and signal reflections).

The sensor unit is battery powered, the sensor measure in a 30 minutes interval, then go into deep sleep mode.

The minimum voltage of RFM69 and SAMD21 is 1, 8 V. (Over winter season, after 4 months - the battery capacity stands at 77 %, measured 3, 79 Volt, that's great). The mcu and the battery is covered in a IP66 case.

Using the sensor outside, it's a good idea to select a capacitive sensor for measuring soil humidity like the "DFRobot Soil Moisture".
The whole sensor device could be like this:

Bridge side

My brigde based on a Raspberry Pi Zero W and the RFM69 breakout board.

The RFM69 breadboard using the following Pins:

Vin to Raspberry Pi 3.3V

GND to Raspberry Pi Ground

RFM G0 to Raspberry Pi GPIO #24

RFM RST to Raspberry Pi GPIO #25

RFM CLK to Raspberry Pi SCLK = GPIO #11

RFM MISO to Raspberry Pi MISO = GPIO #9

RFM MOSI to Raspberry Pi MOSI = GPIO #10

RFM CS to Raspberry Pi CS1 = GPIO #7

It's a good idea to use a external antenna for better signal coverage.

At least, with a distance of 10 meters - through thick walls, plants and over obstacles i got rssi of 65.

Against the default CPython adafruit driver, I use DIO 0 interrupt to detect incoming data. See my project page on GitHub, how the bridge work.

The sensor unit send the data in a json-like format to the HAP-Python bridge. You can change that in your own way, but you need to customize that on both side - see the mcu c++ code and GitHub project page.

checking incoming data with:

sudo grep "Transceiver" </var/log/syslog -a

For watering I use cistern water and a immersion pump. To know how much water is left, I made a second sensor - see "Water level and Apple Homekit".


SensorC/C++      Download

measuring, transmitting, deep sleep

modified RTCZero.hC/C++      Download

modified RTCZero driver to prevent timer freeze

modifed RTCZero.cppC/C++      Download

modifed RTCZero driver to prevent timer freeze