#include <Wire.h>
#include "RTClib.h"
#include <LiquidCrystal.h>
#include <EEPROM.h>
///////////////////////////////// Mendifinisikan Pin Tombol ////////////////////////////////////////
#define Jam_bUP A3 // Tombol setting sesuaikan dengan PIN di arduino anda mana klo ini terhubung dengan PIN 3 Digital
#define tombol_bOK A2 // Tombol OK sesuaikan dengan PIN di arduino anda mana klo ini terhubung dengan PIN 5 Digital
#define Jam_bDN A1 //tombol setting sesuaikan dengan PIN di arduino anda mana klo ini terhubung dengan PIN 4 Digital
/////
int jame = EEPROM.read(0);//baca eeprom
int menite = EEPROM.read(1); //baca eeprom
int jame2 = EEPROM.read(3);//baca eeprom
int menite2 = EEPROM.read(2); //baca eeprom kondisi lampu
int lampune = EEPROM.read(5); //baca eeprom kondisi lampu
int save=0;
RTC_DS1307 rtc;
LiquidCrystal lcd(7, 6, 5, 4, 3, 2); //LiquidCrystal lcd(RS, E, b4, b5, b6, b7);
char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
char monthsOfTheYear[12][4] = {"JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC"};
char dOfTheWeek[7][4] = { "Min", "Sen", "Sel", "Rab", "Kam", "Jum", "Sab"};
char setphase = 0;
char setpos = 0;
char cursorx[6] = {5, 7, 14, 5, 8, 11};
char cursory[6] = {0, 0, 0, 1, 1, 1};
DateTime now;
void setup () {
pinMode(8, OUTPUT);//output
Wire.begin();
pinMode(tombol_bOK, INPUT_PULLUP); // Mode Pin Sebagai Input dengan Pull Up Internal
pinMode(Jam_bUP, INPUT_PULLUP); // Mode Pin Sebagai Input dengan Pull Up Internal
pinMode(Jam_bDN, INPUT_PULLUP); // Mode Pin Sebagai Input dengan Pull Up Internal
Serial.begin(9600);
lcd.begin(16, 2);
lcd.setCursor(1, 0);
lcd.print("TIMER OTOMATIS");
lcd.setCursor(0, 1);
lcd.print("-SOLEH AL YUNUS-");
delay (4000);
lcd.clear();
if (! rtc.begin()) {
Serial.println("Couldn't find RTC");
while (1);
}
}
void loop () {
if (!setphase) {
now = rtc.now();
// following line sets the RTC to the date & time this sketch was compiled
// rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
// This line sets the RTC with an explicit date & time, for example to set
// January 21, 2014 at 3am you would call:
//rtc.adjust(DateTime(2017, 8, 2, 15, 58, 0));
}
int tgl = now.day ();
int bln = now.month();
int thn = now.year();
int jam = now.hour();
int menit = now.minute();
int detik = now.second();
//char hari = dOfTheWeek[now.dayOfTheWeek()];
Serial.print(thn, DEC);
Serial.print('/');
Serial.print(bln, DEC);
Serial.print('/');
Serial.print(tgl, DEC);
Serial.print(" (");
Serial.print(dOfTheWeek[now.dayOfTheWeek()]);
Serial.print(") ");
Serial.print(jam, DEC);
Serial.print(':');
Serial.print(menit, DEC);
Serial.print(':');
Serial.print(detik, DEC);
Serial.println();
lcd.setCursor(0, 0);
lcd.print(dOfTheWeek[now.dayOfTheWeek()]);
lcd.print(" ");
lcd.print(tens(tgl), DEC);
lcd.print(units(tgl), DEC);
lcd.print(' ');
lcd.print(monthsOfTheYear[bln - 1]);
lcd.print(' ');
lcd.print(thn, DEC);
lcd.print(' ');
lcd.setCursor(0, 1);
lcd.print(tens(jam), DEC);
lcd.print(units(jam), DEC);
lcd.print(':');
lcd.print(tens(menit), DEC);
lcd.print(units(menit), DEC);
lcd.print(':');
lcd.print(tens(detik), DEC);
lcd.print(units(detik), DEC);
lcd.print(' ');
if (lampune == 1) {
lcd.setCursor(10, 1);
lcd.print("L-ON ");
digitalWrite(8, lampune);//outputnya
} if (lampune == 0) {
lcd.setCursor(10, 1);
lcd.print("L-OFF");
digitalWrite(8, lampune);//outputnya
}
///////////////interupsi tombol menu-----------
if (digitalRead(tombol_bOK) == LOW) {
MenuSetting();
}
//**
if (jam == jame && menit == menite) {
lcd.setCursor(10, 1);
lcd.print("L-ON ");
lcd.setCursor(0, 1);
lcd.setCursor(0, 1);
lcd.print(tens(jam), DEC);
lcd.print(units(jam), DEC);
lcd.print(':');
lcd.print(tens(menit), DEC);
lcd.print(units(menit), DEC);
lcd.print(':');
lcd.print(tens(detik), DEC);
lcd.print(units(detik), DEC);
lcd.print(' ');
lampune = 1;
digitalWrite(8, lampune);//outputnya
EEPROM.write(5, lampune); //tulis eeprom kondisi lampu
}
if (jam == jame2 && menit == menite2) {
lcd.setCursor(10, 1);
lcd.print("L-OFF");
lcd.setCursor(0, 1);
lcd.setCursor(0, 1);
lcd.print(tens(jam), DEC);
lcd.print(units(jam), DEC);
lcd.print(':');
lcd.print(tens(menit), DEC);
lcd.print(units(menit), DEC);
lcd.print(':');
lcd.print(tens(detik), DEC);
lcd.print(units(detik), DEC);
lcd.print(' ');
lampune = 0;
digitalWrite(8, lampune);//outputnya
EEPROM.write(5, lampune); //tulis eeprom kondisi lampu
}
}
//////menu setting//
void MenuSetting() {
int tgl = now.day ();
int bln = now.month();
int thn = now.year();
int jam = now.hour();
int menit = now.minute();
int detik = now.second();
int hari = hari;
/////////////////////////////////////// Setting Jam & Menit ///////
int kasus = 0;
setTimes:
// Setting Times (Jam & Menit)
if (digitalRead(Jam_bUP) == LOW ) { // Tombol Setting Menit
delay(10); menit++; // Delay Tombol & Tambah Nilai Menit
if (menit >= 60) {
menit = 0; // Batas Nilai Menit Lebih dari 59 Kembali ke 0
}
while (digitalRead(Jam_bUP) == LOW) {} // Kunci Tombol Setting Menit Sampai Lepas Tombol
rtc.adjust(DateTime(thn, bln, tgl, jam, menit, 0));
}
if (digitalRead(Jam_bDN) == LOW) { // Tombol Setting Menit
delay(10); jam++; // Delay Tombol & Tambah Nilai Jam
if (jam >= 24) {
jam = 0; // Batas Nilai Jam Lebih dari 23 Kembali ke 0
}
while (digitalRead(Jam_bDN) == LOW) {} // Kunci Tombol Setting Jam Sampai Lepas Tombol
rtc.adjust(DateTime(thn, bln, tgl, jam, menit, 0));
}
setTgl:
// Setting tanggal
if (digitalRead(Jam_bUP) == LOW ) { // Tombol Setting tanggal
delay(10); tgl++;
if (tgl >= 32) {
tgl = 1; // Batas Nilai tgl Lebih dari 31 Kembali ke 1
}
while (digitalRead(Jam_bUP) == LOW) {} // Kunci Tombol Setting tgl Sampai Lepas Tombol
rtc.adjust(DateTime(thn, bln, tgl, jam, menit, 0));
}
if (digitalRead(Jam_bDN) == LOW) { // Tombol Setting bln
delay(10); bln++; // Delay Tombol & Tambah Nilai bln
if (bln >= 13) {
bln = 1; // Batas Nilai bln Lebih dari 12 Kembali ke 1
}
while (digitalRead(Jam_bDN) == LOW) {} // Kunci Tombol Setting blnSampai Lepas Tombol
rtc.adjust(DateTime(thn, bln, tgl, jam, menit, 0));
}
// ///////=======setting thn==
setThn: // Setting thn
if (digitalRead(Jam_bUP) == LOW ) { // Tombol Setting thn
delay(10); thn++; // Delay Tombol & Tambah Nilai thn
if (thn >= 9999) {
thn = 0; // Batas Nilai Menit Lebih dari 9999 Kembali ke 0
}
while (digitalRead(Jam_bUP) == LOW) {} // Kunci Tombol Setting thn Sampai Lepas Tombol
rtc.adjust(DateTime(thn, bln, tgl, jam, menit, 0));
}
if (digitalRead(Jam_bDN) == LOW) { // Tombol Setting thn
delay(10); thn--; // Delay Tombol & Tambah Nilai thn
if (thn <= 0) {
thn = 0; // Batas Nilai kurang dari 0 Kembali ke 0
}
while (digitalRead(Jam_bDN) == LOW) {} // Kunci Tombol Setting thn Sampai Lepas Tombol
rtc.adjust(DateTime(thn, bln, tgl, jam, menit, 0));
}
// =======setting Relay ON======
setRelay:
// Setting Times (Jam & Menit)
if (digitalRead(Jam_bUP) == LOW ) { // Tombol Setting Menit
delay(10); menite++; // Delay Tombol & Tambah Nilai Menit
if (menite >= 60) {
menite = 0; // Batas Nilai Menit Lebih dari 59 Kembali ke 0
}
while (digitalRead(Jam_bUP) == LOW) {} // Kunci Tombol Setting Menit Sampai Lepas Tombol
}
if (digitalRead(Jam_bDN) == LOW) { // Tombol Setting Menit
delay(10); jame++; // Delay Tombol & Tambah Nilai Jam
if (jame >= 24) {
jame = 0; // Batas Nilai Jam Lebih dari 23 Kembali ke 0
}
while (digitalRead(Jam_bDN) == LOW) {} // Kunci Tombol Setting Jam Sampai Lepas Tombol
}
// =======setting Relay OFF======
setRelay2:
// Setting Times (Jam & Menit)
if (digitalRead(Jam_bUP) == LOW ) { // Tombol Setting Menit
delay(10); menite2++; // Delay Tombol & Tambah Nilai Menit
if (menite2 >= 60) {
menite2 = 0; // Batas Nilai Menit Lebih dari 59 Kembali ke 0
}
while (digitalRead(Jam_bUP) == LOW) {} // Kunci Tombol Setting Menit Sampai Lepas Tombol
}
if (digitalRead(Jam_bDN) == LOW) { // Tombol Setting Menit
delay(10); jame2++; // Delay Tombol & Tambah Nilai Jam
if (jame2 >= 24) {
jame2 = 0; // Batas Nilai Jam Lebih dari 23 Kembali ke 0
}
while (digitalRead(Jam_bDN) == LOW) {} // Kunci Tombol Setting Jam Sampai Lepas Tombol
}
setSave:
if (digitalRead(Jam_bUP) == LOW ) { // Tombol Setting Menit
delay(10);
while (digitalRead(Jam_bUP) == LOW) {} // Kunci Tombol Setting Menit Sampai Lepas Tombol
save=0;
}
if (digitalRead(Jam_bDN) == LOW) { // Tombol Setting Menit
delay(10);
while (digitalRead(Jam_bDN) == LOW) {} // Kunci Tombol Setting Jam Sampai Lepas Tombol
save=1;
}
setNotif:
if(save==0){
}
if(save==1){
EEPROM.write(2, menite2); //tulis eeprom
EEPROM.write(0, jame); //tulis eeprom
EEPROM.write(1, menite); //tulis eeprom
EEPROM.write(3, jame2); //tulis eeprom
}
///============Tombol OKE =======================
if (digitalRead(tombol_bOK) == LOW) { // Tombol Selesai Setting
kasus = kasus + 1;
delay(500);
// ============================================kasus-kasus===================
} if (kasus == 1) { //kasus seting jam
delay (100);
lcd.clear();
lcd.setCursor(12, 1);
lcd.print(menit);
lcd.setCursor(5, 1);
lcd.print(jam);
lcd.setCursor(0, 0);
lcd.print("Set: Jam Menit");
goto setTimes; //lari ke fungsi seting jam
} if (kasus == 2) { //kasus seting jam
delay (100);
lcd.clear();
lcd.setCursor(5, 1);
lcd.print(tgl);
lcd.setCursor(12, 1);
lcd.print(bln);
lcd.setCursor(0, 0);
lcd.print("Set: Tgl Bln");
goto setTgl; //lari ke fungsi seting tanggal
} if (kasus == 3) { //kasus seting tahun
delay (100);
lcd.clear();
lcd.setCursor(5, 1);
lcd.print(thn);
lcd.setCursor(0, 0);
lcd.print("Set: Tahun");
goto setThn; //lari ke fungsi seting tahun
} if (kasus == 4) { //kasus seting relay
delay (100);
lcd.clear();
lcd.setCursor(12, 1);
lcd.print(menite);
lcd.setCursor(6, 1);
lcd.print(jame);
lcd.setCursor(0, 0);
lcd.print("L-ON:Jam Menit");
goto setRelay; //lari ke fungsi seting relay
} if (kasus == 5) { //kasus seting relay
delay (100);
lcd.clear();
lcd.setCursor(12, 1);
lcd.print(menite2);
lcd.setCursor(6, 1);
lcd.print(jame2);
lcd.setCursor(0, 0);
lcd.print("L-OFF:Jam Menit");
goto setRelay2; //lari ke fungsi seting relay
} if (kasus == 6) { //kasus simpan
delay (100);
lcd.clear();
lcd.setCursor(6, 0);
lcd.print("Save?");
if(save==0){
lcd.setCursor(7, 1);
lcd.print("NO");
}
if(save==1){
lcd.setCursor(7, 1);
lcd.print("YES");
}
goto setSave;
}
if (kasus == 7) { //sukses
delay (100);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Terimakasih");
if(save==0){
lcd.setCursor(0, 1);
lcd.print("NOT SAVED");
}
if(save==1){
lcd.setCursor(0, 1);
lcd.print("SAVED");
}
goto setNotif; //lari ke fungsi Notif
}
}
////
char tens(int n) {
return (n / 10) % 10;
}
char units(int n) {
return n % 10;
}