#define BLYNK_TEMPLATE_ID "TMPL3tN1mYEtw"
#define BLYNK_TEMPLATE_NAME "Food Dispenser"
#define BLYNK_AUTH_TOKEN "tMmw5W6v2_PNqIpYoFlI-Fpc2io6_cZl"
#include <WiFi.h>
#include <BlynkSimpleEsp32.h>
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
char auth[] = BLYNK_AUTH_TOKEN;
#include <HX711.h>
#include <ESP32Servo.h>
HX711 load;
Servo dispenser;
bool gateOpen = true;
float getDistance() {
digitalWrite(5, LOW);
delayMicroseconds(2);
digitalWrite(5, HIGH);
delayMicroseconds(10);
digitalWrite(5, LOW);
long duration = pulseIn(18, HIGH);
float distance = (duration * 0.0344) / 2;
return distance;
}
float getWeight() {
if (load.is_ready()) {
long reading = load.read();
reading = map(reading, 0, 2100, 0, 5000);
float weight = reading / 1000.0;
return weight;
} else {
Serial.println("HX711 not connected.");
return 0.0;
}
}
void setup() {
Serial.begin(115200);
Serial.print("Connecting to WiFi");
WiFi.begin("Wokwi-GUEST", "", 6);
while (WiFi.status() != WL_CONNECTED) {
delay(100);
Serial.print(".");
}
Serial.println(" Connected!");
Blynk.begin(auth, ssid, pass);
pinMode(5, OUTPUT);
pinMode(18, INPUT);
load.begin(21, 22);
dispenser.attach(13);
dispenser.write(0);
}
void loop() {
if (Blynk.connected()) {
Blynk.run();
} else {
Serial.println("Blynk not connected!");
}
float distance = getDistance();
Serial.print("Distance: ");
Serial.println(distance);
float weight = getWeight();
Serial.print("Weight: ");
Serial.println(weight);
// Send data to Blynk
Blynk.virtualWrite(V1, weight);
Blynk.virtualWrite(V2, distance);
if ((distance < 150.0 && weight >= 1) && gateOpen) {
dispenser.write(90);
Serial.println("The pet is present and the container is filled");
} else {
dispenser.write(0);
Serial.println("Conditions not met. Lid closed.");
}
delay(1000);
}
BLYNK_WRITE(V0) {
int pinValue = param.asInt();
gateOpen = (pinValue == 1);
}