#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Servo.h>
// Deklarasi pin dan objek
const int ldrPin = A0; // Pin analog untuk sensor LDR
const int greenLed = 3; // LED Hijau
const int redLed = 5; // LED Merah
const int yellowLed = 4; // LED Kuning
const int buttonLock = 11; // Tombol Lock
const int buttonUnlock = 12; // Tombol Unlock
Servo myServo; // Servo motor
LiquidCrystal_I2C lcd(0x27, 16, 2); // LCD I2C dengan alamat 0x27
bool isLocked = false; // Status terkunci
// Variabel debounce
unsigned long lastDebounceTime = 0;
unsigned long debounceDelay = 50;
void setup() {
// Inisialisasi pin I/O
pinMode(greenLed, OUTPUT);
pinMode(redLed, OUTPUT);
pinMode(yellowLed, OUTPUT);
pinMode(buttonLock, INPUT_PULLUP);
pinMode(buttonUnlock, INPUT_PULLUP);
// Inisialisasi servo dan LCD
myServo.attach(8); // Servo terhubung ke pin 8
myServo.write(0); // Servo di posisi awal (tertutup)
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("System Ready"); // Tampilan awal
delay(2000);
lcd.clear();
}
void loop() {
// Membaca tombol Lock dan Unlock dengan debounce
if (digitalRead(buttonLock) == LOW && (millis() - lastDebounceTime) > debounceDelay) {
isLocked = true;
lastDebounceTime = millis();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Locked"); // Teks ringkas
delay(1000);
}
if (digitalRead(buttonUnlock) == LOW && (millis() - lastDebounceTime) > debounceDelay) {
isLocked = false;
lastDebounceTime = millis();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Unlocked"); // Teks ringkas
delay(1000);
}
if (isLocked) {
// Jika sistem terkunci
digitalWrite(greenLed, LOW);
digitalWrite(redLed, LOW);
digitalWrite(yellowLed, LOW);
myServo.write(0); // Servo di posisi tertutup
lcd.setCursor(0, 1);
lcd.print("LOCKED MODE ");
return; // Keluar dari loop jika terkunci
}
// Membaca nilai LDR
int ldrValue = analogRead(ldrPin);
// Konversi nilai LDR menjadi persentase (0 - 100%) secara terbalik
int brightness = map(ldrValue, 0, 1023, 100, 0); // Intensitas ke persentase terbalik (0-100%)
// Membaca posisi servo
int servoAngle;
// Logika berdasarkan intensitas cahaya
String lightStatus; // Menyimpan status cahaya
if (brightness <= 20) { // Cahaya sangat gelap
servoAngle = 0; // Servo tertutup
digitalWrite(greenLed, LOW);
digitalWrite(redLed, HIGH);
digitalWrite(yellowLed, LOW);
lightStatus = "Dark";
} else if (brightness > 20 && brightness <= 60) { // Cahaya sedang
servoAngle = 45; // Servo setengah buka
digitalWrite(greenLed, LOW);
digitalWrite(redLed, LOW);
digitalWrite(yellowLed, HIGH);
lightStatus = "Normal";
} else { // Cahaya terang
servoAngle = 90; // Servo terbuka penuh
digitalWrite(greenLed, HIGH);
digitalWrite(redLed, LOW);
digitalWrite(yellowLed, LOW);
lightStatus = "Bright";
}
myServo.write(servoAngle); // Mengatur posisi servo
// Menampilkan data di LCD dengan format yang memperbaiki teks sebelumnya
lcd.setCursor(0, 0);
lcd.print("Chy:"); // Cahaya (brightness)
lcd.print(brightness); // Persentase cahaya
lcd.print("% Srv:"); // Spasi dan label servo
lcd.print(servoAngle); // Sudut servo
lcd.print(" "); // Tambahkan spasi untuk menghapus teks lama
lcd.setCursor(0, 1);
lcd.print("Stat:"); // Menampilkan status cahaya
lcd.print(lightStatus); // Menampilkan status cahaya
lcd.print(" "); // Tambahkan spasi untuk menghapus teks lama
delay(500); // Delay untuk stabilitas pembacaan sensor
}