Smart Watering System that can water six plants remotely | Arduino + IoT

A goal of this project: Basic idea was to make a smart watering system that can water six plants remotely from anywhere in the world, and to keep track of the soil’s moisture percentage and get that data sent to our mobile device. Arduino microcontroller and NodeMCU are the backbones of this project.

Project’s skeleton: The whole project is placed on a wooden board. My choice was OSB wood mainly because it’s easy to process. Its durability isn’t the best but it will do once we put PVC legs which carry most of the weight. OSB also has good water resistance in case of any leakage.

The project is divided into two layers: one for flowerpots and rubber tubes which distribute the water and one for electronics. Here are the first simplified diagrams.

Note: Keep in mind that this is NOT the full schematic, just a representation.

Layer one:

For the watering system itself, I used Atman’s At-103 which pumps 1300 l\h and has enough power to get the water to all six flowerpots. Simple aquarium T pieces are used for junctions and a 6mm rubber tube goes along the board.

Layer two:

Using just NodeMCU alone is not enough to accomplish our goal, because it doesn’t have enough analog pins, so we combine it with Arduino Uno (Arduino has six of them). Using a simple serial connection between them we can send sensor data. Arduino turns on the relay when one of the pins is triggered by NodeMCU on our command. Here is Fritzing schematics:

The software:

For this project, I found that the best way to handle software is via the Blynk platform. It enables us to communicate with NodeMCU from any network using Blynk’s servers without having too much trouble and it has a big plus of being extremely easy to use.

Learning How to Use Esp8266 in Combination with Blynk App | IoT

Components List: 

  • Arduino UNO
  • Moisture Sensor 
  • Relay Module
  • Comparator for Each Sensor 
  • Esp8266
  • Blynk Online App
  • Mini DC Water Pump Motor 

And here is how Blynk’s (on our phone) side looks like:

Schematic Diagram: 

Source Code For Arduino UNO :

/* 
    Written by Pavle Glušac
        @pavleglusac
                            */
#include <SoftwareSerial.h>
SoftwareSerial Arduino(8, 9); // Configuring a serial connection with NodeMCU using these pins (RX, TX)
int sens[6], i = 1, j;
String p, prim;
char primljen;
int relay = 7;
void setup() {
Serial.begin(115200); // Starting a serial connection for debugging and checking
Arduino.begin(9600); // Starting a serial connection with NodeMCU
pinMode(relay, OUTPUT); 
pinMode(4, INPUT);
}
//Marker
void loop() {
// Reading sensor values and converting them to one string
sens[0] = analogRead(0); 
sens[0] = map(sens[0], 0, 1023, 0, 100); // Converting them to 0-100% format
sens[1] = analogRead(1);
sens[1] = map(sens[1], 0, 1023, 0, 100);
sens[2] = analogRead(2);
sens[2] = map(sens[2], 0, 1023, 0, 100);
sens[3] = analogRead(3);
sens[3] = map(sens[3], 0, 1023, 0, 100);
sens[4] = analogRead(4);
sens[4] = map(sens[4], 0, 1023, 0, 100);
sens[5] = analogRead(5);
sens[5] = map(sens[5], 0, 1023, 0, 100);
// Converting them to one string
//I use string "p" for sending values
String p;
for(int j = 0; j <= 5; j++)
{
  if(sens[j] < 10)
  {
    p.concat("0");
    p.concat(String(sens[j]));
  }
  else if(sens[j] == 100)
  {
    p.concat("aa");
  }
  else p.concat(String(sens[j]));
}

Arduino.println(p); // Sending them to NodeMCU
delay(500); 
Arduino.flush(); // Waits for transmission to be over

i = digitalRead(4); // Checking if the relay should be on or off
if(i == 0)digitalWrite(relay, LOW);
if(i == 1)digitalWrite(relay, HIGH);
Serial.println(i); // Used for debugging
delay(1000);
}


Source Code For NodeMCU’s ESP866 :

/**
      Written by Pavle Glušac
            @pavleglusac
                              ***/
#define BLYNK_PRINT Serial
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <SoftwareSerial.h>
SoftwareSerial NodeMCU(D2, D3); // Configuring a serial connection with these pins (RX, TX)
char auth[] = ""; // Insert your own Blynk authentication token
String content; // Variable that gets serial data
char ssid[] = ""; // Insert your own WiFi ssid 
char pass[] = ""; // Insert your own WiFi password
BlynkTimer timer; // Creating a timer object

void sendValues() 
{
  char c;
  content = NodeMCU.readString(); // Reading serial data
  Serial.println(content); // I used this line to check if data is correct
  // This is where I process the data
  /* In Arduino code, you can see that data is sent as one string
  which contains every value so we get those values for each sensor
  like this */
  String v1 = content.substring(0, 2);
  String v2 = content.substring(2, 4);
  String v3 = content.substring(4, 6);
  String v4 = content.substring(6, 8);
  String v5 = content.substring(8, 10);
  String v6 = content.substring(10, 12);
  if(v1 == "aa")v1 = "100";
  if(v2 == "aa")v1 = "100";
  if(v3 == "aa")v1 = "100";
  if(v4 == "aa")v1 = "100";
  if(v5 == "aa")v1 = "100";
  if(v6 == "aa")v1 = "100";
  // Making it prettier
  String str1 = v1 + " %";
  String str2 = v2 + " %";
  String str3 = v3 + " %";
  String str4 = v4 +  " %";
  String str5 = v5 + " %";
  String str6 = v6 + " %";
  // Sending processed data to server and writing them to virtual pins
  Blynk.virtualWrite(V0, str1);
  Blynk.virtualWrite(V1, str2);
  Blynk.virtualWrite(V2, str3);
  Blynk.virtualWrite(V3, str4);
  Blynk.virtualWrite(V4, str5);
  Blynk.virtualWrite(V5, str6);
}
// Marker                                                                                                                          

void setup()
{
  Serial.begin(19200); // Starting serial connection for debugging and checking
  Blynk.begin(auth, ssid, pass); // Starting a connection with Blynk's server
  delay(500); // Adding a little delay so that we can connect properly
  timer.setInterval(1000L, sendValues); // Timer will start the "sendValues" function every second
  NodeMCU.begin(9600); // Starting a serial communication with Arduino
  pinMode(D2,INPUT); // Pin used as recieve (RX) pin
  pinMode(D3,OUTPUT); // Pin used as transmit (TX) pin
}

void loop()
{
  Blynk.run(); //Initiates Blynk
  timer.run(); //Initiates Timer
}



Here are pictures of the entire project:

Watch Video :


Project Copyrights  ©PavleGlušac 


Related posts

Arduino Opta PLC Pros & Cons

Breakthrough of Ardino-Pro Opta: Micro-PLC with industrial IoT proficiency

Top Arduino sensors – the ultimate list 2021

2 comments

Electroino September 23, 2018 - 1:11 pm

great project.
thanks

yelplatin August 28, 2021 - 7:35 am

Hello friends. Is there anyone in Israel who is also interested in this project. I would like to receive a link / email of friends from Israel. Thank you

Add Comment