#define BLYNK_PRINT Serial
#define BLYNK_TEMPLATE_ID "TMPL6ZH-r9bBC"
#define BLYNK_TEMPLATE_NAME "15ICT048"
#define BLYNK_AUTH_TOKEN "A8RhCtNHIGAqkBW7Ple_tyVSRB0usbgc"
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <WiFi.h>
#include <BlynkSimpleEsp32.h>
#include <ESP32Servo.h>
// WiFi and Blynk credentials
char auth[] = BLYNK_AUTH_TOKEN;
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
// Define LCD (I2C address 0x27, 16 columns, 2 rows)
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Servo and Buzzer
#define SERVO_PIN 4
#define BUZZER_PIN 5
Servo servo;
// Happiness and sadness levels
int happiness = 50;
int sadness = 50;
void setup() {
Serial.begin(115200);
Serial.println("Initializing...");
// Initialize LCD
lcd.init();
lcd.backlight();
// Initialize Servo
servo.attach(SERVO_PIN);
servo.write(0); // Initial position (cage closed)
// Initialize Buzzer
pinMode(BUZZER_PIN, OUTPUT);
digitalWrite(BUZZER_PIN, LOW);
// Display initial message
lcd.setCursor(0, 0);
lcd.print("Animal Feed Game");
delay(2000);
lcd.clear();
updateLCD();
// Connect to Wi-Fi
connectToWiFi();
// Connect to Blynk
connectToBlynk();
}
void connectToWiFi() {
Serial.println("Connecting to Wi-Fi...");
WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWi-Fi connected!");
Serial.println("IP address: " + WiFi.localIP());
}
void connectToBlynk() {
Serial.println("Connecting to Blynk...");
Blynk.begin(auth, ssid, pass);
if (Blynk.connected()) {
Serial.println("Connected to Blynk!");
} else {
Serial.println("Failed to connect to Blynk.");
}
}
// Start Button (V1)
BLYNK_WRITE(V1) {
happiness = max(0, happiness - 10);
sadness = min(100, sadness + 10);
updateLCD();
checkConditions();
}
// Feed Button (V2)
BLYNK_WRITE(V2) {
happiness = min(100, happiness + 10);
sadness = max(0, sadness - 10);
updateLCD();
checkConditions();
}
// Energy Button (V3)
BLYNK_WRITE(V3) {
happiness = max(0, happiness - 10);
sadness = min(100, sadness + 10);
updateLCD();
checkConditions();
}
// Update LCD display with happiness and sadness levels
void updateLCD() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Happy: ");
lcd.print(happiness);
lcd.setCursor(0, 1);
lcd.print("Sad: ");
lcd.print(sadness);
}
// Check conditions and trigger alarms
void checkConditions() {
if (happiness >= 100) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Max Happiness!");
servo.write(90); // Open cage
Blynk.logEvent("pet_freed", "Pet is Free! Happiness at max!");
delay(2000);
updateLCD();
}
if (sadness >= 100) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Danger: Sad 100!");
digitalWrite(BUZZER_PIN, HIGH); // Activate buzzer
Blynk.logEvent("sadness_alert", "ALARM! Sadness at 100!");
} else {
digitalWrite(BUZZER_PIN, LOW); // Deactivate buzzer
}
}
void loop() {
// Reconnect to Wi-Fi if disconnected
if (WiFi.status() != WL_CONNECTED) {
Serial.println("Wi-Fi disconnected. Reconnecting...");
connectToWiFi();
}
// Reconnect to Blynk if disconnected
if (!Blynk.connected()) {
Serial.println("Blynk disconnected. Reconnecting...");
connectToBlynk();
}
Blynk.run(); // Run Blynk
}