#define BLYNK_PRINT Serial
#define BLYNK_TEMPLATE_ID "TMPLB4idQmeU"
#define BLYNK_DEVICE_NAME "Feeder"
#define BLYNK_AUTH_TOKEN "1Xxvue5aXkLNhqV4RQlvJpGvgl7iKUMp"
#define ECHO_PIN 4
#define TRIG_PIN 2
#define LED_PIN 5
#include <Wire.h>
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
#include <RTClib.h>
#include <ESP32Servo.h>
char auth[] = BLYNK_AUTH_TOKEN;
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
BlynkTimer timer;
RTC_DS1307 rtc;
Servo myservo;
void setup()
{
Serial.begin(9600);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(LED_PIN, OUTPUT);
myservo.attach(15);
if (! rtc.begin()) {
Serial.println("Couldn't find RTC");
Serial.flush();
abort();
}
if (! rtc.isrunning()) {
Serial.println("RTC is NOT running, let's set the time!");
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
Blynk.begin(auth, ssid, pass);
timer.setInterval(1000L, sendSensor);
}
float readDistance() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
int duration = pulseIn(ECHO_PIN, HIGH);
float distance = duration * 0.034 / 2;
return distance;
}
void indicator(float distance)
{
int penuh = 50;
float isi = (penuh - distance) / penuh * 100;
isi < 20 ? digitalWrite(LED_PIN, HIGH), Blynk.logEvent("volume_pakan", String("Pakan hampir habis! : ") + isi + String(" %")) : digitalWrite(LED_PIN, LOW);
Blynk.virtualWrite(V0, isi);
}
String getTime() {
DateTime now = rtc.now();
char buf1[] = "hh:mm:ss";
String time = now.toString(buf1);
return time;
}
void feeder(String sekarang)
{
if(sekarang == "05:00:57")
{
myservo.write(0);
delay(1000);
myservo.write(90);
Blynk.logEvent("feeding", String("Pemberian pakan : ") + sekarang + String(" WIB"));
}
if(sekarang == "11:00:57")
{
myservo.write(0);
delay(1000);
myservo.write(90);
Blynk.logEvent("feeding", String("Pemberian pakan : ") + sekarang + String(" WIB"));
}
if(sekarang == "17:00:57")
{
myservo.write(0);
delay(1000);
myservo.write(90);
Blynk.logEvent("feeding", String("Pemberian pakan : ") + sekarang + String(" WIB"));
}
if(sekarang == "23:00:57")
{
myservo.write(0);
delay(1000);
myservo.write(90);
Blynk.logEvent("feeding", String("Pemberian pakan : ") + sekarang + String(" WIB"));
}
}
void sendSensor()
{
float distance = readDistance();
indicator(distance);
String sekarang = getTime();
feeder(sekarang);
}
BLYNK_WRITE(V1)
{
int pinValue = param.asInt();
if(pinValue > 0)
{
myservo.write(0);
delay(1000);
myservo.write(90);
Blynk.logEvent("feeding", String("Pemberian pakan manual"));
Blynk.virtualWrite(V1, 0);
}
}
void loop()
{
Blynk.run();
timer.run();
}