#define BLYNK_TEMPLATE_ID "TMPL3WaDMT_6D"
#define BLYNK_TEMPLATE_NAME "pet feeder"
#define BLYNK_AUTH_TOKEN "_8HKdv-a1eN4CO_OXGqjnexsYVh6-ZRL"
#include <ESP32Servo.h>
#include <HX711.h>
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
// Wi-Fi credentials
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
// Ultrasonic sensor pins
const int trigPin = 12;
const int echoPin = 14;
// Load cell pins
#define DOUT 22
#define CLK 23
HX711 scale;
// Servo motor setup
Servo lidServo;
const int servoPin = 17;
const float weightThreshold = 1000;
bool manualControl = false;
void setup() {
Serial.begin(115200);
Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
// Load cell setup
scale.begin(DOUT, CLK);
scale.set_scale();
// Servo motor setup
lidServo.attach(servoPin);
lidServo.write(0);
Serial.println("Pet Feeder Initialized");
}
void loop() {
Blynk.run();
if (!manualControl) {
float distance = measureDistance();
bool isPetNearby = (distance <= 150);
float foodWeight = scale.get_units(10);
bool isFoodAvailable = (foodWeight >= weightThreshold);
// Send data to Blynk
Blynk.virtualWrite(V0, distance);
Blynk.virtualWrite(V1, foodWeight);
// Control the lid based on conditions
if (isPetNearby && isFoodAvailable) {
openLid();
} else {
closeLid();
}
} else {
Serial.println("Manual control is active.");
}
delay(1000);
}
BLYNK_WRITE(V2) {
int switchState = param.asInt();
Serial.print("Switch state: ");
Serial.println(switchState);
if (switchState == 1) {
manualControl = true;
openLid();
} else {
manualControl = false;
closeLid();
}
}
float measureDistance() {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
long duration = pulseIn(echoPin, HIGH);
float distance = duration * 0.034 / 2;
return distance;
}
void openLid() {
Serial.println("Opening lid");
lidServo.write(90);
delay(1000);
}
void closeLid() {
Serial.println("Closing lid");
lidServo.write(0);
delay(1000);
}