#include <Wire.h>
#include <RTClib.h>
#include <LiquidCrystal_I2C.h>
#include <Servo.h>
RTC_DS3231 rtc;
LiquidCrystal_I2C lcd(0x27, 20, 4); // Ganti alamat I2C jika perlu
Servo myServo;
const int buzzerPin = 8;
const int servoPin = 9;
const int trigPin = 3;
const int echoPin = 2;
const int buttonAddHourPin = 4; // Tombol untuk menambah jam
const int buttonAddMinutePin = 5; // Tombol untuk menambah menit
const int buttonSavePin = 6; // Tombol untuk menyimpan waktu
const int buttonSwitchAlarmPin = 7; // Tombol untuk beralih alarm
long duration;
int distanceCm;
// Jam dalam format 24 jam (misalnya 900 untuk 09:00, 1200 untuk 12:00, 1800 untuk 18:00)
int servoOpenTimes[3] = {2043, 1200, 1800};
int currentAlarmIndex = 0; // Indeks alarm yang sedang diatur
int currentHour = 0;
int currentMinute = 0;
void setup() {
Serial.begin(9600);
rtc.begin();
myServo.attach(servoPin);
pinMode(buzzerPin, OUTPUT);
lcd.init();
lcd.backlight();
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(buttonAddHourPin, INPUT_PULLUP); // Tombol untuk menambah jam
pinMode(buttonAddMinutePin, INPUT_PULLUP); // Tombol untuk menambah menit
pinMode(buttonSavePin, INPUT_PULLUP); // Tombol untuk menyimpan waktu
pinMode(buttonSwitchAlarmPin, INPUT_PULLUP); // Tombol untuk beralih alarm
// Set RTC jika belum diset (hanya sekali)
// rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
void loop() {
DateTime now = rtc.now();
currentHour = now.hour();
currentMinute = now.minute();
// Tampilkan waktu saat ini di LCD
lcd.setCursor(0, 0);
lcd.print("Waktu: ");
lcd.print(currentHour);
lcd.print(":");
if (currentMinute < 10) {
lcd.print("0"); // Tambahkan nol di depan jika menit kurang dari 10
}
lcd.print(currentMinute);
// Tampilkan jam alarm di baris kedua LCD
updateAlarmDisplay();
// Cek waktu untuk membuka servo
for (int i = 0; i < 3; i++) {
if (currentHour * 100 + currentMinute == servoOpenTimes[i]) {
openServo();
delay(60000); // Tunggu 1 menit untuk menghindari pemicu berulang
}
}
// Cek tombol untuk beralih alarm
if (digitalRead(buttonSwitchAlarmPin) == LOW) {
currentAlarmIndex++;
if (currentAlarmIndex >= 3) {
currentAlarmIndex = 0; // Reset ke alarm pertama jika lebih dari 3
}
delay(200); // Debounce delay
}
// Cek tombol untuk menambah jam
if (digitalRead(buttonAddHourPin) == LOW) {
int hour = servoOpenTimes[currentAlarmIndex] / 100; // Ambil jam dari alarm yang sedang diatur
hour++;
if (hour >= 24) {
hour = 0; // Reset jam jika lebih dari 23
}
servoOpenTimes[currentAlarmIndex] = hour * 100 + (servoOpenTimes[currentAlarmIndex] % 100); // Simpan jam baru
updateAlarmDisplay(); // Memperbarui tampilan alarm di LCD
delay(200); // Debounce delay
}
// Cek tombol untuk menambah menit
if (digitalRead(buttonAddMinutePin ) == LOW) {
int minute = servoOpenTimes[currentAlarmIndex] % 100; // Ambil menit dari alarm yang sedang diatur
minute += 1; // Tambah 5 menit
if (minute >= 60) {
minute = 0;
int hour = servoOpenTimes[currentAlarmIndex] / 100; // Ambil jam
hour++;
if (hour >= 24) {
hour = 0; // Reset jam jika lebih dari 23
}
servoOpenTimes[currentAlarmIndex] = hour * 100 + minute; // Simpan jam baru
} else {
servoOpenTimes[currentAlarmIndex] = (servoOpenTimes[currentAlarmIndex] / 100) * 100 + minute; // Simpan menit baru
}
updateAlarmDisplay(); // Memperbarui tampilan alarm di LCD
delay(200); // Debounce delay
}
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distanceCm = duration*0.034/2;
// ...
int maxDistanceCm = 400;
int percentage = map(distanceCm, 0, maxDistanceCm, 0, 100);
lcd.setCursor(0,2);
lcd.print("Sisa Pakan: ");
lcd.print(percentage);
lcd.print(" %");
delay(10);
}
void openServo() {
myServo.write(90); // Buka servo
digitalWrite(buzzerPin, HIGH); // Nyalakan buzzer
delay(1000); // Tunggu 1 detik
myServo.write(0); // Tutup servo
digitalWrite(buzzerPin, LOW); // Matikan buzzer
}
void updateAlarmDisplay() {
// Tampilkan jam alarm di baris kedua LCD
lcd.setCursor(0, 1);
lcd.print("Alarm: ");
for (int i = 0; i < 3; i++) {
int hour = servoOpenTimes[i] / 100; // Ambil jam
int minute = servoOpenTimes[i] % 100; // Ambil menit
lcd.print(hour);
lcd.print(":");
if (minute < 10) {
lcd.print("0"); // Tambahkan nol di depan jika menit kurang dari 10
}
lcd.print(minute);
if (i < 2) {
lcd.print(" "); // Tambahkan spasi antara jam
}
}
}