#include <Wire.h>
#include <RTClib.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

RTC_DS3231 rtc;
Adafruit_SSD1306 display(128, 64, &Wire, -1); // Ganti -1 dengan pin reset jika diperlukan

const int relayPin = 4; // Pin untuk relay
int ledState = LOW;     // Status awal LED

void setup() {
  Serial.begin(9600);
  pinMode(relayPin, OUTPUT);
  digitalWrite(relayPin, LOW); // Pastikan relay mati saat mulai
  
  // Inisialisasi RTC
  if (!rtc.begin()) {
    Serial.println("RTC tidak ditemukan!");
    while (1);
  }

  // Inisialisasi OLED
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // Alamat I2C untuk OLED
  display.clearDisplay();
  
  // Atur waktu RTC (hanya perlu dilakukan sekali)
  // rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}

void loop() {
  DateTime now = rtc.now();

  // Menghidupkan relay (dan LED) dari jam 17:00 hingga 22:00
  // dan dari jam 03:00 hingga 06:00
  if ((now.hour() >= 13 && now.hour() < 22) || (now.hour() >= 3 && now.hour() < 6)) {
    digitalWrite(relayPin, HIGH); // Menghidupkan relay
    ledState = !ledState;          // Toggle state untuk berkedip
    delay(500);                   // Waktu berkedip 500 ms
    digitalWrite(relayPin, ledState); // Mengubah status relay
  } else {
    digitalWrite(relayPin, LOW); // Mematikan relay jika di luar jam yang ditentukan
  }

  // Tampilkan waktu dan status LED di OLED
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(0, 0);
  display.print("Waktu: ");
  display.print(now.hour());
  display.print(":");
  if (now.minute() < 10) display.print("0");
  display.print(now.minute());
  display.println();
  
  display.print("Relay: ");
  display.println(ledState == HIGH ? "ON" : "OFF");

  display.display();
  delay(500); // Delay untuk menghindari pembacaan terlalu cepat
}
NOCOMNCVCCGNDINLED1PWRRelay Module
GND5VSDASCLSQWRTCDS1307+