#include <ESP32Servo.h>
#include <RTClib.h>
#include <LiquidCrystal_I2C.h>
#include <EEPROM.h>
#define btn1 25
#define btn2 26
#define btn3 27
LiquidCrystal_I2C lcd(0x27, 16, 2); // Alamat I2C LCD
RTC_DS1307 rtc; // Inisialisasi RTC DS1307
Servo servoMotor; // Inisialisasi objek Servo
int servoPin = 12; // Tentukan pin servo
int alarm1Hour, alarm1Minute, alarm2Hour, alarm2Minute;
unsigned long startTime = 0;
bool isPressing = false;
int menuState = 0; // 0: menu utama, 1: setting alarm 1, 2: setting alarm 2
void setup() {
lcd.begin(16, 2);
lcd.init();
lcd.backlight();
Serial.begin(9600);
// Setup RTC
if (!rtc.begin()) {
Serial.println("RTC tidak terdeteksi!");
while (1);
}
if (!rtc.isrunning()) {
Serial.println("RTC tidak berjalan, set waktu ke sekarang.");
rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // Set waktu saat compile
}
// Setup Servo
servoMotor.attach(servoPin); // Hubungkan servo ke pin yang ditentukan
servoMotor.write(0); // Mulai dengan posisi servo tertutup
// Gunakan internal pull-up
pinMode(btn1, INPUT_PULLUP);
pinMode(btn2, INPUT_PULLUP);
pinMode(btn3, INPUT_PULLUP);
// Load alarm times from EEPROM
alarm1Hour = EEPROM.read(0);
alarm1Minute = EEPROM.read(1);
alarm2Hour = EEPROM.read(2);
alarm2Minute = EEPROM.read(3);
}
void loop() {
DateTime now = rtc.now();
tampilkanWaktu(now);
cekAlarm(now);
switch (menuState) {
case 0:
pilihMenu();
break;
case 1:
settingAlarm(1); // Menampilkan pengaturan alarm 1
break;
case 2:
settingAlarm(2); // Menampilkan pengaturan alarm 2
break;
}
delay(100); // Perbarui setiap 100ms
}
void tampilkanWaktu(DateTime now) {
lcd.setCursor(0, 0);
lcd.print("Time: ");
if (now.hour() < 10) lcd.print("0");
lcd.print(now.hour());
lcd.print(":");
if (now.minute() < 10) lcd.print("0");
lcd.print(now.minute());
lcd.print(":");
if (now.second() < 10) lcd.print("0");
lcd.print(now.second());
lcd.setCursor(0, 1);
lcd.print("Date: ");
if (now.day() < 10) lcd.print("0");
lcd.print(now.day());
lcd.print("/");
if (now.month() < 10) lcd.print("0");
lcd.print(now.month());
lcd.print("/");
lcd.print(now.year());
}
void cekAlarm(DateTime now) {
// Cek apakah sudah waktu untuk memberi pakan ikan
if ((now.hour() == alarm1Hour && now.minute() == alarm1Minute) ||
(now.hour() == alarm2Hour && now.minute() == alarm2Minute)) {
beriPakan(); // Panggil fungsi untuk memberi pakan
}
}
void beriPakan() {
servoMotor.write(90); // Buka katup pakan (gerakkan servo ke posisi 90 derajat)
delay(2000); // Tunggu selama 2 detik dengan katup terbuka
servoMotor.write(0); // Tutup katup pakan (gerakkan servo kembali ke posisi 0 derajat)
}
void pilihMenu() {
// Jika tombol 1 ditekan selama 3 detik, masuk ke setting alarm 1
if (digitalRead(btn1) == LOW) {
startTime = millis(); // Catat waktu saat pertama kali tombol ditekan
isPressing = true; // Tandai bahwa kita sedang dalam proses menghitung waktu
while (digitalRead(btn1) == LOW); // Tunggu tombol dilepas
if (millis() - startTime >= 3000) {
menuState = 1; // Masuk ke setting alarm 1
}
}
// Jika tombol 2 ditekan selama 3 detik, masuk ke setting alarm 2
if (digitalRead(btn2) == LOW) {
startTime = millis(); // Catat waktu saat pertama kali tombol ditekan
isPressing = true; // Tandai bahwa kita sedang dalam proses menghitung waktu
while (digitalRead(btn2) == LOW); // Tunggu tombol dilepas
if (millis() - startTime >= 3000) {
menuState = 2; // Masuk ke setting alarm 2
}
}
}
void settingAlarm(int alarmNumber) {
lcd.clear();
lcd.setCursor(0, 0);
if (alarmNumber == 1) {
lcd.print("Set Alarm 1");
} else {
lcd.print("Set Alarm 2");
}
// Tombol untuk mengatur jam dan menit
if (digitalRead(btn1) == LOW) {
delay(100); // Debounce
if (alarmNumber == 1) {
alarm1Hour = (alarm1Hour + 1) % 24; // Ubah jam alarm 1
EEPROM.write(0, alarm1Hour);
EEPROM.commit();
} else {
alarm2Hour = (alarm2Hour + 1) % 24; // Ubah jam alarm 2
EEPROM.write(2, alarm2Hour);
EEPROM.commit();
}
} else if (digitalRead(btn2) == LOW) {
delay(100); // Debounce
if (alarmNumber == 1) {
alarm1Minute = (alarm1Minute + 1) % 60; // Ubah menit alarm 1
EEPROM.write(1, alarm1Minute);
EEPROM.commit();
} else {
alarm2Minute = (alarm2Minute + 1) % 60; // Ubah menit alarm 2
EEPROM.write(3, alarm2Minute);
EEPROM.commit();
}
} else if (digitalRead(btn3) == LOW) {
delay(100); // Debounce
menuState = 0; // Kembali ke menu utama
}
lcd.setCursor(0, 1);
lcd.print("Hour: ");
if (alarmNumber == 1) {
lcd.print(alarm1Hour);
} else {
lcd.print(alarm2Hour);
}
lcd.print(" Min: ");
if (alarmNumber == 1) {
lcd.print(alarm1Minute);
} else {
lcd.print(alarm2Minute);
}
}
Loading
esp32-devkit-v1
esp32-devkit-v1