//Initialization Library
#include <Servo.h>
#include <Wire.h>
#include <RTClib.h>
Servo horizontal; // horizontal servo
int servoh = 180;
int servohLimitHigh = 175;
int servohLimitLow = 5;
// 65 degrees MAX
Servo vertical; // vertical servo
int servov = 45;
int servovLimitHigh = 100;
int servovLimitLow = 1;
// LDR pin connections
// name = analogpin;
int ldrlt = A0; //LDR top left - BOTTOM LEFT <--- BDG
int ldrrt = A3; //LDR top rigt - BOTTOM RIGHT
int ldrld = A1; //LDR down left - TOP LEFT
int ldrrd = A2; //ldr down rigt - TOP RIGHT
RTC_DS3231 rtc;
const int relay1Pin = 11; // Relay 1 control pin for motor 1
const int relay2Pin = 12; // Relay 2 control pin for motor 2
// const int openHour = 14; // Open the relay at 18:00 (6:00 PM)
// const int openMinute = 59;
void setup() {
Serial.begin(115200);
rtc.begin();
// if (!rtc.begin()) {
// Serial.println("Couldn't find RTC");
// while (1);
// }
// if (rtc.lostPower()) {
// Serial.println("RTC lost power, let's set the time!");
// rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
// }
//Setup Function
//void setup(){
horizontal.attach(9);
vertical.attach(10);
horizontal.write(180);
vertical.write(45);
pinMode(relay1Pin, OUTPUT);
pinMode(relay2Pin, OUTPUT);
digitalWrite(relay1Pin, LOW); // Initially close relay 1
digitalWrite(relay2Pin, LOW); // Initially close relay 2
delay(2500);
}
void loop() {
// DateTime now = rtc.now();
DateTime now = rtc.now(); // Use rtc.now() to get the current time
//untuk memonitor jam dari serial (boleh di disable)
// Serial.print(now.day(), DEC);
// Serial.print("/");
// Serial.print(now.month(), DEC);
// Serial.print("/");
// Serial.print(now.year(), DEC);
// Serial.print(" ");
Serial.print(now.hour(), DEC);
Serial.print(":");
Serial.print(now.minute(), DEC);
Serial.print(":");
Serial.print(now.second(), DEC);
Serial.println("");
//variabel waktu
int jam = now.hour();
int menit = now.minute();
int detik = now.second();
// int hari = now.day();
// int bulan = now.month();
// int tahun = now.year();
//sesuaikan jam, menit, dan detik dengan kebutuhan
if ((detik>=10) && (detik<=40)) {
digitalWrite(relay1Pin, HIGH);
digitalWrite(relay2Pin, HIGH);
delay(2000); //relay menyala selama 20 detik, silakan disesuaikan
digitalWrite(relay1Pin, LOW);
digitalWrite(relay2Pin, LOW);
}
else
{
digitalWrite(relay1Pin, LOW);
digitalWrite(relay2Pin, LOW);
}
//LDR Readings and Averaging
int lt = analogRead(ldrlt); // top left
int rt = analogRead(ldrrt); // top right
int ld = analogRead(ldrld); // down left
int rd = analogRead(ldrrd); // down right
int dtime = 10; int tol = 90; // dtime=diffirence time, tol=toleransi
int avt = (lt + rt) / 2; // average value top
int avd = (ld + rd) / 2; // average value down
int avl = (lt + ld) / 2; // average value left
int avr = (rt + rd) / 2; // average value right
int dvert = avt - avd; // check the diffirence of up and down
int dhoriz = avl - avr;// check the diffirence og left and rigt
//Servo Adjustment based on Light Intensity
if (-1*tol > dvert || dvert > tol)
{
if (avt > avd)
{
servov = ++servov;
if (servov > servovLimitHigh)
{servov = servovLimitHigh;}
}
else if (avt < avd)
{servov= --servov;
if (servov < servovLimitLow)
{ servov = servovLimitLow;}
}
vertical.write(servov);
}
if (-1*tol > dhoriz || dhoriz > tol) // check if the diffirence is in the tolerance else change horizontal angle
{
if (avl > avr)
{
servoh = --servoh;
if (servoh < servohLimitLow)
{
servoh = servohLimitLow;
}
}
else if (avl < avr)
{
servoh = ++servoh;
if (servoh > servohLimitHigh)
{
servoh = servohLimitHigh;
}
}
else if (avl = avr)
{
delay(5000);
}
horizontal.write(servoh);
}
// Check if it's 18:00 and open the relays for both motors
// if (now.hour() == openHour && now.minute() == 0 && now.second() == 0) {
// digitalWrite(relay1Pin, HIGH); // Open relay 1 for motor 1
// digitalWrite(relay2Pin, HIGH); // Open relay 2 for motor 2
// }
delay(dtime);
}