#include "RTClib.h" //library RTC
//inisialisai INPUT
#define sw1 2
#define sw2 3
#define sw3 4
#define sw4 5
#define sw5 6
#define sw6 7
//inisialisai OUTPUT
#define rly1 8
#define rly2 9
#define rly3 10
#define rly4 11
#define rly5 12
#define rly6 13
/*ketika ingin menambahkan bisa menyalin inisialisai sebelumnya dan sesuaikan nama inisialisasi dan alamat sesuai urutan*/
//valiabel untuk menampung nilai kondisi dari output
bool valRly1, valRly2, valRly3, valRly4, valRly5, valRly6;
bool valRly11, valRly22, valRly33, valRly44, valRly55, valRly66;
bool valRly111, valRly222, valRly333, valRly444, valRly555, valRly666;
/*ketika ingin menambahkan bisa menyalin variabel sebelumnya dan sesuaikan nama variabel sesuai urutan*/
//setup dan variabel untuk modul RTC
RTC_DS3231 rtc;
char daysOfTheWeek[7][12] = { "Minggu", "Senin", "Selasa", "Rabu", "Kamis", "Jum'at", "Sabtu" };
String hari;
int jam, menit, detik;
int tanggal, bulan, tahun;
//pengaturan untuk hari kerja dan jam kerja
const int jumlahHariKerja = 5; //masukan jumlah hari kerja perminggu
String hariKerja[jumlahHariKerja] = { "Senin", "Selasa", "Rabu", "Kamis", "Jum'at" }; //masukan hari kerja sesuai jumlah hari kerja
int waktuMasuk[2] = { 7, 0}; //masukan jam masuk dengan format jam, menit
int waktuPulang[2] = { 17, 0}; //masukan jam pulang dengan format jam, menit
int lemburMasuk[2] = { 17, 1}; //masukan jam masuk dengan format jam, menit
int lemburPulang[2] = { 19, 0}; //masukan jam pulang dengan format jam, menit
bool statusHari; //true = hari kerja, false = hari libur
//variabel untuk perhitungan waktu delay
unsigned long pMillis11, pMillis22, pMillis33, pMillis44, pMillis55, pMillis66;
unsigned long pMillis111, pMillis222, pMillis333, pMillis444, pMillis555, pMillis666;
unsigned long currentMillis11, currentMillis22, currentMillis33, currentMillis44, currentMillis55, currentMillis66;
unsigned long currentMillis111, currentMillis222, currentMillis333, currentMillis444, currentMillis555, currentMillis666;
//variabel untuk memberikan waktu delay
const long fiveMinute = 10000; //5 menit = 300000
const long thirtyMinute = 15000; //30 menit = 1800000
int mode; //variabel untuk melihat mode berapa yang berjalan
void setup() {
Serial.begin(9600);
pinMode(sw1, INPUT);
pinMode(sw2, INPUT);
pinMode(sw3, INPUT);
pinMode(sw4, INPUT);
pinMode(sw5, INPUT);
pinMode(sw6, INPUT);
pinMode(rly1, OUTPUT);
pinMode(rly2, OUTPUT);
pinMode(rly3, OUTPUT);
pinMode(rly4, OUTPUT);
pinMode(rly5, OUTPUT);
pinMode(rly6, OUTPUT);
/*tambahkan setup pinMode sesuai dengan jumlah relay yang digunakan*/
//pengecekan komunikasi awal dengan RTC
if (!rtc.begin()) {
Serial.println("Couldn't find RTC");
Serial.flush();
while (1) delay(10);
}
//saat pertama kali mengunakan RTC harus disetting terlebih dahulu untuk waktu dengan memilih salah satu dari fungsi berikut:
//rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); //untuk setting awal waktu RTC sesuai dengan komputer
//rtc.adjust(DateTime(2024, 2, 11, 18, 0, 45)); //untuk setting awal waktu RTC secara manual dengan format (tahun, bulan, tanggal, jam, menit, detik)
}
void loop() {
runRTC();
bool valSw1 = digitalRead(sw1);
bool valSw2 = digitalRead(sw2);
bool valSw3 = digitalRead(sw3);
bool valSw4 = digitalRead(sw4);
bool valSw5 = digitalRead(sw5);
bool valSw6 = digitalRead(sw6);
/*mengetahui status hari apakah termasuk hari kerja atau tidak
jika hari kerja maka statusHari akan bernilai true
namun jika tidak maka akan bernilai false
*/
for (int i = 0; i <= jumlahHariKerja-1; i++) {
if(hari == hariKerja[i]) {
statusHari = true;
i = jumlahHariKerja-1;
} else statusHari = false;
}
//----------------------Main function----------------------
if(statusHari){ //Hari kerja
//----------------------jam kerja normal----------------------
if((jam >= waktuMasuk[0] && jam<= waktuPulang[0])&&((menit >= waktuMasuk[1]||jam>waktuMasuk[0]) && (menit <= waktuPulang[1]||jam<waktuPulang[0]))){
if(valSw1 == true) valRly1 = true;
if(valSw2 == true) valRly2 = true;
if(valSw3 == true) valRly3 = true;
if(valSw4 == true) valRly4 = true;
if(valSw5 == true) valRly5 = true;
if(valSw6 == true) valRly6 = true;
mode = 1;
if(jam == waktuPulang[0] && menit == waktuPulang[1] && detik == 59){
valRly1 = valRly2 = valRly3 = valRly4 = valRly5 = valRly6 = false;
}
}
//----------------------jam lembur----------------------
else if((jam >= lemburMasuk[0] && jam<= lemburPulang[0])&&((menit >= lemburMasuk[1]||jam>lemburMasuk[0]) && (menit <= lemburPulang[1]||jam<lemburPulang[0]))){
if(valSw1){ //motion 1
pMillis11 = millis();
valRly11 = true;
} else if(valSw2){ //motion 2
pMillis22 = millis();
valRly22 = true;
} else if(valSw3){ //motion 3
pMillis33 = millis();
valRly33 = true;
} else if(valSw4){ //motion 4
pMillis44 = millis();
valRly44 = true;
} else if(valSw5){ //motion 5
pMillis55 = millis();
valRly55 = true;
} else if(valSw6){ //motion 6
pMillis66 = millis();
valRly66 = true;
}
mode = 2;
if(jam == lemburPulang[0] && menit == lemburPulang[1] && detik == 59){
pMillis11 = currentMillis11;
pMillis22 = currentMillis22;
pMillis33 = currentMillis33;
pMillis44 = currentMillis44;
pMillis55 = currentMillis55;
pMillis66 = currentMillis66;
valRly11 = valRly22 = valRly33 = valRly44 = valRly55 = valRly66 = false;
}
}
//----------------------jam closed----------------------
else { //bukan jam kerja
if(valSw1){ //motion 1
pMillis111 = millis();
valRly111 = true;
} else if(valSw2){ //motion 2
pMillis222 = millis();
valRly222 = true;
} else if(valSw3){ //motion 3
pMillis333 = millis();
valRly333 = true;
} else if(valSw4){ //motion 4
pMillis444 = millis();
valRly444 = true;
} else if(valSw5){ //motion 5
pMillis555 = millis();
valRly555 = true;
} else if(valSw6){ //motion 6
pMillis666 = millis();
valRly666 = true;
}
mode = 3;
if(jam == waktuMasuk[0] && menit == waktuMasuk[1] - 1 && detik == 59){
pMillis111 = currentMillis111;
pMillis222 = currentMillis222;
pMillis333 = currentMillis333;
pMillis444 = currentMillis444;
pMillis555 = currentMillis555;
pMillis666 = currentMillis666;
valRly111 = valRly222 = valRly333 = valRly444 = valRly555 = valRly666 = false;
}
}
}
else{ //----------------------bukan hari kerja----------------------
if(valSw1){ //motion 1
pMillis11 = millis();
valRly11 = true;
} else if(valSw2){ //motion 2
pMillis22 = millis();
valRly22 = true;
} else if(valSw3){ //motion 3
pMillis33 = millis();
valRly33 = true;
} else if(valSw4){ //motion 4
pMillis44 = millis();
valRly44 = true;
} else if(valSw5){ //motion 5
pMillis55 = millis();
valRly55 = true;
} else if(valSw6){ //motion 6
pMillis66 = millis();
valRly66 = true;
}
mode = 4;
}
//----------------------relay stay HIGH----------------------
if(valRly1==true) digitalWrite(rly1, HIGH); else digitalWrite(rly1, LOW);
if(valRly2==true) digitalWrite(rly2, HIGH); else digitalWrite(rly2, LOW);
if(valRly3==true) digitalWrite(rly3, HIGH); else digitalWrite(rly3, LOW);
if(valRly4==true) digitalWrite(rly4, HIGH); else digitalWrite(rly4, LOW);
if(valRly5==true) digitalWrite(rly5, HIGH); else digitalWrite(rly5, LOW);
if(valRly6==true) digitalWrite(rly6, HIGH); else digitalWrite(rly6, LOW);
//----------------------delay 30 menit----------------------
if(valRly11 == true){ //relay 1
currentMillis11 = millis();
digitalWrite(rly1, HIGH);
if (currentMillis11 - pMillis11 >= thirtyMinute) {
pMillis11 = currentMillis11;
valRly11 = false;
}
} else digitalWrite(rly1, LOW);
if(valRly22 == true){ //relay 2
currentMillis22 = millis();
digitalWrite(rly2, HIGH);
if (currentMillis22 - pMillis22 >= thirtyMinute) {
pMillis22 = currentMillis22;
valRly22 = false;
}
} else digitalWrite(rly2, LOW);
if(valRly33 == true){
currentMillis33 = millis();
digitalWrite(rly3, HIGH);
if (currentMillis33 - pMillis33 >= thirtyMinute) {
pMillis33 = currentMillis33;
valRly33 = false;
}
} else digitalWrite(rly3, LOW);
if(valRly44 == true){
currentMillis44 = millis();
digitalWrite(rly4, HIGH);
if (currentMillis44 - pMillis44 >= thirtyMinute) {
pMillis44 = currentMillis44;
valRly44 = false;
}
} else digitalWrite(rly4, LOW);
if(valRly55 == true){ //relay 4
currentMillis55 = millis();
digitalWrite(rly5, HIGH);
if (currentMillis55 - pMillis55 >= thirtyMinute) {
pMillis55 = currentMillis55;
valRly55 = false;
}
} else digitalWrite(rly5, LOW);
if(valRly66 == true){ //relay 6
currentMillis66 = millis();
digitalWrite(rly6, HIGH);
if (currentMillis66 - pMillis66 >= thirtyMinute) {
pMillis66 = currentMillis66;
valRly66 = false;
}
} else digitalWrite(rly6, LOW);
//----------------------delay 5 menit----------------------
if(valRly111 == true){ //relay 1
currentMillis111 = millis();
digitalWrite(rly1, HIGH);
if (currentMillis111 - pMillis111 >= fiveMinute) {
pMillis111 = currentMillis111;
valRly111 = false;
}
} else digitalWrite(rly1, LOW);
if(valRly222 == true){ //relay 2
currentMillis222 = millis();
digitalWrite(rly2, HIGH);
if (currentMillis222 - pMillis222 >= fiveMinute) {
pMillis222 = currentMillis222;
valRly222 = false;
}
} else digitalWrite(rly2, LOW);
if(valRly333 == true){
currentMillis333 = millis();
digitalWrite(rly3, HIGH);
if (currentMillis333 - pMillis333 >= fiveMinute) {
pMillis333 = currentMillis333;
valRly333 = false;
}
} else digitalWrite(rly3, LOW);
if(valRly444 == true){
currentMillis444 = millis();
digitalWrite(rly4, HIGH);
if (currentMillis444 - pMillis444 >= fiveMinute) {
pMillis444 = currentMillis444;
valRly444 = false;
}
} else digitalWrite(rly4, LOW);
if(valRly555 == true){ //relay 4
currentMillis555 = millis();
digitalWrite(rly5, HIGH);
if (currentMillis555 - pMillis555 >= fiveMinute) {
pMillis555 = currentMillis555;
valRly555 = false;
}
} else digitalWrite(rly5, LOW);
if(valRly666 == true){ //relay 6
currentMillis666 = millis();
digitalWrite(rly6, HIGH);
if (currentMillis666 - pMillis666 >= fiveMinute) {
pMillis666 = currentMillis666;
valRly666 = false;
}
} else digitalWrite(rly6, LOW);
Serial.println(mode);
Serial.println(statusHari);
}
void runRTC() {
DateTime now = rtc.now();
jam = now.hour();
menit = now.minute();
detik = now.second();
tanggal = now.day();
bulan = now.month();
tahun = now.year();
hari = daysOfTheWeek[now.dayOfTheWeek()];
Serial.print(String() + hari + ", " + tanggal + "-" + bulan + "-" + tahun + "|| ");
Serial.println(String() + jam + "-" + menit + "-" + detik);
Serial.println();
delay(10);
}