#define BLYNK_TEMPLATE_ID "TMPLq8cY7ooc"
#define BLYNK_DEVICE_NAME "PAKAN IKAN IOT"
#define BLYNK_AUTH_TOKEN "1Dysou7U08Vdp70VhjsVqGmT7rNSKcrc"
#define BLYNK_PRINT Serial
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
#include <Wire.h>
#include <RTC.h>
#include <LCD_I2C.h>
#include <ESP32Servo.h>
#include <HCSR04.h>
const byte PB_RST_Alarm = 2;
const byte triggerPin = 5;
const byte echoPin = 18;
const byte SPEAKER_PIN = 19;
const int servoPin = 13;
const byte Led_1 = 25;
const byte Led_2 = 33;
const byte Led_3 = 32;
static DS1307 RTC;
Servo servo;
LCD_I2C lcd(0x27, 20, 4);
char auth[] = BLYNK_AUTH_TOKEN;
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
bool Set_Alarm=false, Set_Servo=false;
int Time_Alarm_1, Time_Alarm_2, Time_Alarm_3;
int Jam_Alarm;
BlynkTimer timer;
void Display_LCD(){
lcd.setCursor(0, 0);
lcd.print(RTC.getDay()); lcd.print("/"); lcd.print(RTC.getMonth()); lcd.print("/"); lcd.print(RTC.getYear());
lcd.print(" ["); lcd.print(RTC.getHours()); lcd.print(":"); lcd.print(RTC.getMinutes()); lcd.print("] ");
lcd.setCursor(0, 1);
lcd.print("SET TIME 1 ="); lcd.print(Jam_Alarm); lcd.print(":"); lcd.print(Time_Alarm_1);
lcd.setCursor(0, 2);
lcd.print("SET TIME 2 ="); lcd.print(Jam_Alarm); lcd.print(":"); lcd.print(Time_Alarm_2);
lcd.setCursor(0, 3);
lcd.print("SET TIME 3 ="); lcd.print(Jam_Alarm); lcd.print(":"); lcd.print(Time_Alarm_3);
}
void setup(){
Serial.begin(115200);
pinMode(Led_1, OUTPUT);
pinMode(Led_2, OUTPUT);
pinMode(Led_3, OUTPUT);
pinMode(SPEAKER_PIN, OUTPUT);
pinMode(PB_RST_Alarm, INPUT_PULLUP);
servo.attach(servoPin);
HCSR04.begin(triggerPin, echoPin);
lcd.begin();
lcd.backlight();
RTC.begin();
digitalWrite(Led_1, HIGH); digitalWrite(Led_2, HIGH); digitalWrite(Led_3, HIGH);
Serial.println("SISTEM PAKAN IKAN OTOMATIS");
Blynk.begin(auth, ssid, pass);
Jam_Alarm = RTC.getHours();
Time_Alarm_1 = RTC.getMinutes() + 1;
Time_Alarm_2 = RTC.getMinutes() + 2;
Time_Alarm_3 = RTC.getMinutes() + 3;
servo.write(90);
delay(1000);
timer.setInterval(1000L, Display_LCD);
}
void loop(){
Blynk.run();
timer.run();
Proses_Pemberian_Pakan();
Proses_Servo();
if(digitalRead(PB_RST_Alarm) == LOW){
Jam_Alarm = RTC.getHours();
Time_Alarm_1 = RTC.getMinutes() + 1;
Time_Alarm_2 = RTC.getMinutes() + 2;
Time_Alarm_3 = RTC.getMinutes() + 3;
Blynk.virtualWrite(V0, 0);
Blynk.virtualWrite(V1, 0);
Blynk.virtualWrite(V2, 0);
}
double* distances = HCSR04.measureDistanceCm();
Blynk.virtualWrite(V4, distances[0]);
if(distances[0] <= 25){
analogWrite(SPEAKER_PIN,200); delay(300); analogWrite(SPEAKER_PIN,0); delay(100);
Blynk.virtualWrite(V3, "PAKAN IKAN HABIS");
}
else{
analogWrite(SPEAKER_PIN,0);
Blynk.virtualWrite(V3, "PAKAN IKAN MASIH TERSEDIA");
}
}
void Proses_Pemberian_Pakan(){
if((RTC.getMinutes() == Time_Alarm_1) && (RTC.getSeconds() == 0))
{Blynk.virtualWrite(V0, 1); digitalWrite(Led_1, 0); Set_Alarm=true;}
if((RTC.getMinutes() == Time_Alarm_2) && (RTC.getSeconds() == 0))
{Blynk.virtualWrite(V1, 1); digitalWrite(Led_2, 0); Set_Alarm=true;}
if((RTC.getMinutes() == Time_Alarm_3) && (RTC.getSeconds() == 0))
{Blynk.virtualWrite(V2, 1); digitalWrite(Led_3, 0); Set_Alarm=true;}
}
void Proses_Servo(){
if((RTC.getSeconds() >= 10) && (Set_Servo == true)){
Set_Alarm=false;
Set_Servo=false;
servo.write(90);
Serial.println("TUTUP");
digitalWrite(Led_1, HIGH);
digitalWrite(Led_2, HIGH);
digitalWrite(Led_3, HIGH);
}
else if((Set_Alarm == true) && (Set_Servo == false)){
servo.write(0);
Set_Servo=true;
Serial.print("Servo : BUKA | ");
}
}