#include <Wire.h>
#include <LiquidCrystal.h>
#include <RTClib.h>
RTC_DS1307 rtc;
LiquidCrystal lcd(12, 11, 10, 9, 8, 7); //RS, Enable, D4, D5, D6, D7
const int buttonPin1 = 5; // Tombol untuk memilih waktu yang disetting
const int buttonPin2 = 6; // Tombol untuk menyesuaikan nilai waktu
const int buzzerPin = 13;
int buttonState1 = 0;
int buttonState2 = 0;
int cursorPosition = 0; // Menunjukkan posisi kursor, 1: jam, 2: menit, 3: detik
int lampuTerasBalkonPin = 2; // Pin untuk lampu teras dan balkon
int lampuRuangTengahKamarPin = 3; // Pin untuk lampu ruang tengah dan kamar
// Deklarasi waktu untuk menghidupkan dan mematikan lampu
const int onHourTerasBalkon = 18;
const int offHourTerasBalkon = 6;
const int onHourRuangTengahKamar = 17;
const int offHourRuangTengahKamar = 6;
void setup() {
lcd.begin(16, 2);
pinMode(buttonPin1, INPUT_PULLUP);
pinMode(buttonPin2, INPUT_PULLUP);
pinMode(lampuTerasBalkonPin, OUTPUT);
pinMode(lampuRuangTengahKamarPin, OUTPUT);
pinMode(buzzerPin, OUTPUT);
if (!rtc.begin()) {
lcd.print("RTC tidak ditemukan!");
while (1);
}
if (!rtc.isrunning()) {
lcd.print("RTC mulai...");
rtc.adjust(DateTime(2024,03,24,12,0,0)); // Setting waktu RTC
}
}
void loop() {
DateTime now = rtc.now();
// Baca status tombol
buttonState1 = digitalRead(buttonPin1);
buttonState2 = digitalRead(buttonPin2);
// Atur waktu saat tombol ditekan
if (buttonState1 == LOW) {
tone(buzzerPin, 100, 300);
cursorPosition++;
if (cursorPosition > 3) {
cursorPosition = 0;
}
}
if (buttonState2 == LOW) {
tone(buzzerPin, 100, 100);
if (cursorPosition == 1) {
now = now + TimeSpan(0, 1, 0, 0); // Menambah 1 jam
} else if (cursorPosition == 2) {
now = now + TimeSpan(0, 0, 1, 0); // Menambah 1 menit
} else if (cursorPosition == 3) {
now = now + TimeSpan(0, 0, 0, 1); // Menambah 1 detik
}
rtc.adjust(now);
}
kontrolLampu();
tampilanLCD();
}
// Tampilkan waktu saat ini di LCD
void tampilanLCD() {
DateTime now = rtc.now();
lcd.clear();
lcd.setCursor(1, 0);
lcd.print(dayStr(now.dayOfTheWeek())); // Menampilkan nama hari
lcd.print(" "); // Menampilkan nama hari
if (now.day() < 10) {
lcd.print('0');
}
lcd.print(now.day(), DEC);
lcd.print("/");
if (now.month() < 10) {
lcd.print('0');
}
lcd.print(now.month(), DEC);
lcd.print("/");
lcd.print(now.year(), DEC);
lcd.setCursor(4, 1);
if (now.hour() < 10) {
lcd.print('0');
}
lcd.print(now.hour(), DEC);
lcd.print(':');
if (now.minute() < 10) {
lcd.print('0');
}
lcd.print(now.minute(), DEC);
lcd.print(':');
if (now.second() < 10) {
lcd.print('0');
}
lcd.println(now.second(), DEC);
delay(200);
// Angka kedip utk di edit
if (cursorPosition == 1) {
lcd.setCursor(8, 0);
lcd.print(" ");
delay(200);
} else if (cursorPosition == 2) {
lcd.setCursor(11, 0);
lcd.print(" ");
delay(200);
} else if (cursorPosition == 3) {
lcd.setCursor(14, 0);
lcd.print(" ");
delay(200);
}
}
void kontrolLampu() {
DateTime now = rtc.now();
// Kontrol Lampu Teras dan Balkon
if (now.hour() >= onHourTerasBalkon || now.hour() < offHourTerasBalkon) {
digitalWrite(lampuTerasBalkonPin, HIGH); // Hidupkan lampu teras dan balkon
} else {
digitalWrite(lampuTerasBalkonPin, LOW); // Matikan lampu teras dan balkon
}
// Kontrol Lampu Ruang Tengah dan Kamar
if (now.hour() >= onHourRuangTengahKamar || now.hour() < offHourRuangTengahKamar) {
digitalWrite(lampuRuangTengahKamarPin, HIGH); // Hidupkan lampu ruang tengah dan kamar
} else {
digitalWrite(lampuRuangTengahKamarPin, LOW); // Matikan lampu ruang tengah dan kamar
}
}
// Fungsi untuk mendapatkan nama hari dari nomor hari
String dayStr(uint8_t day) {
switch(day) {
case 0: return "SUN";
case 1: return "MON";
case 2: return "TUE";
case 3: return "WED";
case 4: return "THU";
case 5: return "FRI";
case 6: return "SAT";
default: return "";
}
}