#include <Wire.h>
#include <Stepper.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4); // Alamat LCD dan ukuran 20x4
Stepper stepper(200, 12, 13, 14, 27);
const int Relay1 = 25; // Digital pin untuk lampu 50%
const int Relay2 = 26; // Digital pin untuk lampu 100%
const int PIR = 32; // Digital pin untuk PIR sensor
const int LDR = 33; // Pin analog untuk LDR sensor
int brightnessLevel1 = 77; // Kecerahan awal untuk lampu 50%
int brightnessLevel2 = 255; // Kecerahan awal untuk lampu 100%
int currentPosition = 0; // Menyimpan posisi saat ini motor stepper
void setup() {
Serial.begin(9600);
Wire.begin();
lcd.init(); // Inisialisasi LCD
lcd.backlight(); // Hidupkan backlight LCD
pinMode(Relay1, OUTPUT); // Pin sebagai output
pinMode(Relay2, OUTPUT); // Pin sebagai output
stepper.setSpeed(50); // Set kecepatan stepper motor di sini
}
void loop() {
int lightIntensity = analogRead(LDR); // Baca intensitas cahaya dari LDR
bool isNight = lightIntensity < 100; // Misalkan nilai di bawah 100 dianggap sebagai malam hari, sesuaikan dengan kondisi nyata
bool pir1Active = digitalRead(PIR) == HIGH;
// Tampilkan intensitas cahaya pada LCD
lcd.setCursor(0, 0);
lcd.print("Light: ");
lcd.print(lightIntensity);
lcd.print(" ");
lcd.setCursor(0, 2);
lcd.print("RL1: OFF RL2: OFF");
lcd.setCursor(0, 3);
lcd.print("MTR: OFF PIR: OFF");
// Atur relay berdasarkan kondisi siang/malam dan PIR
if (isNight && !pir1Active) {
// Lampu menyala pada malam hari tanpa gerakan
analogWrite(Relay1, brightnessLevel1); // Atur kecerahan Relay1 (50% brightness)
analogWrite(Relay2, 0); // Matikan Relay2
moveStepper(200); // Gerakkan motor ke posisi 200 langkah
updateLCDStatus("ON ", "OFF ", "OFF ", "ON");
} else if (isNight && pir1Active) {
// Lampu menyala pada malam hari dengan gerakan
analogWrite(Relay1, 0); // Matikan Relay1
analogWrite(Relay2, brightnessLevel2); // Atur kecerahan Relay2 (100% brightness)
updateLCDStatus("OFF ", "ON ", "ON ", "OFF");
} else {
// Lampu mati pada siang hari
analogWrite(Relay1, 0); // Matikan Relay1
analogWrite(Relay2, 0); // Matikan Relay2
moveStepper(0); // Gerakkan motor ke posisi 0 langkah
updateLCDStatus("OFF", "OFF ", "OFF", "ON");
}
delay(1000); // Tunggu 1 detik sebelum melakukan loop lagi
}
void moveStepper(int targetPosition) {
if (currentPosition < targetPosition) {
while (currentPosition < targetPosition) {
stepper.step(-1); // Gerakkan stepper 1 langkah searah jarum jam
currentPosition++;
delay(5); // Tunda untuk menghindari gerakan yang terlalu cepat
}
} else if (currentPosition > targetPosition) {
while (currentPosition > targetPosition) {
stepper.step(1); // Gerakkan stepper 1 langkah berlawanan arah jarum jam
currentPosition--;
delay(5); // Tunda untuk menghindari gerakan yang terlalu cepat
}
}
}
void updateLCDStatus(String relay1Status, String relay2Status, String PIRStatus, String MTRStatus) {
lcd.setCursor(5, 2);
lcd.print(relay1Status);
lcd.setCursor(5, 3);
lcd.print(MTRStatus);
lcd.setCursor(15, 2);
lcd.print(relay2Status);
lcd.setCursor(15, 3);
lcd.print(PIRStatus);
}