#define BLYNK_TEMPLATE_ID "TMPL3WLXcTL2U"
#define BLYNK_TEMPLATE_NAME "Project 10"
#define BLYNK_AUTH_TOKEN "Ykb098OCkTPAHqduki_LT-LQpH7jZd9QF"
#include <ESP32Servo.h>
#include <HX711.h>
#include <WiFi.h>
#include <BlynkSimpleEsp32.h>
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const int trigPin = 12;
const int echoPin = 14;
const int servoPin = 16;
const int loadCellDout = 19;
const int loadCellSck = 18;
HX711 scale;
Servo servoMotor;
long duration;
float distanceCm;
float weightGrams;
float requiredWeight = 1000.0;
bool lidOpen = false;
BlynkTimer timer;
void setup() {
Serial.begin(115200);
Serial.println("Connecting to Wi-Fi...");
Blynk.begin(BLYNK_AUTH_TOKEN, ssid, password);
if (WiFi.status() == WL_CONNECTED) {
Serial.println("Connected to Wi-Fi.");
} else {
Serial.println("Failed to connect to Wi-Fi. Check credentials.");
}
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
scale.begin(loadCellDout, loadCellSck);
scale.set_scale(0.42);
servoMotor.attach(servoPin);
servoMotor.write(0);
timer.setInterval(1000L, sendSensorData);
Serial.println("System Initialized");
}
void openLid() {
Serial.println("Opening the lid...");
servoMotor.write(90);
lidOpen = true;
Blynk.virtualWrite(V3, "Open");
distanceCm = 100;
weightGrams = 1500;
}
void closeLid() {
Serial.println("Closing the lid...");
servoMotor.write(0);
lidOpen = false;
Blynk.virtualWrite(V3, "Closed");
distanceCm = 155;
delay(5000);
}
void loop() {
if (WiFi.status() != WL_CONNECTED) {
Serial.println("Wi-Fi disconnected. Attempting reconnection...");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nReconnected to Wi-Fi");
}
Blynk.run();
timer.run();
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distanceCm = duration * 0.034 / 2;
weightGrams = scale.get_units(10);
if (distanceCm <= 150 && weightGrams >= requiredWeight) {
Serial.println("Pet is present, food available. Opening the lid...");
servoMotor.write(90); }
else{
Serial.println("Conditions not met. Closing the lid.");
servoMotor.write(0);
}
Serial.print("Distance: ");
Serial.print(distanceCm);
Serial.print(" cm, Weight: ");
Serial.print(weightGrams);
Serial.println(" grams");
delay(1000);
}
void sendSensorData() {
Serial.print("Sending distance to Blynk: ");
Serial.println(distanceCm);
Blynk.virtualWrite(V2, distanceCm);
Serial.print("Sending weight to Blynk: ");
Serial.println(weightGrams);
Blynk.virtualWrite(V1, weightGrams);
int servoPos = servoMotor.read();
String lidStatus;
if (servoPos >= 85 && servoPos <= 95) {
lidStatus = "Open";
} else if (servoPos >= -5 && servoPos <= 5) {
lidStatus = "Closed";
} else {
lidStatus = "Unknown";
}
Serial.print("Sending lid status to Blynk: ");
Serial.println(lidStatus);
Blynk.virtualWrite(V3, lidStatus);
}
BLYNK_WRITE(V4) {
if (param.asInt() == 1) {
openLid();
} else {
closeLid();
}
}