Introduction: Arduino Soil Moisture Sensor
***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.

Participated in the
Sensors Contest
14 People Made This Project!
- SnapperHead made it!
- AnujM2 made it!
- AndreB190 made it!
- fantasyprops made it!
- DavidP788 made it!
- Daniel Morales made it!
- emirbyildiz made it!
- CarlG50 made it!
- rekcah2222 made it!
See 5 More
66 Comments
1 year ago
what is the full link for the eqipment?
3 years 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.
Question 4 years ago
what are the formulas and calculations for moisture sensor ? and also what is its working principle ?
5 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)
5 years ago
Hi,
I was wondering - can I use a moisture sensor like this in a setup powered by a CR2032 or 9V battery?
5 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
5 years ago
What are the units of output readings ? Help please
6 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?
Reply 5 years ago
Did you find your answer ?
5 years ago
can anyone help me in uploading this program in arduino as this is showing some error
5 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);
}
Reply 5 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
5 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
5 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);
7 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
}
Reply 5 years ago
COULD YOU PLEASE SEND ANY PHOTOS YOU HAVE OF THIS SETUP. thanks
Reply 7 years ago
Can u give me the code if I want to place relay instead of led.plz. // ........ Is that the part of coding
Reply 7 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.
Reply 7 years ago
Thanks
//power the probe etc
Is that the part of code,which transistor should I use
Reply 7 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.