The Smart irrigation System has wide scope to automate the complete irrigation system. Here we are building a IoT based Irrigation System using ESP8266 NodeMCU Module and DHT11 Sensor. It will not only automatically irrigate the water based on the moisture level in the soil but also send the Data to ThingSpeak Server to keep track of the land condition. The System will consist a water pump which will be used to sprinkle water on the land depending upon the land environmental condition such as Moisture, Temperature and Humidity.
Before starting, it is important to note that the different crops require different Soil Moisture, Temperature and Humidity Condition. So in this tutorial we are using such a crop which will require a soil moisture of about 50-55%. So when the soil loses its moisture to less than 50% then Motor pump will turn on automatically to sprinkle the water and it will continue to sprinkle the water until the moisture goes upto 55% and after that the pump will be turned off. The sensor data will be sent to ThingSpeak Server in defined interval of time so that it can be monitored from anywhere in the world.
Components Required
NodeMCU ESP8266
Soil Moisture Sensor Module
Water Pump Module
Relay Module
DHT11
LCD20X4
Connecting Wires
Circuit Diagram
DHT11
The DHT11 is a commonly used Temperature and humidity sensor. The sensor comes with a dedicated NTC to measure temperature and an 8-bit microcontroller to output the values of temperature and humidity as serial data. The sensor is also factory calibrated and hence easy to interface with other microcontrollers.
The sensor can measure temperature from 0°C to 50°C and humidity from 20% to 90% with an accuracy of ±1°C and ±1%. So if you are looking to measure in this range then this sensor might be the right choice for you.
Specifications
Operating Voltage: 3.5V to 5.5V
Operating current: 0.3mA (measuring) 60uA (standby)
Output: Serial data
Temperature Range: 0°C to 50°C
Humidity Range: 20% to 90%
Resolution: Temperature and Humidity both are 16-bit
Accuracy: ±1°C and ±1%
Pump Motor
Micro DC 3-6V Micro Submersible Pump Mini water pump For Fountain Garden Mini water circulation System DIY project. This is a low cost, small size Submersible Pump Motor which can be operated from a 3 ~ 6V power supply. It can take up to 120 liters per hour with very low current consumption of 220mA. Just connect tube pipe to the motor outlet, submerge it in water and power it. Make sure that the water level is always higher than the motor. Dry run may damage the motor due to heating and it will also produce noise.
Specifications
Operating Voltage : 3 ~ 6V
Operating Current : 130 ~ 220mA
Flow Rate : 80 ~ 120 L/H
Maximum Lift : 40 ~ 110 mm
Continuous Working Life : 500 hours
Driving Mode : DC, Magnetic Driving
Material : Engineering Plastic
Outlet Outside Diameter : 7.5 mm
Outlet Inside Diameter : 5 mm
Relay
This 1-channel 5V control Single-Pole Double-Throw (SPDT) High-level trigger AC power relay board can be controlled directly via a microcontroller and switch up to 10A at 250 VAC. The inputs of 1 Channel 5V Relay Module are isolated to protect any delicate control circuitry.
Specifications
Trigger Voltage: 5 VDC
Trigger Current : 20 mA
Maximum Switching Voltage: 250VAC@10A; 30VDC @10A
Single Pole Double Throw (SPDT) Configuration
Power supply indicator lamp
Soil Moisture
This soil moisture sensor module is used to detect the moisture of the soil. It measures the volumetric content of water inside the soil and gives us the moisture level as output. The module has both digital and analog outputs and a potentiometer to adjust the threshold level.
Moisture Sensor Module Features & Specifications
Operating Voltage: 3.3V to 5V DC
Operating Current: 15mA
Output Digital - 0V to 5V, Adjustable trigger level from preset
Output Analog - 0V to 5V based on infrared radiation from fire flame falling on the sensor
LEDs indicating output and power
PCB Size: 3.2cm x 1.4cm
LM393 based design
Easy to use with Microcontrollers or even with normal Digital/Analog IC
Small, cheap and easily available
20x4 LCD
A 20x4 LCD display is very basic module and is very commonly used in various devices and circuits. These modules are preferred over seven segments and other multi segment LEDs. The reasons being: LCDs are economical; easily programmable; have no limitation of displaying special & even custom characters (unlike in seven segments), animations and so on.
A 20x4 LCD means it can display 20 characters per line and there are 4 such lines. In this LCD each character is displayed in 5x7 pixel matrix. This LCD has two registers, namely, Command and Data. This is standard HD44780 controller LCD.
There is no change code for interfacing standard 16x2 or 20x4 LCD.
20 Characters x 4 Lines
Built-in HD44780 Equivalent LCD Controller
Works directly with ATMEGA, ARDUINO, PIC amd many other microcontroller/kits.
4 or 8 bit data I/O interface
Low power consumption
Installing DHT Sensor Library
To install the library navigate to the Sketch > Include Library > Manage Libraries… Wait for Library Manager to download libraries index and update list of installed libraries.
Dht11: you need to Download and install the DHT11 library.
LCD: Download
Subscribe and Download code.
ESP8266 Code
#include <DHT.h>
#include <ESP8266WiFi.h>
String apiKey = "WH8PYV2IJPA4BVRT"; // Enter your Write API key here
const char* server = "api.thingspeak.com";
const char* ssid = "TP-Link_3200"; // your SSID
const char* password = "9500112137"; //your WIFI Password
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,20,4); // set the LCD address to 0x27 for a 16 chars and 2 line display
#define DHTPIN D3 // GPIO Pin where the dht11 is connected
DHT dht(DHTPIN, DHT11);
WiFiClient client;
const int moisturePin = A0; // moisteure sensor pin
const int motorPin = D0;
unsigned long interval = 10000;
unsigned long previousMillis = 0;
unsigned long interval1 = 1000;
unsigned long previousMillis1 = 0;
float moisturePercentage; //moisture reading
float H; // humidity reading
float T; //temperature reading
void setup()
{
Serial.begin(115200);
delay(10);
lcd.init(); // initialize the lcd
// Print a message to the LCD.
lcd.backlight();
pinMode(motorPin, OUTPUT);
digitalWrite(motorPin, HIGH); // keep motor off initally
dht.begin();
Serial.println("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print("."); // print ... till not connected
}
Serial.println("");
Serial.println("WiFi connected");
}
void loop()
{
// Serial.print(digitalRead(motorPin));
unsigned long currentMillis = millis(); // grab current time
H = dht.readHumidity(); // read humiduty
T = dht.readTemperature(); // read temperature
if (isnan(H) || isnan(T))
{
Serial.println("Failed to read from DHT sensor!");
return;
}
moisturePercentage = ( 100.00 - ( (analogRead(moisturePin) / 1023.00) * 100.00 ) );
if ((unsigned long)(currentMillis - previousMillis1) >= interval1) {
Serial.print("Soil Moisture is = ");
Serial.print(moisturePercentage);
Serial.println("%");
previousMillis1 = millis();
}
if (moisturePercentage < 50) {
digitalWrite(motorPin, LOW); // tun on motor
lcd.setCursor(0,3);
lcd.print("Pump Status: Running");
}
if (moisturePercentage > 50 && moisturePercentage < 59) {
digitalWrite(motorPin, LOW); //turn on motor pump
lcd.setCursor(0,3);
lcd.print("Pump Status: Running");
}
if (moisturePercentage > 60) {
digitalWrite(motorPin, HIGH); // turn off mottor
lcd.setCursor(0,3);
lcd.print("Pump Status: OFF ");
}
if ((unsigned long)(currentMillis - previousMillis) >= interval) {
sendThingspeak(); //send data to thing speak
previousMillis = millis();
client.stop();
}
lcd.setCursor(0,0);
lcd.print("Moisture % :");
lcd.setCursor(13,0);
lcd.print(moisturePercentage);
lcd.setCursor(0,1);
lcd.print("Temp");
lcd.setCursor(8,1);
lcd.print((char)223);
lcd.setCursor(9,1);
lcd.print("C :");
lcd.setCursor(13,1);
lcd.print(T);
lcd.setCursor(0,2);
lcd.print("Humidity % :");
lcd.setCursor(13,2);
lcd.print(H);
delay(1000);
}
void sendThingspeak() {
if (client.connect(server, 80))
{
String postStr = apiKey; // add api key in the postStr string
postStr += "&field1=";
postStr += String(moisturePercentage); // add mositure readin
postStr += "&field2=";
postStr += String(T); // add tempr readin
postStr += "&field3=";
postStr += String(H); // add humidity readin
postStr += String(T); // add tempr readin
postStr += "&field4=";
postStr += String(digitalRead(motorPin)); // add humidity readin
postStr += "\r\n\r\n";
client.print("POST /update HTTP/1.1\n");
client.print("Host: api.thingspeak.com\n");
client.print("Connection: close\n");
client.print("X-THINGSPEAKAPIKEY: " + apiKey + "\n");
client.print("Content-Type: application/x-www-form-urlencoded\n");
client.print("Content-Length: ");
client.print(postStr.length()); //send lenght of the string
client.print("\n\n");
client.print(postStr); // send complete string
Serial.print("Moisture Percentage: ");
Serial.print(moisturePercentage);
Serial.print("%. Temperature: ");
Serial.print(T);
Serial.print(" C, Humidity: ");
Serial.print(H);
Serial.println("%. Sent to Thingspeak.");
}
}
Finally the data is sent to ThingSpeak server using client.print() function which contains API key, server address and the string which is prepared in previous step.
Finally this is how the data looks on ThingSpeak Dashboard
Comments