#define BLYNK_TEMPLATE_ID "TMPL2ashuSgQM"
#define BLYNK_TEMPLATE_NAME "ESP32"
#define BLYNK_AUTH_TOKEN "WC27e6UDN3PV3-FWVEIXfSMa-vnf23fV"
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
#include <ESP32Servo.h>
#include "time.h"
const char *isabela = "Wokwi-GUEST";
const char *contrase = "";
const char* ntpServer = "pool.ntp.org";
const long gmtOffset_sec = -18000;
const int daylightOffset_sec = 0;
const int PIN_TRIG = 4;
const int PIN_ECHO = 18;
const int PIN_SERVO = 14;
Servo miServo;
// Guarda el último minuto en que se sirvió comida
int ultimoMinutoServido = -1;
void setup() {
Serial.begin(115200);
pinMode(PIN_TRIG, OUTPUT);
pinMode(PIN_ECHO, INPUT);
miServo.attach(PIN_SERVO, 500, 2400);
miServo.write(0);
Serial.print("Conectando a ");
Serial.println(isabela);
WiFi.begin(isabela, contrase);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi conectado");
Blynk.begin(BLYNK_AUTH_TOKEN, isabela, contrase);
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
}
void loop() {
Blynk.run();
struct tm timeinfo;
if (!getLocalTime(&timeinfo)) {
Serial.println("Error al obtener la hora");
delay(1000);
return;
}
int minutoActual = timeinfo.tm_min;
bool esHoraDeComer =
(minutoActual == 1 ||
minutoActual == 2 ||
minutoActual == 3);
if (esHoraDeComer && ultimoMinutoServido != minutoActual) {
long distancia = obtenerDistancia();
Serial.print("Distancia detectada: ");
Serial.print(distancia);
Serial.println(" cm");
if (distancia > 0 && distancia < 16) {
dispensarComida();
ultimoMinutoServido = minutoActual;
}
}
delay(1000);
}
long obtenerDistancia() {
digitalWrite(PIN_TRIG, LOW);
delayMicroseconds(2);
digitalWrite(PIN_TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(PIN_TRIG, LOW);
long duracion = pulseIn(PIN_ECHO, HIGH, 30000);
long distancia = duracion * 0.034 / 2;
return distancia;
}
void dispensarComida() {
Serial.println("Dispensando comida...");
miServo.write(120);
delay(2000);
miServo.write(20);
delay(300);
miServo.write(50);
delay(200);
miServo.write(15);
delay(200);
miServo.write(0);
Serial.println("Compuerta cerrada.");
}
// Botón de Blynk en V0
BLYNK_WRITE(V0) {
int valor = param.asInt();
if (valor == 1) {
Serial.println("Dispensación manual desde Blynk");
dispensarComida();
Blynk.virtualWrite(V0, 0);
}
}