Arduino Soil Moisture Sensor

283,544

236

65

Introduction: Arduino Soil Moisture Sensor

About: As a young lad Tom spent most of his days at the heels of his father, working in their shop, also known as the basement. His dad was an extraordinary cabinet maker and while working on their 1850’s home,…

***Edit***

Please use resistors when connecting the LEDs to your Arduino!

This Instructable is old. I have not had the time to update any of the information. You will find a lot of GREAT information in the comments please read them after reading the instructions.

Intro

In this instructable I will show you how to connect the an Arduino Nano and a moisture sensor. The information will then be displayed with 5 LEDs. This is very easy build and I would class it as a beginner project.

Step 1: Things You Will Need

1 - Breadboard (http://www.ebay.com/itm/171705651308?ssPageName=ST...

5 - LEDs

5 - 1k resistors

1 - Soil Moisture sensor kit (http://www.ebay.com/itm/171705525756?ssPageName=ST...

1 - Arduino Nano (http://www.ebay.com/itm/171728876932?ssPageName=ST...

~8 - Assortment of jumpers.

Step 2: Arduino

The Code:

<p>/* </p><p>Innovativetom.com
Flower Pot Soil Mosture Sensor</p><p>A0 - Soil Mosture Sensor
D2:D6 - LEDS 1,2,3,4,5</p><p>LED1 - Green
LED2 - Green
LED3 - Green
LED4 - YELLOW
LED5 - RED</p><p>Connect the Soil Mosture Sensor to anolog input pin 0, 
and your 5 led to digital out 2-6</p><p>*/
int led1 = 2;
int led2 = 3;
int led3 = 4;
int led4 = 5;
int led5 = 6;</p><p>int mostureSensor = 0;</p><p>void setup() {
  // Serial Begin so we can see the data from the mosture sensor in our serial input window. 
  Serial.begin(9600);
  // setting the led pins to outputs
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
  pinMode(led4, OUTPUT);
  pinMode(led5, OUTPUT);
}</p><p>// the loop routine runs over and over again forever:
void loop() {
  // read the input on analog pin 0:
  int sensorValue = analogRead(mostureSensor);
  // print out the value you read:</p><p>  Serial.println(sensorValue);
  
 if (sensorValue >= 820)
 {
 digitalWrite(led1, HIGH);
 digitalWrite(led2, HIGH);
 digitalWrite(led3, HIGH);
 digitalWrite(led4, HIGH);
 digitalWrite(led5, LOW);
}
else if (sensorValue >= 615  && sensorValue < 820)
 {
 digitalWrite(led1, HIGH);
 digitalWrite(led2, HIGH);
 digitalWrite(led3, HIGH);
 digitalWrite(led4, LOW);
 digitalWrite(led5, LOW);
}  
else if (sensorValue >= 410 && sensorValue < 615)
 {
 digitalWrite(led1, HIGH);
 digitalWrite(led2, HIGH);
 digitalWrite(led3, LOW);
 digitalWrite(led4, LOW);
 digitalWrite(led5, LOW);
}    
else if (sensorValue >= 250 && sensorValue < 410)
 {
 digitalWrite(led1, HIGH);
 digitalWrite(led2, LOW);
 digitalWrite(led3, LOW);
 digitalWrite(led4, LOW);
 digitalWrite(led5, LOW);
}
else if (sensorValue >= 0 && sensorValue < 250)
 {
 digitalWrite(led1, LOW);
 digitalWrite(led2, LOW);
 digitalWrite(led3, LOW);
 digitalWrite(led4, LOW);
 digitalWrite(led5, LOW);
}
  delay(1000);        // delay 1 second between reads
}</p>

Step 3: LEDs

***Edit***
Please use resistors when connecting the LEDs to your Arduino!

***Edit***

Connecting the LEDs;

Digital Pin 2 Green.

Digital Pin 3 Green.

Digital Pin 4 Green.

Digital Pin 5 Yellow.

Digital Pin 6 Red.

Connect the cathode or (-) lead from the LED to the Arduino.

**Here you must put a 1k resistor between anode (+) and the positive rail.

Connect the anode or (+) lead from the LED to the + positive rail of the beadboard. **

Step 4: Wiring

In this step we connect the power and ground rails.

From the arduino ground pin connect a short jumper to the blue rail on the breadboard.

From the arduino 5v Pin we connect a short jumper to the red rail on the breadboard.

Bond both rails together.

Step 5: The Moisture Sensor

The moisture has very well defined pin out.

Connect the ground to the ground rail, power to the power rail.

Connect the "AC" Labeled pin on the moisture sensor to analog input 0 pin on the Arduino.

*note, the moisture sensor I have has two outs one labeled "AC" and one labeled "DC". The "AC", is a serial signal 0-5 volts that when fully dry it outputs 5 volts, when fully wet, 0 volts. The "DC", is configured with the trim pot and is brought high when the moisture level reaches a desired point.

Step 6: Your Done.

Connect up the Arduino and load the code;

Code On Github

Innovative Tom

Buy the Kit:

eBay Link

Sensors Contest

Participated in the
Sensors Contest

14 People Made This Project!

Recommendations

  • Battery Powered Contest

    Battery Powered Contest
  • Plywood Challenge

    Plywood Challenge
  • Plastic Contest

    Plastic Contest

65 Discussions

0
ilyricsofficials
ilyricsofficials

1 year ago

Its a great idea. I can use it in teaching students how to water without wasting.Every drop counts.They can learn electronics while learning how to plant a tree and taking care of it.in this process,there is so much to learn. The led will be used as indicator how much to water and the students can learn how to respect this pattern.Its portable and many students can use the same project.

0
ShekharB10
ShekharB10

Question 2 years ago

what are the formulas and calculations for moisture sensor ? and also what is its working principle ?

0
SrikarD1
SrikarD1

2 years ago

I am getting different values while I am using Arduino Uno and Arduino Nano for the same water content and level. Can anybody plz tell me why? and also how could I fix it? For example when its dry I am getting a value of 400 in Arduino Uno and 0 in Arduino nano through soil moisture sensor. When its wet, its almost the same(~850)

0
tinus26
tinus26

2 years ago

Hi,

I was wondering - can I use a moisture sensor like this in a setup powered by a CR2032 or 9V battery?

0
puffykarl99
puffykarl99

2 years ago

Hi. i just want to ask what is the output of your soil moisture value. Because were developing a device that measure a soil condition that is: dry, enough water, and drowned your answers will help us alot thankyou somuch

0
AniqaE
AniqaE

3 years ago

What are the units of output readings ? Help please

0
joyang
joyang

4 years ago

Hi! Nice work. How did you select the sensor value ranges? And what is the unit of measurement? Are the output values voltages or some capacitance values?

0
AniqaE
AniqaE

Reply 3 years ago

Did you find your answer ?

0
amit_123456
amit_123456

3 years ago

can anyone help me in uploading this program in arduino as this is showing some error

0
WirelessGuyN
WirelessGuyN

3 years ago

Trying to lean on the experience of others who've been through this before...

Does anyone know if there are samples outthere for interfacing the TE215 sensor with the analog input of something like the NodeMCU?

I'd like ot take continual readings and ship it up to a server for collection.

I have somehting of a sample for doing this with a temp sensor but not something like this one. I'll include the temp info below. I guress I'm kind of lost with the mV value to temp conversion, although I guess I could just pick somehting random for dry versus wet.

Any thoughts for a beginner here?

Sample:

const int ANALOG_INPUT = A0; const int LED_PIN = D1;

void setup() { // Configure ADC pin as input pinMode(ANALOG_INPUT, INPUT);

// The pin our LED is connected to is a digital output pinMode(LED_PIN, OUTPUT);

// Turn the LED off digitalWrite(LED_PIN, HIGH);

// Open serial line Serial.begin(115200);

}

void loop() { // Read the analog input int value = analogRead(ANALOG_INPUT); // Convert the value into a temperature T = (value/1023) * 3300mV / 10(mV/degF) float temperature = ((float)value / 1023.0) * 3300 / 10; // Blink the LED digitalWrite(LED_PIN, LOW); delay(100); digitalWrite(LED_PIN, HIGH);

// Write temperature to the Serial line Serial.print("Temperature: "); Serial.print(temperature); Serial.println(" degrees F.");

// Wait 3 seconds before starting over delay(3000);

}

0
DougL56
DougL56

Reply 3 years ago

> Does anyone know if there are samples outthere for interfacing the TE215 sensor with the analog input of something like the NodeMCU?

Sort of. I'm using a similar sensor attached to A0 on a NodeMCU board.

Sensor: https://www.banggood.com/Soil-Hygrometer-Humidity-...

The analog output from this particular sensor only varies from about 4.5v dry to 2.5v immersed in a glass of water, so the corresponding analogRead values from A0 have a more limited range than 0..1024.

The only change in your code would be to include the NodeMCU pin definitions:

#ifndef D1

#define D0 16

#define D1 5

#define D2 4

#define D3 0

#define D4 2

#define D5 14

#define D6 12

#define D7 13

#define D8 15

#define D9 3

#define D10 1

#endif

SoilSensor.jpg
0
nk23
nk23

3 years ago

Just want to know ,how can we transmit this data from the sensor ?what are the communication options available?

Thanks in advance.

NK

0
karpada
karpada

3 years ago

// Simpler led control

digitalWrite(led1, sensorValue >= 0 ? HIGH : LOW); // Always high

digitalWrite(led2, sensorValue >= 250 ? HIGH : LOW);

digitalWrite(led3, sensorValue >= 410 ? HIGH : LOW);

digitalWrite(led4, sensorValue >= 615 ? HIGH : LOW);

digitalWrite(led5, sensorValue >= 820 ? HIGH : LOW);

0
SteveB15
SteveB15

5 years ago on Introduction

Nice job but it does need a few simple refinements to make it practical...

Add 1K resistors to the LEDs and correct the code so that the red LED will light.

The probe only needs to be on while a reading is taken, so poll the probe for one second every half hour by driving it from a digital pin. In my example code I used D7. This greatly improves power consumption and extends the life of the probe by several orders of magnitude since damage by electrolysis will be insignificant. If you want to check after watering, just press reset for a new reading.

Here's my modified code with probe polling:

/*

Innovativetom.com
stevebrace.co.uk

Flower Pot Soil Mosture Sensor

A0 - Soil Mosture Sensor

D2:D6 - LEDS 1,2,3,4,5

LED1 - Green

LED2 - Green

LED3 - Green

LED4 - YELLOW

LED5 - RED

Connect the Soil Mosture Sensor to anolog input pin 0,

and your 5 led to digital out 2-6

*/

int led1 = 2;

int led2 = 3;

int led3 = 4;

int led4 = 5;

int led5 = 6;

int probe = 7;

int mostureSensor = 0;

void setup() {

// Serial Begin so we can see the data from the mosture sensor in our serial input window.

Serial.begin(9600);

// setting the led pins to outputs

pinMode(led1, OUTPUT);

pinMode(led2, OUTPUT);

pinMode(led3, OUTPUT);

pinMode(led4, OUTPUT);

pinMode(led5, OUTPUT);

pinMode(probe, OUTPUT);

}

// the loop routine runs over and over again forever:

void loop() {

// Power-up the probe and pause for the driver

digitalWrite(probe, HIGH);

delay(1000);

// read the input on analog pin 0:

int sensorValue = analogRead(mostureSensor);

// print out the value you read:

Serial.println(sensorValue);

if (sensorValue >= 820)

{

digitalWrite(led1, HIGH);

digitalWrite(led2, HIGH);

digitalWrite(led3, HIGH);

digitalWrite(led4, HIGH);

digitalWrite(led5, HIGH);

}

else if (sensorValue >= 615 && sensorValue < 820)

{

digitalWrite(led1, HIGH);

digitalWrite(led2, HIGH);

digitalWrite(led3, HIGH);

digitalWrite(led4, HIGH);

digitalWrite(led5, LOW);

}

else if (sensorValue >= 410 && sensorValue < 615)

{

digitalWrite(led1, HIGH);

digitalWrite(led2, HIGH);

digitalWrite(led3, HIGH);

digitalWrite(led4, LOW);

digitalWrite(led5, LOW);

}

else if (sensorValue >= 250 && sensorValue < 410)

{

digitalWrite(led1, HIGH);

digitalWrite(led2, HIGH);

digitalWrite(led3, LOW);

digitalWrite(led4, LOW);

digitalWrite(led5, LOW);

}

else if (sensorValue >= 0 && sensorValue < 250)

{

digitalWrite(led1, HIGH);

digitalWrite(led2, LOW);

digitalWrite(led3, LOW);

digitalWrite(led4, LOW);

digitalWrite(led5, LOW);

}

// Power-down the probe

digitalWrite(probe, LOW);

delay(1800000); // wait half an hour

}

0
MaddisonA1
MaddisonA1

Reply 3 years ago

COULD YOU PLEASE SEND ANY PHOTOS YOU HAVE OF THIS SETUP. thanks

0
ABHINAV REDDY
ABHINAV REDDY

Reply 5 years ago

Can u give me the code if I want to place relay instead of led.plz. // ........ Is that the part of coding

0
SteveB15
SteveB15

Reply 5 years ago

Abhinav, just use the code as is but drive the relay from your desired digital pin through a transistor. Don't forget to place a reverse bias diode across the relay coil to protect against back EMF.

0
ABHINAV REDDY
ABHINAV REDDY

Reply 5 years ago

Thanks
//power the probe etc
Is that the part of code,which transistor should I use

0
JasonEdinburgh
JasonEdinburgh

Reply 5 years ago on Introduction

if you use a relay module like this then it has the transistor and diode already

http://img.dxcdn.com/productimages/sku_319093_1.jp...

I found with mine that it was a LOW signal that caused the relay to engage. (not a high signal as I expected). It also needed just under 5v to work. Read the datasheet info on whichever module you use.

0
froKo
froKo

Reply 3 years ago

Yep, and "active low" relays are way more common than "active high" ones.