#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Definisi Pin Relay & LDR
#define LDR_PIN PA0 // Terhubung ke DO / AO LDR
#define RELAY1_PIN PA5 // Lampu 1 (01.00 - 08.00)
#define RELAY2_PIN PA6 // Lampu 2 (09.00 - 16.00)
#define RELAY3_PIN PA7 // Lampu 3 (17.00 - 24.00)
int currentHour = 1;
int currentMinute = 0;
void setup() {
pinMode(LDR_PIN, INPUT);
pinMode(RELAY1_PIN, OUTPUT);
pinMode(RELAY2_PIN, OUTPUT);
pinMode(RELAY3_PIN, OUTPUT);
digitalWrite(RELAY1_PIN, LOW);
digitalWrite(RELAY2_PIN, LOW);
digitalWrite(RELAY3_PIN, LOW);
Wire.setSDA(PA10);
Wire.setSCL(PA9);
Wire.begin();
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("System Control");
lcd.setCursor(0, 1);
lcd.print("STM32 Ready...");
delay(1500);
lcd.clear();
}
void loop() {
// Membaca status LDR (0 = Gelap, 1 = Terang atau sebaliknya tergantung modul)
int ldrState = digitalRead(LDR_PIN);
// Asumsi: LDR bernilai LOW (0) atau HIGH (1) saat gelap/terang
// Ubah '== LOW' jika di Wokwi slider gelap bernilai HIGH
bool isDark = (ldrState == LOW);
bool l1_active = false;
bool l2_active = false;
bool l3_active = false;
// Syarat: Lampu menyala HANYA jika masuk Jam Jadwal DAN kondisi GELAP
if (isDark) {
if (currentHour >= 1 && currentHour <= 8) {
l1_active = true;
}
else if (currentHour >= 9 && currentHour <= 16) {
l2_active = true;
}
else if ((currentHour >= 17 && currentHour <= 23) || currentHour == 0) {
l3_active = true;
}
}
// Eksekusi Relay (Menyalakan Lampu)
digitalWrite(RELAY1_PIN, l1_active ? HIGH : LOW);
digitalWrite(RELAY2_PIN, l2_active ? HIGH : LOW);
digitalWrite(RELAY3_PIN, l3_active ? HIGH : LOW);
// Tampilkan di LCD
lcd.setCursor(0, 0);
char timeBuffer[16];
sprintf(timeBuffer, "Jam:%02d:%02d LDR:%d", currentHour, currentMinute, ldrState);
lcd.print(timeBuffer);
lcd.setCursor(0, 1);
if (l1_active) lcd.print("L1:ON L2:OFF L3:OFF");
else if (l2_active) lcd.print("L1:OFF L2:ON L3:OFF");
else if (l3_active) lcd.print("L1:OFF L2:OFF L3:ON ");
else lcd.print("GELAP/TERANG: OFF ");
// Simulasi Waktu
delay(100);
currentMinute += 10;
if (currentMinute >= 60) {
currentMinute = 0;
currentHour++;
if (currentHour >= 24) currentHour = 0;
}
}