#define BLYNK_TEMPLATE_ID "TMPL3O5iQbbNI"
#define BLYNK_TEMPLATE_NAME "CATTLE MONITORING SYSTEM"
#define BLYNK_AUTH_TOKEN "CjHz09Kc9K0i-XTyMwdMiCiqhX08fouF"
#include "LiquidCrystal_I2C.h"
#include "DHT.h"
#include <ESP32Servo.h>
#include <BlynkSimpleEsp32.h>
// Pin Definitions
#define TRIGGER_PIN 2
#define ECHO_PIN 4
#define LED1 18
#define POTENTIOMETER_PIN 35
#define led2 5
#define led3 25
char auth[] = "CjHz09Kc9K0i-XTyMwdMiCiqhX08fouF";
//Enter your WIFI SSID and password
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
// Servo Authentication Token
Servo servo;
// Variables
double humidity;
double temperature;
double dist;
int potValue;
// LCD Display
LiquidCrystal_I2C lcd_1(0x27, 20, 4);
// DHT Sensor
DHT dht14(14, DHT22);
// Function to Measure Ultrasonic Distance
double fnc_ultrasonic_distance(int _t, int _e) {
unsigned long dur = 0;
digitalWrite(_t, LOW);
delayMicroseconds(5);
digitalWrite(_t, HIGH);
delayMicroseconds(10);
digitalWrite(_t, LOW);
dur = pulseIn(_e, HIGH, 18000);
if (dur == 0) return 999.0;
return (dur / 58.0); // Convert microseconds to centimeters
}
// Setup Function
void setup() {
// Pin Modes
pinMode(TRIGGER_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(POTENTIOMETER_PIN, INPUT);
pinMode(LED1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
// Servo Setup
servo.attach(15);
// Serial Communication Setup
Serial.begin(115200);
Serial.flush();
while (Serial.available() > 0) Serial.read();
// DHT Sensor Setup
dht14.begin();
// LCD Display Setup
lcd_1.init();
lcd_1.noCursor();
lcd_1.backlight();
Blynk.begin(auth, ssid, pass);
}
// Loop Function
void loop() {
// Ultrasonic Distance Measurement
dist = fnc_ultrasonic_distance(TRIGGER_PIN, ECHO_PIN);
if (dist > 17) {
digitalWrite(LED1, HIGH);
lcd_1.setCursor(0, 1);
lcd_1.print(String("Pump: ON"));
} else {
digitalWrite(LED1, LOW);
lcd_1.setCursor(0, 1);
lcd_1.print(String("Pump: off"));
}
// DHT Sensor Readings
humidity = dht14.readHumidity();
temperature = dht14.readTemperature();
// Temperature Control with LEDs
if (temperature > 25) {
Blynk.virtualWrite(V4,HIGH);
Blynk.virtualWrite(V0, temperature);
digitalWrite(led2, HIGH);
digitalWrite(led3, HIGH);
servo.write(0);
} else {
if ((temperature >= 20) && (temperature < 25)) {
Blynk.virtualWrite(V4,LOW);
Blynk.virtualWrite(V0, temperature);
digitalWrite(led2, LOW);
digitalWrite(led3, LOW);
servo.write(0);
} else {
servo.write(180);
Blynk.virtualWrite(V3,HIGH);
Blynk.virtualWrite(V0, temperature);
lcd_1.setCursor(0, 5);
lcd_1.print("Servo: ON");
digitalWrite(led2, LOW);
digitalWrite(led3, LOW);
}
}
// Humidity Control with LEDs
if (humidity > 80) {
digitalWrite(led2, HIGH);
digitalWrite(led3, HIGH);
servo.write(0);
Blynk.virtualWrite(V4,HIGH);
Blynk.virtualWrite(V1, humidity);
} else {
if ((humidity >= 60) && (humidity < 80)) {
digitalWrite(led2, LOW);
digitalWrite(led3, LOW);
servo.write(0);
Blynk.virtualWrite(V4,LOW);
Blynk.virtualWrite(V1, humidity);
} else {
servo.write(180);
lcd_1.setCursor(0, 5);
lcd_1.print("Servo: ON");
digitalWrite(led2, LOW);
digitalWrite(led3, LOW);
Blynk.virtualWrite(V3,HIGH);
Blynk.virtualWrite(V1, humidity);
}
}
// Display Temperature
lcd_1.setCursor(0, 0);
lcd_1.print("T: ");
lcd_1.print(temperature);
lcd_1.print(" C ");
lcd_1.setCursor(0, 2);
lcd_1.print("H: ");
lcd_1.print(humidity);
lcd_1.print(" % ");
// Simulated Soil Moisture using Potentiometer
potValue = analogRead(POTENTIOMETER_PIN);
int moistureThreshold = map(potValue, 0, 1023, 0, 100);
// Display Soil Moisture
lcd_1.setCursor(4, 4);
lcd_1.print("S: ");
lcd_1.print(moistureThreshold);
lcd_1.print("%");
// Condition for Servo based on Soil Moisture
if (moistureThreshold < 60) {
servo.write(180); // Turn on servo when soil moisture is less than 60%
lcd_1.setCursor(0, 5);
lcd_1.print("Servo: ON");
Blynk.virtualWrite(V3,HIGH);
Blynk.virtualWrite(V2, moistureThreshold);
} else {
servo.write(0); // Turn off servo otherwise
lcd_1.setCursor(0, 5);
lcd_1.print("Servo: OFF");
Blynk.virtualWrite(V3,LOW);
Blynk.virtualWrite(V2, moistureThreshold);
}
Blynk.run();
// Envoie les données à Blynk
}