Code_AutomatedPlantWateringSystem

/*

Project Name: Automated Plant Watering System based on Soil Moisture and Water Tank Levels
Author: Dhyey Shah
Date Modified: 17th July, 2022

*/

/*-----------------------------------------------------------------------------START OF MAIN PROGRAM------------------------------------------------------------------------------*/


// Include Libraries
#include <NewPing.h>
#include <LiquidCrystal_I2C.h>

// Defining Variables
#define ledGreen 8
#define ledWhite 9
#define ledRed 10
#define buzzer 4
#define relay 6
#define sm_sensor A2

unsigned long prevTime_1 = 0;
unsigned long prevTime_2 = 0;

// Creating Objects for Peripherals
LiquidCrystal_I2C lcd (0x3F, 16, 2);
NewPing sonar(11, 12, 80);


/*-------------------------------------------------------------------------------------*/


void setup() {
  
  pinMode(ledGreen, OUTPUT);
  pinMode(ledWhite, OUTPUT);
  pinMode(ledRed, OUTPUT);
  pinMode(buzzer, OUTPUT);
  pinMode(relay, OUTPUT);
  
  pinMode(sm_sensor, INPUT);

  digitalWrite(relay, HIGH);     // Relay is Active Low Connected
  
  lcd.init();
  lcd.backlight();
  lcd.setCursor(0,0);
  lcd.print("Hello Dhyey !");
  lcd.setCursor(0,1);
  lcd.print("Sys Status: ON");
  delay(3000);
  lcd.clear();

  Serial.begin(9600);
  //digitalWrite(ledGreen, LOW);

}

void loop() {
  
  unsigned long currTime = millis();

  unsigned int waterLevel;
  unsigned int moisture_val;

// Reading Water Level with Ultrasonic Sensor Every 3 hours:
  if ( currTime - prevTime_1 >= 10800 ){
    
      waterLevel = readWaterLevel();
      Serial.print("Water Level Detected = ");
      Serial.print(waterLevel);
      Serial.println(" cm");

// WaterLevel Conditions:
      if (waterLevel < 10){
    
          digitalWrite(ledGreen, LOW);
          digitalWrite(ledWhite, LOW);
          digitalWrite(ledRed, HIGH);
          //digitalWrite(4, HIGH);

          lcd.setCursor(0,1);
          lcd.print("FILL UP TANK !");
    
          Serial.println("Red LED is ON");
          Serial.println("Please fill up the Tank !");
          
//          while (waterLevel < 10 && moisture_val >= 200){
//              digitalWrite(relay, HIGH);   // Active Low Relay Channel
//              digitalWrite(4, HIGH);
//              playBuzzer();
//            } 
        }
    
      else if (waterLevel >= 10 && waterLevel < 18){

          digitalWrite(4, LOW);
          digitalWrite(ledGreen, LOW);
          digitalWrite(ledWhite, HIGH);
          digitalWrite(ledRed, LOW);
    
          Serial.println("White LED is ON");
      }
    
      else if (waterLevel >= 18){

          digitalWrite(4, LOW);
          digitalWrite(ledGreen, HIGH);
          digitalWrite(ledWhite, LOW);
          digitalWrite(ledRed, LOW);
    
          Serial.println("Green LED is ON");
      }
      

      prevTime_1 = currTime;
      
  }


// Reading Soil Moisture Level with Moisture Sensor Every 6 hours:
  if ( currTime - prevTime_2 >= 21600 ){

      moisture_val = readMoisture();
      Serial.print("Moisture Level Detected = ");
      Serial.println(moisture_val);

if (moisture_val >= 200){
        
        lcd.clear();
        lcd.setCursor(0,0);
        lcd.print("Moisture: LOW");
        lcd.setCursor(0,1);
        lcd.print("PUMP ON");
        digitalWrite(relay, LOW);
        if (waterLevel < 10){
              digitalWrite(relay, HIGH);   // Active Low Relay Channel
              playBuzzer();
          }
        
        }
  
      else if (moisture_val > 100 && moisture_val < 200){
  
        lcd.clear();
        lcd.setCursor(0,0);
        lcd.print("Moisture: MED");
        lcd.setCursor(0,1);
        lcd.print("PUMP OFF");
        digitalWrite(relay, HIGH);
        
        }
  
      else if (moisture_val < 100){
  
        lcd.clear();
        lcd.setCursor(0,0);
        lcd.print("Moisture: HIGH");
        lcd.setCursor(0,1);
        lcd.print("PUMP OFF");
        digitalWrite(relay, HIGH);
        
        } 

      prevTime_2 = currTime;
  }


}


/*----------------------------SECONDARY USER FUNCTIONS-------------------------------*/


// Reading Soil Moisture Sensor Value
int readMoisture(){
  unsigned int sensor_val = analogRead(sm_sensor);
  unsigned int sm_val = map(sensor_val, 0, 1023, 0, 255);  
  return sm_val;
}

// Reading Bucket Water Level Value
int readWaterLevel(){
  unsigned int wl_val = sonar.ping_cm(); 
  return wl_val;
}

// Playing Buzzer Sound
void playBuzzer(){
  digitalWrite(buzzer, HIGH);  
}
Scroll to Top