#include <FirebaseESP32.h>
#include <WiFi.h>
#include <RTClib.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2); // I2C address 0x27, 16 column and 2 rows
RTC_DS1307 rtc;
#define WIFI_SSID "Wokwi-GUEST" // your wifi SSID
#define WIFI_PASSWORD "" // your wifi PASSWORD
#define LedPin 16 // pin d0 as toggle pin
#define RelayPin1 25 // Relay 1 control pin
#define RelayPin2 33 // Relay 2 control pin
#define RelayPin3 36 // Relay 3 control pin
#define RelayPin4 32 // Relay 4 control pin
#define FIREBASE_HOST"https://toggle-button-84080-default-rtdb.firebaseio.com" // change here
#define FIREBASE_AUTH"luSbqSmBR4sACQnfdDzxETeVNiY0Kq3bjcCqh1EQ" // change here
FirebaseData firebaseData;
int lastLedStatus[4] = {0}; // Array to store the last known status for each LED
const int relayPins[] = {25,26,32,33};
const int numRelays = sizeof(relayPins) / sizeof(relayPins[0]);
void setup()
{
Serial.begin(115200);
lcd.backlight();
lcd.init();
lcd.setCursor(1,0);
lcd.print("CONTROL BOARD");
lcd.setCursor(1,1);
lcd.print("NORXEL"); delay(2000); lcd.clear();
Serial.println("program siap");
// Inisialisasi RTC
if (!rtc.begin()) {
Serial.println("Couldn't find RTC");
while (1);
}
// Cek apakah RTC berjalan, jika tidak, atur waktu RTC
if (!rtc.isrunning()) {
Serial.println("RTC is NOT running, let's set the time!");
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
pinMode(LedPin, OUTPUT);
pinMode(RelayPin1, OUTPUT);
pinMode(RelayPin2, OUTPUT);
pinMode(RelayPin3, OUTPUT);
pinMode(RelayPin4, OUTPUT);
Serial.begin(9600);
// connect to wifi.
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
Serial.print("connecting");
while (WiFi.status() != WL_CONNECTED)
{
Serial.print(".");
delay(500);
}
Serial.println();
Serial.print("connected: ");
Serial.println(WiFi.localIP());
Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH);
Firebase.reconnectWiFi(true);
}
void loop()
{
DateTime now = rtc.now();
// Tampilkan waktu pada LCD
lcd.setCursor(0, 0);
lcd.print("Time: ");
printDigits(now.hour());
lcd.print(':');
printDigits(now.minute());
lcd.print(':');
printDigits(now.second());
// Tampilkan hari dan tanggal pada LCD
lcd.setCursor(0, 1);
lcd.print("Date: ");
printDigits(now.day());
lcd.print('/');
printDigits(now.month());
lcd.print('/');
lcd.print(now.year(), DEC);
// Cek apakah hari ini Senin sampai Jumat
if (now.dayOfTheWeek() >= 1 && now.dayOfTheWeek() <= 5) { // Monday to Friday
int currentTime = now.hour() * 100 + now.minute();
if (currentTime >= 1430 && currentTime < 1431) {
// Turn on relays
for (int i = 0; i < numRelays; i++) {
digitalWrite(relayPins[i], HIGH);
}
} else {
// Turn off relays
for (int i = 0; i < numRelays; i++) {
digitalWrite(relayPins[i], LOW);
}
}
}
else {
// Turn off relays on weekends
for (int i = 0; i < numRelays; i++) {
// digitalWrite(relayPins[i], LOW);
}
}
delay(1000); // Tunggu satu detik sebelum melakukan pengecekan kembali
readAndUpdateLedStatus("/Led3Status", 0, RelayPin1);
readAndUpdateLedStatus("/Led1Status", 1, RelayPin2);
readAndUpdateLedStatus("/Led2Status", 2, RelayPin3);
readAndUpdateLedStatus("/Led4Status", 3, RelayPin4);
// You can add more logic here if needed.
}
void printDigits(int digits) {
// Tambahkan leading zero jika diperlukan
if (digits < 10)
lcd.print('0');
lcd.print(digits);
}
void readAndUpdateLedStatus(const char *path, int index, int relayPin)
{
if (Firebase.getString(firebaseData, path))
{
String ledstatus = firebaseData.stringData();
int currentStatus = ledstatus.toInt();
if (currentStatus == 1)
{
Serial.println("on" + String(index + 1));
digitalWrite(relayPin, HIGH); // Turn on the relay
}
else
{
Serial.println("off" + String(index + 1));
digitalWrite(relayPin, LOW); // Turn off the relay
}
lastLedStatus[index] = currentStatus; // Update the last known status
}
else
{
Serial.print("Error in getInt, ");
Serial.println(firebaseData.errorReason());
}
}