ESP8266 Soil Moisture Sensor for $7




Introduction: ESP8266 Soil Moisture Sensor for $7

This is a very easy Soil Moisture Sensor. I wanted a waterproof soil moisture sensor so I can setup on my tomato gardens and they were very pricey. Here is one that can be done with very basic parts you probably have at home.

Parts List:

Step 1: Making the Sensor

  1. Cut two pieces of electrical wire, about 6-8 inches in length each and remove about 1-2 inches of the cover.
  2. Cut a couple of small pieces of PCB board so you can use as spacers and solder the wire.
  3. Get a PVC Tube, Cut about 2 inches, you will use this to make your mold.
  4. Mix the Plaster of Paris with a little bit of water until you start to get a nice texture and fill the PVC, once you have a nice fill, insert your electrical wires and let it rest until it is solid.

Step 2: Wiring Schematic

Wiring for the sensor is pretty straight forward.

  • One of the wires to 5V
  • Ground to the other Wire
  • 4.7k Resistor to Ground Line and A0 on your Wemos D1 Mini

Step 3: Fire Up Arduino IDE

For this sketch, you will need Homie 2.0 Firmware which you can download here. You can read the readme how to upload the configuration on the Homie Readme.

Homie is a nice MQTT Framework that basically handles all the hard stuff in handling/reconnecting to WiFi and MQTT connection.

Arduino Sketch

<p>#include <Homie.h><br></p><p>#define FW_NAME "soil-moisture-monitor"
#define FW_VERSION "1.0.0"</p><p>int moistPin = 0;
float knownResistor = 1024;  // Calibrate your high moisture loop</p><p>const int numReadings = 20;
int readings[numReadings];    
int readIndex = 0;              
int total = 0;                 
int average = 0;                
float moisture;</p><p>HomieNode moistureNode("moisture", "moisture");</p><p>int moistVal = 0;
const int SEND_INTERVAL = 300;
unsigned long lastDataSent = 0;</p><p>void loopHandler() {
  if (millis() - lastDataSent >= SEND_INTERVAL * 1000UL || lastDataSent == 0) {
    total = total - readings[readIndex];
    readings[readIndex] = analogRead(moistPin);
    total = total + readings[readIndex];
    readIndex = readIndex + 1;
    if (readIndex >= numReadings) {
      readIndex = 0;
    average = total / numReadings;
    moisture = float((average / knownResistor) *100);
    Serial.print("Resistance: ");
    Serial.println(" Ω");
    Serial.print("Moisture: ");
    Serial.println(" %");
    Homie.setNodeProperty(moistureNode, "resistance").send(String(average));
    Homie.setNodeProperty(moistureNode, "moisture").send(String(moisture));</p><p>    lastDataSent = millis();
}</p><p>void setupHandler() {
  for (int thisReading = 0; thisReading < numReadings; thisReading++) {
    readings[thisReading] = 0;
  Homie.setNodeProperty(moistureNode, "unit").setRetained(true).send("Ω");
  Homie.setNodeProperty(moistureNode, "moisture").setRetained(true).send("%");
  moistureNode.advertise("unit");</p><p>}</p><p>void setup() {
  Serial.begin(115200);</p><p>  Homie_setFirmware(FW_NAME, FW_VERSION);
  Homie.setup();</p><p>}</p><p>void loop() {

Here is my config.json to upload to homie.

  "name": "Tomatoes Soil Moisture",
  <br>   "device_id": "tomatoes-soil-moisture",
  <br>      "wifi": {
    "ssid": "Linksys",
    <br>     "password": "XXXXXXXXXX"
  <br>   "mqtt": {
    "host": "",
   <br>   "port": 1883,
    <br>   "base_topic": "devices/",
    <br>   "auth": true,
   <br>   "username": "sensor",
    <br>   "password": "sensor1"
  <br>"ota": {  <br> "enabled": true

Once you have everything working, the next thing to do is to calibrate the sensor and map the variables to your OpenHab configuration.

Things to do:

  • Solar Powered/Battery

* I maybe compensated for some links.

Be the First to Share


    • Backyard Contest

      Backyard Contest
    • Remote Control Contest

      Remote Control Contest
    • Sculpt & Carve Challenge

      Sculpt & Carve Challenge



    Question 4 years ago on Step 3

    I am trying to get this working but the sketch seems to contain many un-needed characters. Could you please check to make sure it is correct?


    4 years ago

    Wel done. As your instructable is a year old, I presume you have a growing season behind you and i was wondering what your expereince with the plaster of paris sensor is.

    I hear very mixed stories abt the plaster of paris sensor. I made one myself and I was not entirely happy with it, but maybe what the one sees as an issue, the other sees as an advantage.

    My 'issues' with it were that it is kinda slow to react because it first needs to soak up water, also, when the soil gets a bit drier, it takes long for the sensor to follow that.

    I understand that the biggest argument pro plaster of paris sensor is that it supposedly is less prone to electrolysis. That might be, but there are easier ways to combat that.

    Anyway, I am no judge on the matter, but I am always interested to hear other peoples experience with various sensors