//Library yang digunakan
#include <Wire.h>
#include "RTClib.h"
#include <LiquidCrystal.h>
// Membuat objek LCD dan RTC
LiquidCrystal lcd(2, 3, 4, 5, 6, 7);
RTC_DS3231 rtc;
//Array nama-nama hari yang akan ditampilkan
char nameDay[7][12] = {"Minggu", "Senin", "Selasa", "Rabu", "Kamis", "Jumat", "Sabtu"};
//Definisi PIN
int btna = 11; //PIN untuk button mematikan alarm
int btnl = 12; //PIN untuk button mengontrol lampu
//Variabel untuk membaca status komponen
int statebtna = 0;
int statebtnl = 0;
bool ledstate = false; //status awal LED mati
void setup()
{
//inisialisasi PIN
pinMode(1, OUTPUT);
pinMode(8, OUTPUT);
pinMode(12, INPUT_PULLUP);
pinMode(11, INPUT);
//inisialisasi LED & RTC
lcd.begin(20, 4);
lcd.setCursor(0,1);
lcd.print(" JAM DIGITAL ");
lcd.setCursor(0,2);
lcd.print(" SMART CLOCK ");
delay(1000);
lcd.clear();
rtc.begin();
// Set waktu RTC jika daya hilang
if (rtc.lostPower()) {
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
}
void loop() {
//Membaca status button
statebtna = digitalRead (btna);
statebtnl = digitalRead (btnl);
//Membaca waktu dari RTC
DateTime now = rtc.now();
//Menampilkan informasi di LCD
lcd.setCursor(2,0);
lcd.print (nameDay[now.dayOfTheWeek()]);
lcd.print (",");
printAngka (now.day());
lcd.print (",");
printAngka (now.month());
lcd.print (",");
printAngka (now.year());
lcd.setCursor(6,1);
printAngka (now.hour());
lcd.print (",");
printAngka (now.minute());
lcd.print (",");
printAngka (now.second());
lcd.setCursor (1,3);
lcd.print (" BALI - INDONESIA ");
//Mematikan LED secara otomatis pada jam 22.00
if (now.hour() == 22 && now.minute() == 0 && now.second() == 0){
digitalWrite (1, LOW);
ledstate = false;
}
//Menghidupkan LED secara otomatis pada jam 05.00
if (now.hour() == 5 && now.minute() == 0 && now.second() == 0){
digitalWrite (1, HIGH);
ledstate = true;
}
//Mengontrol LED secara manual dengan push button
if (statebtnl == LOW){
ledstate = !ledstate;
digitalWrite (1, ledstate);
}
//Mengontrol alarm
if (now.hour() == 5){
tone(8,1000,50); //Alarm otomatis hidup pada jam 05.00
if (now.minute() >= 5){
tone(8,0,50); //Alarm otomatis mati jika tidak ada interaksi setelah 5 menit
}
else if (statebtna == HIGH){
tone(8,0,50); //Alarm akan mati jika button ditekan
}
}
delay(250);
}
//Mendefinisikan fungsi printAngka
void printAngka (int digits){
if (digits < 10){
lcd.print("0");
lcd.print(digits);
}
else lcd.print(digits);
}