#define BLYNK_TEMPLATE_ID "TMPL6hqzcCpPI"
#define BLYNK_TEMPLATE_NAME "Feeding system"
#include <Wire.h>
#include <RTClib.h>
#include <ESP32Servo.h>
#include <LiquidCrystal_I2C.h>
#include <WiFi.h>
#include <BlynkSimpleEsp32.h>
#include "DHT.h"
// Token Blynk dan WiFi credentials
char auth[] = "gj4CiZcOIP6XEXsTELk4b6YfYj5ojyjD";
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
// Inisialisasi RTC, LCD, Servo, dan DHT
RTC_DS1307 rtc;
LiquidCrystal_I2C lcd(0x27, 16, 2);
Servo servo;
// Pin Servo dan DHT
const int servoPin = 18;
const int dhtPin = 15; // Sesuaikan pin DHT22
#define DHTTYPE DHT22
DHT dht(dhtPin, DHTTYPE);
// Jadwal pemberian pakan (format: jam, menit)
const int feedTimes[][2] = {
{7, 0}, // Pagi
{12, 0}, // Siang
{16, 0}, // Sore
{19, 0} // Malam
};
// Flag untuk memastikan pakan hanya diberikan sekali per waktu
bool feedGiven[4] = {false, false, false, false};
void setup() {
// Inisialisasi Serial Monitor
Serial.begin(115200);
Serial.println("Feeding system");
// Inisialisasi RTC
if (!rtc.begin()) {
Serial.println("RTC tidak ditemukan!");
while (1);
}
if (!rtc.isrunning()) {
Serial.println("RTC belum berjalan, mengatur waktu default...");
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
// Inisialisasi LCD
lcd.init();
lcd.backlight();
// Inisialisasi Servo
servo.attach(servoPin);
servo.write(0); // Servo posisi tertutup
// Inisialisasi WiFi dan Blynk
Blynk.begin(auth, ssid, pass);
// Inisialisasi DHT22
dht.begin();
// Tampilkan pesan awal di LCD
lcd.setCursor(0, 0);
lcd.print("Feeding System");
lcd.setCursor(0, 1);
lcd.print("Initializing...");
delay(2000);
lcd.clear();
}
void loop() {
Blynk.run(); // Jalankan proses Blynk
DateTime now = rtc.now();
// Tampilkan waktu saat ini di LCD
lcd.setCursor(0, 0);
lcd.print("Jam: ");
lcd.print(now.hour());
lcd.print(":");
lcd.print(now.minute());
lcd.print(":");
lcd.print(now.second());
// Baca suhu dan kelembapan dari DHT22
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
if (isnan(temperature) || isnan(humidity)) {
Serial.println("Gagal membaca data dari DHT22!");
} else {
// Tampilkan suhu dan kelembapan di LCD
lcd.setCursor(0, 1);
lcd.print("Suhu: ");
lcd.print(temperature);
lcd.print("C ");
lcd.setCursor(8, 1);
lcd.print("Klm: ");
lcd.print(humidity);
lcd.print("%");
}
// Periksa jadwal pemberian pakan
for (int i = 0; i < 4; i++) {
if (now.hour() == feedTimes[i][0] && now.minute() == feedTimes[i][1] && !feedGiven[i]) {
giveFeed(i); // Fungsi untuk memberi pakan
feedGiven[i] = true; // Tandai pakan telah diberikan
// Kirim notifikasi event ke Blynk
Blynk.logEvent("PakanDiberikan", "Pakan diberikan pada waktu: " + String(feedTimes[i][0]) + ":" + String(feedTimes[i][1]));
}
// Reset flag setelah waktu berlalu 1 menit
if (now.hour() != feedTimes[i][0] || now.minute() != feedTimes[i][1]) {
feedGiven[i] = false;
}
}
delay(1000); // Update setiap detik
}
void giveFeed(int feedTimeIndex) {
lcd.setCursor(0, 1);
lcd.print("Memberi pakan...");
Serial.println("Pakan diberikan pada waktu: " + String(feedTimes[feedTimeIndex][0]) + ":" + String(feedTimes[feedTimeIndex][1]));
// Gerakkan servo untuk membuka tutup
servo.write(90);
delay(2000); // Tunggu 2 detik
servo.write(0); // Kembali ke posisi tertutup
lcd.setCursor(0, 1);
lcd.print("Pakan selesai ");
}