Arduino Soil Moisture Sensor

289K248106

Intro: 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.

Connect up the Arduino and load the code;

Code On Github

Innovative Tom

Buy the Kit:

eBay Link

66 Comments

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.
what are the formulas and calculations for moisture sensor ? and also what is its working principle ?

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)

Hi,

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

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

What are the units of output readings ? Help please

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?

Did you find your answer ?

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

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);

}

> 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

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

Thanks in advance.

NK

// 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);

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

}

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

Can u give me the code if I want to place relay instead of led.plz. // ........ Is that the part of coding
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.
Thanks
//power the probe etc
Is that the part of code,which transistor should I use

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.

More Comments