#define BLYNK_TEMPLATE_ID "TMPL6z7VOQFbo"
#define BLYNK_TEMPLATE_NAME "Tugas Uas Pet Feeder"
#define BLYNK_AUTH_TOKEN "CIfuQ0t0u4DO0Z_e84ku_9qcQnckQ87k"
#include <HX711.h>
#include <Wire.h>
#include <RTClib.h>
#include <ESP32Servo.h>
#include <BlynkSimpleEsp32.h>
#define LOADCELL_DOUT_PIN 4
#define LOADCELL_SCK_PIN 5
#define BUZZER_PIN 13
#define LED_PIN 12
#define SERVO_PIN 14
HX711 scale;
RTC_DS3231 rtc;
Servo servo;
float scale_factor = 419.8;
float low_weight_threshold = 20.0;
char auth[] = BLYNK_AUTH_TOKEN;
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
BlynkTimer timer;
int feedingTimes[] = {8, 12, 17}; // Waktu pemberian makan (jam 8, 12, 17)
// Fungsi untuk memeriksa berat
void checkWeight() {
if (scale.is_ready()) {
float weight = scale.get_units(10);
Serial.print("Berat: ");
Serial.print(weight);
Serial.println(" kg");
DateTime now = rtc.now();
String currentTime = String(now.hour()) + ":" + String(now.minute()) + ":" + String(now.second());
// Kirim data berat ke Blynk (V0) dan waktu ke Blynk (V1)
Blynk.virtualWrite(V0, weight);
Blynk.virtualWrite(V1, currentTime);
// Tampilkan data yang dikirim ke Blynk di Console
Serial.print("Data Blynk yang dikirim - Berat: ");
Serial.print(weight);
Serial.print(" kg, Waktu: ");
Serial.println(currentTime);
// Periksa apakah berat melebihi ambang batas (20 kg)
if (weight < low_weight_threshold) {
tone(BUZZER_PIN, 1000); // Menghasilkan suara dengan frekuensi 1000 Hz
digitalWrite(LED_PIN, HIGH); // Nyalakan LED
Serial.println("Buzzer ON, LED ON");
} else {
noTone(BUZZER_PIN); // Matikan suara buzzer
digitalWrite(LED_PIN, LOW); // Matikan LED
Serial.println("LED OFF, Buzzer OFF");
}
} else {
Serial.println("HX711 tidak siap. Cek koneksi.");
}
}
// Fungsi untuk membuka servo pada waktu pemberian makan
void checkFeedingTime() {
DateTime now = rtc.now();
int currentHour = now.hour();
for (int i = 0; i < 3; i++) {
if (currentHour == feedingTimes[i]) {
// Mencetak ke Console Wokwi
String feedingTimeMessage = "Kucing diberi makan pada jam: " + String(currentHour) + " WIB";
Serial.println(feedingTimeMessage);
// Pemberian makan dilakukan dengan membuka servo untuk menunjukkan
servo.write(90); // Servo terbuka
delay(2000); // Biarkan servo terbuka selama 2 detik
servo.write(0); // Servo ditutup
Serial.println("Servo membuka, kucing diberi makan");
}
}
}
void setup() {
Serial.begin(115200);
Serial.println("HX711 + RTC + Blynk Alarm Test");
Blynk.begin(auth, ssid, pass);
if (WiFi.status() == WL_CONNECTED) {
Serial.println("WiFi connected");
} else {
Serial.println("WiFi not connected");
}
scale.begin(LOADCELL_DOUT_PIN, LOADCELL_SCK_PIN);
if (!rtc.begin()) {
Serial.println("RTC tidak terdeteksi!");
while (1);
}
if (scale.is_ready()) {
Serial.println("HX711 siap digunakan.");
scale.set_scale();
scale.tare();
scale.set_scale(scale_factor);
} else {
Serial.println("HX711 tidak siap. Cek koneksi.");
while (1);
}
pinMode(BUZZER_PIN, OUTPUT);
pinMode(LED_PIN, OUTPUT);
servo.attach(SERVO_PIN);
servo.write(0); // Servo tertutup saat awal
timer.setInterval(1000L, checkWeight); // Periksa berat setiap detik
timer.setInterval(60000L, checkFeedingTime); // Periksa waktu pemberian makan setiap menit
}
void loop() {
Blynk.run();
timer.run();
}