#include <Wire.h>
#include <RTClib.h>
#include <ESP32Servo.h>
RTC_DS3231 rtc;
Servo myservo;
// Jadwal nyiram (dalam jam dan menit)
const int jadwalJam[] = {15, 18}; // Ganti jadi jadwal lu
const int jadwalMenit[] = {4, 0}; // Ganti jadi jadwal lu
const int jumlahJadwal = 2;
int posisiTutup = 0; // Derajat servo untuk nutup kran
int posisiBuka = 90; // Derajat servo untuk buka kran
int durasiNyala = 10000; // Durasi kran nyala (10 detik) - utk test
// Variabel untuk debounce jadwal
bool lastState[jumlahJadwal] = {false, false};
// GPIO pins
const int servoPin = 23;
const int sdaPin = 21;
const int sclPin = 22;
void setup() {
Serial.begin(115200);
// Inisialisasi I2C dengan pin yang ditentukan
Wire.begin(sdaPin, sclPin);
// Inisialisasi RTC
if (!rtc.begin()) {
Serial.println("DS3231 ga ketemu! Cek kabel bro!");
while (1);
}
// Set waktu jika RTC kehilangan power
if (rtc.lostPower()) {
Serial.println("RTC kehilangan power, setting waktu...");
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
// Attach servo sekali saja di setup
ESP32PWM::allocateTimer(0);
myservo.setPeriodHertz(50); // Standard 50hz servo
myservo.attach(servoPin, 500, 2400); // Min/max pulse width untuk MG996R
// Pastikan kran awal nya tutup
myservo.write(posisiTutup);
delay(1000);
Serial.println("System Ready!");
Serial.print("Waktu sekarang: ");
printWaktu(rtc.now());
}
void loop() {
DateTime now = rtc.now();
// Debug: print waktu setiap 30 detik
static unsigned long lastPrint = 0;
if (millis() - lastPrint > 30000) {
lastPrint = millis();
Serial.print("Waktu: ");
printWaktu(now);
}
for (int i = 0; i < jumlahJadwal; i++) {
bool kondisiTrigger = (now.hour() == jadwalJam[i] &&
now.minute() == jadwalMenit[i] &&
now.second() >= 0 && now.second() <= 2);
if (kondisiTrigger && !lastState[i]) {
// JALANKAN KRAN!
Serial.println("Waktunya nyiram!");
bukaKran();
lastState[i] = true;
}
// Reset state setelah lewat dari jamnya
if (now.hour() != jadwalJam[i] || now.minute() != jadwalMenit[i]) {
lastState[i] = false;
}
}
delay(500); // Cek setiap 0.5 detik
}
void bukaKran() {
Serial.println("Membuka kran...");
myservo.write(posisiBuka);
delay(durasiNyala);
Serial.println("Menutup kran...");
myservo.write(posisiTutup);
delay(1000);
Serial.println("Selesai nyiram.");
}
void printWaktu(DateTime t) {
Serial.print(t.hour());
Serial.print(':');
if (t.minute() < 10) Serial.print('0');
Serial.print(t.minute());
Serial.print(':');
if (t.second() < 10) Serial.print('0');
Serial.println(t.second());
}Loading
esp32-devkit-c-v4
esp32-devkit-c-v4