#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
//define pin
int pirSensPin = 2;
int ldrSensPin = A0;
int pirState = 0;
int ldrVal = 0;
int ledPin = 3;
int ledPinLDR = 4;
int ledPinPIR = 7;
bool stateLamp = false;
void setup() {
//inisialisasi
Serial.begin(9600);
pinMode(pirSensPin, INPUT);
pinMode(ldrSensPin, INPUT);
pinMode(ledPin, OUTPUT);
pinMode(ledPinLDR, OUTPUT);
pinMode(ledPinPIR, OUTPUT);
lcd.init();
lcd.backlight();
}
//fungsi nyalakan lampu
void NyalakanLampu()
{
stateLamp = true;
digitalWrite(ledPin, HIGH);
}
//fungsi matikan lampu
void MatikanLampu()
{
stateLamp = false;
digitalWrite(ledPin, LOW);
}
unsigned long terakhirAktif = 0;
const unsigned long jedaMati = 5000;
void loop() {
// put your main code here, to run repeatedly:
pirState = digitalRead(pirSensPin); //baca sensor PIR
ldrVal = analogRead(ldrSensPin); //baca sensor LDR
bool malam = ldrVal > 500; //cek apakah malam
digitalWrite(ledPinLDR, malam ? HIGH : LOW); //indikator sensor PIR
digitalWrite(ledPinPIR, pirState == HIGH ? HIGH : LOW); //indikator sensor LDR
// LCD
lcd.setCursor(0,0);
lcd.print("Cahaya: ");
lcd.setCursor(8,0);
lcd.print(ldrVal); //cetak intensitas cahaya
lcd.print(" CDL");
lcd.setCursor(0,1);
lcd.print("Gerak? ");
lcd.setCursor(9,1);
lcd.print(pirState == HIGH ? "YA " : "TIDAK"); //cetak kondisi gerak
bool kondisiOn = (pirState == HIGH) || malam;
if (kondisiOn) { //cek kondisi
if (!stateLamp) { //apakah lampu tidak nyala
NyalakanLampu(); // nyalakan jika sebelumnya mati
}
terakhirAktif = millis(); // reset timer
}
else {
if (stateLamp) { //apakah lampu nyala
if (millis() - terakhirAktif >= jedaMati) {//apakah waktu melwati batas
MatikanLampu(); //matikan lampu setelah 5 detik
}
}
}
}