#define BLYNK_TEMPLATE_ID "TMPL3rxSae7bi"
#define BLYNK_TEMPLATE_NAME "Cattle Monitoring System"
#define BLYNK_AUTH_TOKEN "zjZUQ1_pMBDwNlKqfFx3gEL_69urZRCI"
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
#include <BlynkSimpleEsp32.h>
#include <WiFi.h>
#include <PulseSensorPlayground.h>
#define DHTPIN 21
#define DHTTYPE DHT22
#define BUTTON1_PIN 12
#define BUTTON2_PIN 14
#define BUZZER_PIN 16
#define ALERT_TEMPERATURE 38
#define ALERT_HUMIDITY 100
#define ALERT_HEART_RATE 80
char auth[] = "zjZUQ1_pMBDwNlKqfFx3gEL_69urZRCI";
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal_I2C lcd(0x27, 16, 2);
PulseSensorPlayground pulseSensor;
int counter = 0;
void setup() {
Serial.begin(115200);
Serial.println("Starting...");
dht.begin();
lcd.init();
lcd.backlight();
pinMode(BUZZER_PIN, OUTPUT);
digitalWrite(BUZZER_PIN, LOW);
pinMode(BUTTON1_PIN, INPUT_PULLUP);
pinMode(BUTTON2_PIN, INPUT_PULLUP);
lcd.setCursor(0, 0);
lcd.print("Smart Cattle");
lcd.setCursor(0, 1);
lcd.print("Monitoring");
delay(2000);
Blynk.begin(auth, ssid, pass);
pulseSensor.begin();
}
void loop() {
Blynk.run();
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
int heartRate = pulseSensor.getBeatsPerMinute();
if (isnan(temperature) || isnan(humidity)) {
Serial.println("Failed to read from DHT sensor!");
lcd.setCursor(0, 0);
lcd.print("Failed to read");
lcd.setCursor(0, 1);
lcd.print("from DHT sensor");
delay(2000);
return;
}
// Check for alert conditions
bool alert = false;
if (temperature > ALERT_TEMPERATURE) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("ALERT: High Temp!");
lcd.setCursor(0, 1);
lcd.print("Temp: ");
lcd.print(temperature);
lcd.print(" C");
alert = true;
} else if (humidity > ALERT_HUMIDITY) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("ALERT: High Humidity!");
lcd.setCursor(0, 1);
lcd.print("Hum: ");
lcd.print(humidity);
lcd.print(" %");
alert = true;
}else if (heartRate > ALERT_HEART_RATE) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("ALERT: High HR!");
lcd.setCursor(0, 1);
lcd.print("HR: ");
lcd.print(heartRate);
lcd.print(" bpm");
alert = true;
}
else {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.print(temperature);
lcd.print(" C");
lcd.setCursor(0, 1);
lcd.print("Hum: ");
lcd.print(humidity);
lcd.print(" %");
lcd.setCursor(10, 1);
lcd.print("Cnt: ");
lcd.print(counter);
}
// Activate buzzer if any alert condition is met
if (alert) {
digitalWrite(BUZZER_PIN, HIGH);
} else {
digitalWrite(BUZZER_PIN, LOW);
}
if (digitalRead(BUTTON1_PIN) == LOW) {
counter++;
delay(200);
}
if (digitalRead(BUTTON2_PIN) == LOW) {
counter = 0;
delay(200);
}
Blynk.virtualWrite(V0, temperature);
Blynk.virtualWrite(V1, humidity);
Blynk.virtualWrite(V2, counter);
Blynk.virtualWrite(V3, heartRate);
delay(2000);
}