#include <Wire.h>
#include <LiquidCrystal_I2C.h>
int t_p = 34;
int e_p = 35;
float ss = 0.034;
long durn;
float dist_cm;
LiquidCrystal_I2C lcd(0x27, 20, 4); // Set the LCD I2C address to 0x27 for a 20x4 display
int soilMoisturePin = 14; // Soil moisture sensor pin
int vibrationPin = 27; // Vibration sensor pin
int buzzerPin = 6; // Buzzer pin
int greenLEDPin = 121; // Green LED pin
int yellowLEDPin = 19; // Yellow LED pin
int redLEDPin = 18; // Red LED pin
void setup() {
Serial.begin(115200);
lcd.init(); // Initialize the LCD
lcd.backlight(); // Turn on the backlight of the LCD
pinMode(soilMoisturePin, INPUT);
pinMode(vibrationPin, INPUT);
pinMode(buzzerPin, OUTPUT);
pinMode(greenLEDPin, OUTPUT);
pinMode(yellowLEDPin, OUTPUT);
pinMode(redLEDPin, OUTPUT);
pinMode(t_p, OUTPUT);
pinMode(e_p, INPUT);
lcd.setCursor(3,0);
lcd.print("WILDLIFE INCURSION");
lcd.setCursor(3,1);
lcd.print("MANAGEMENT SYSTEM");
lcd.setCursor(3,2);
lcd.print("WITH IOT");
lcd.setCursor(6,3);
lcd.print("");
delay(3000);
lcd.clear();
lcd.setCursor(0, 0); // Set cursor to the first position of the first line
lcd.print(" Status : "); // Print initial status on LCD
lcd.setCursor(0, 1);
lcd.print(" Moisture: ");
lcd.setCursor(0, 2);
lcd.print(" Distance: ");
lcd.setCursor(0, 3);
lcd.print(" Vibration : ");
}
void loop() {// Ultrasonic distance measurement
digitalWrite(t_p, LOW);
delayMicroseconds(2);
digitalWrite(t_p, HIGH);
delayMicroseconds(10);
digitalWrite(t_p, LOW);
durn = pulseIn(e_p, HIGH);
dist_cm = durn * ss / 2;
// Display distance on Serial Monitor
Serial.print("Distance: ");
Serial.print(dist_cm);
Serial.println(" cm");
// Display distance on LCD
lcd.setCursor(0, 2);
lcd.print(" Distance: ");
lcd.print(dist_cm);
lcd.print(" cm ");
// Additional distance measurement conditions
if (dist_cm <= 100) {
digitalWrite(greenLEDPin, LOW);
digitalWrite(yellowLEDPin, LOW);
digitalWrite(redLEDPin, HIGH);
lcd.setCursor(11, 0);
lcd.print("Unsafe ");
for (int i = 0; i < 10; i++) { // Blink the LED and buzzer faster
digitalWrite(redLEDPin, HIGH); // Turn on the LED
tone(buzzerPin, 1000); // Activate the buzzer
delay(250); // LED and buzzer ON for 100 milliseconds
digitalWrite(redLEDPin, LOW); // Turn off the LED
noTone(buzzerPin); // Turn off the buzzer
delay(250); // LED and buzzer OFF for 100 milliseconds
}
}
if (dist_cm > 100 && dist_cm < 200){
digitalWrite(greenLEDPin, LOW);
digitalWrite(yellowLEDPin, HIGH);
digitalWrite(redLEDPin, LOW);
lcd.setCursor(11, 0);
lcd.print("Danger ");
for (int i = 0; i < 5; i++) { // Blink the LED and buzzer with a delay
digitalWrite(yellowLEDPin, HIGH); // Turn on LED
tone(buzzerPin, 1000); // Activate the buzzer
delay(500); // Delay to keep LED and buzzer on
digitalWrite(yellowLEDPin, LOW); // Turn off LED
noTone(buzzerPin); // Turn off the buzzer
delay(500); // Delay to keep LED off
}
}
if (dist_cm > 200 && dist_cm < 300) {
digitalWrite(greenLEDPin, HIGH);
digitalWrite(yellowLEDPin, LOW);
digitalWrite(redLEDPin, LOW);
lcd.setCursor(11, 0);
lcd.print("Alert ");
for (int i = 0; i < 3; i++) { // Blink the LED and buzzer with a delay
digitalWrite(greenLEDPin, HIGH); // Turn on LED
tone(buzzerPin, 1000); // Activate the buzzer
delay(1000); // Delay to keep LED and buzzer on
digitalWrite(greenLEDPin, LOW); // Turn off LED
noTone(buzzerPin); // Turn off the buzzer
delay(1000); // Delay to keep LED off
}
}
if (dist_cm >= 300) {
digitalWrite(greenLEDPin, LOW);
digitalWrite(yellowLEDPin, LOW);
digitalWrite(redLEDPin, LOW);
lcd.setCursor(11, 0);
lcd.print(" ");
noTone(buzzerPin); // Ensure the buzzer is off
}
int soilMoisture = analogRead(soilMoisturePin);
int mappedMoisture = map(soilMoisture, 0, 4095, 0, 100); // Map soil moisture to 0-100 range
int vibration = digitalRead(vibrationPin);
lcd.setCursor(0, 1); // Set cursor to the first position of the second line
lcd.print(" Moisture: ");
lcd.print(mappedMoisture);
lcd.print("% "); // Print percentage and spaces to clear previous data
lcd.setCursor(0, 3); // Set cursor to the first position of the third line
lcd.print("Vibration: ");
lcd.print(vibration == 1 ? "Detected " : "None ");
// Display soil moisture and vibration on Serial Monitor
Serial.print("Moisture : ");
Serial.print(mappedMoisture);
Serial.print("% Vibration: ");
Serial.println(vibration == 1 ? "Detected" : "None");
if (mappedMoisture >= 80 && vibration == 1) {
digitalWrite(greenLEDPin, LOW);
digitalWrite(yellowLEDPin, LOW);
lcd.setCursor(11, 0);
lcd.print("Unsafe ");
for (int i = 0; i < 10; i++){ // Blink the LED 5 times
digitalWrite(redLEDPin, HIGH); // Turn on the LED
tone(buzzerPin, 1000); // Activate the buzzer
delay(250); // LED and buzzer ON for 200 milliseconds
digitalWrite(redLEDPin, LOW); // Turn off the LED
noTone(buzzerPin); // Turn off the buzzer
delay(250); // LED and buzzer OFF for 200 milliseconds
}
}
if (mappedMoisture >= 80 && vibration == 0) {
digitalWrite(greenLEDPin, LOW);
digitalWrite(yellowLEDPin, LOW);
digitalWrite(redLEDPin, HIGH);
lcd.setCursor(11, 0);
lcd.print("Danger ");
}
if (mappedMoisture > 50 && mappedMoisture < 80 && vibration == 1) {
digitalWrite(greenLEDPin, LOW);
digitalWrite(redLEDPin, LOW);
lcd.setCursor(11, 0);
lcd.print("Danger ");
for (int i = 0; i < 5; i++) { // Blink the LED 5 times
digitalWrite(yellowLEDPin, HIGH); // Turn on the LED
tone(buzzerPin, 1000); // Activate the buzzer
delay(500); // LED and buzzer ON for 200 milliseconds
digitalWrite(yellowLEDPin, LOW); // Turn off the LED
noTone(buzzerPin); // Turn off the buzzer
delay(500); // LED and buzzer OFF for 200 milliseconds
}
}
if (mappedMoisture > 50 && mappedMoisture < 80 && vibration == 0) {
digitalWrite(greenLEDPin, LOW); // Turn off the green LED
digitalWrite(yellowLEDPin, HIGH); // Turn on the yellow LED
digitalWrite(redLEDPin, LOW); // Turn off the red LED
lcd.setCursor(11, 0);
lcd.print("Alert ");
}
if (mappedMoisture > 20 && mappedMoisture < 50 && vibration == 1) {
digitalWrite(greenLEDPin, HIGH);
digitalWrite(yellowLEDPin, LOW);
digitalWrite(redLEDPin, LOW);
lcd.setCursor(11, 0);
lcd.print("Alert ");
for (int i = 0; i < 3; i++){ // Blink the LED 5 times
digitalWrite(greenLEDPin, HIGH); // Turn on the LED
tone(buzzerPin, 1000); // Activate the buzzer
delay(1000); // LED and buzzer ON for 200 milliseconds
digitalWrite(greenLEDPin, LOW); // Turn off the LED
noTone(buzzerPin); // Turn off the buzzer
delay(1000); // LED and buzzer OFF for 200 milliseconds
}
}
if (mappedMoisture > 20 && mappedMoisture < 50 && vibration == 0) {
digitalWrite(greenLEDPin, HIGH); // Keep the green LED constantly 0
digitalWrite(yellowLEDPin, LOW);
digitalWrite(redLEDPin, LOW);
lcd.setCursor(11, 0);
lcd.print("Safe ");
}
if (mappedMoisture <=20 && vibration == 0){
digitalWrite(greenLEDPin, HIGH);
digitalWrite(yellowLEDPin, LOW);
digitalWrite(redLEDPin, LOW);
lcd.setCursor(11, 0);
lcd.print(" ");
noTone(buzzerPin);
}
}