#define BLYNK_PRINT Serial
#define BLYNK_TEMPLATE_ID "TMPL3D5v3eeYP"
#define BLYNK_TEMPLATE_NAME "Smart cattle monitoring system"
#define BLYNK_AUTH_TOKEN "e5DWuf-79V3zPXgHdsemiFr9QdCvQ-YW"
#include <Arduino.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <WiFi.h>
#include <WiFiClient.h>
#include<BlynkSimpleEsp32.h>
char auth[] = BLYNK_AUTH_TOKEN;
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
LiquidCrystal_I2C lcd(0x27, 20, 4);
#define LED_PIN 5
#define TRIG_PIN 19
#define ECHO_PIN 18
#define BLINK_INTERVAL 500
int cattleCount = 0;
unsigned long previousMillis = 0;
bool ledState = false;
long distanceCm = 0;
int blinkCount = 0;
bool countingStopped = false;
void connectToWiFi() {
Serial.print("Connecting to Wi-Fi");
WiFi.begin(ssid, pass);
int retries = 0;
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
retries++;
if (retries > 20) {
Serial.println(" Failed to connect. Restarting...");
ESP.restart();
}
}
Serial.println(" Connected to Wi-Fi");
}
void setup() {
Serial.begin(115200);
Blynk.begin(auth, ssid, pass);
lcd.init();
lcd.backlight();
lcd.clear();
pinMode(LED_PIN, OUTPUT);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
connectToWiFi();
lcd.setCursor(0, 0);
lcd.print("Smart Cattle");
lcd.setCursor(0, 1);
lcd.print("Monitoring");
delay(2000);
lcd.clear();
}
void measureDistance() {
long duration;
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
duration = pulseIn(ECHO_PIN, HIGH);
distanceCm = duration * 0.034 / 2;
}
void updateDisplay() {
lcd.setCursor(0, 0);
lcd.print("Distance: ");
lcd.print(distanceCm);
lcd.print(" cm");
lcd.setCursor(0, 2);
lcd.print("Cattle Count:");
lcd.print(cattleCount);
delay(1000);
}
void blinkLED() {
unsigned long currentMillis = millis();
if (!countingStopped) {
if (currentMillis - previousMillis >= BLINK_INTERVAL) {
previousMillis = currentMillis;
ledState = !ledState;
digitalWrite(LED_PIN, ledState ? HIGH : LOW);
}
}
else if (countingStopped && blinkCount < 4) {
if (currentMillis - previousMillis >= BLINK_INTERVAL) {
previousMillis = currentMillis;
ledState = !ledState;
digitalWrite(LED_PIN, ledState ? HIGH : LOW);
blinkCount++;
}
} else {
digitalWrite(LED_PIN, LOW);
ledState = false;
}
}
void loop() {
measureDistance();
if (distanceCm < 400 && cattleCount < 25) {
cattleCount++;
countingStopped = false;
blinkCount = 0;
} else if (cattleCount == 25) {
countingStopped = true;
}
updateDisplay();
Blynk.virtualWrite(V0, cattleCount);
Blynk.virtualWrite(V2, distanceCm);
blinkLED();
Serial.print("Distance: ");
Serial.print(distanceCm);
Serial.println(" cm");
delay(1000);
Blynk.run();
}