//Definisikan library
#include <LiquidCrystal_I2C.h> //Library LCD I2C
#define DEBUG
#ifdef DEBUG
#define debug(p) Serial.print(p)
#define debugln(p) Serial.println(p);
#endif
//Definisikan pin yang digunakan
#define LDR_PIN A0
#define PIR_PIN 3
#define LED_PIN 2
//Konfigurasi LCD I2C
LiquidCrystal_I2C lcd(0x27,20,4);
//Nilai lux untuk malam hari
float luxMalamHari = 10.;
//Variabel keadaan sensor PIR
int pirState = LOW;
//Fungsi untuk membaca nilai sensor LDR,
//@param void, @return float
float bacaLDR(){
// These constants should match the photoresistor's "gamma" and "rl10" attributes
const float GAMMA = 0.7;
const float RL10 = 50;
// Convert the analog value into lux value:
int analogValue = analogRead(LDR_PIN);
float voltage = analogValue / 1024. * 5;
float resistance = 2000 * voltage / (1 - voltage / 5);
float lux = pow(RL10 * 1e3 * pow(10, GAMMA) / resistance, (1 / GAMMA));
return lux;
}
//Mengupdate nilai tampilan flux untuk LCD
//@param flux, return void
void updateLCDLux(float lux){
//Tampilan baris pertama LCD
lcd.setCursor(0, 0);
lcd.print("Cahaya:");
if(lux >= luxMalamHari){
lcd.setCursor(7, 0);
lcd.print("TERANG");
} else {
lcd.setCursor(12, 0);
lcd.print(" ");
lcd.setCursor(7, 0);
lcd.print("GELAP");
}
//Tampilan baris kedua LCD
lcd.setCursor(0, 1);
lcd.print("lux:");
lcd.setCursor(4, 1);
lcd.print(lux);
}
void setup() {
//Atur mode pin yang digunakan
pinMode(LDR_PIN, INPUT); //input sensor
pinMode(PIR_PIN, INPUT); //input sensor
pinMode(LED_PIN, OUTPUT); //output LED
// initialize the lcd
lcd.init();
lcd.backlight();
Serial.begin(9600);
}
void loop() {
//Update nilai lux
float lux = bacaLDR();
updateLCDLux(lux);
//Membaca nilai sensor LDR
//Jika nilai sensor LDR untuk malam hari, maka program lanjut
if(lux >= luxMalamHari){
//Periksa apakah nilai input sensor PIR masih HIGH, jika LOW maka matikan LED
//walaupun di siang hari
if(!digitalRead(PIR_PIN)){
if (pirState == HIGH){
digitalWrite(LED_PIN, LOW);
pirState = LOW;
}
}
return;
}
//Membaca nilai sensor PIR
//Jika gerakan terdeteksi maka aktifkan led
if(digitalRead(PIR_PIN)){
if (pirState == LOW){
digitalWrite(LED_PIN, HIGH);
debugln("Gerakan Terdeteksi!!");
pirState = HIGH;
}
} else {
if (pirState == HIGH){
digitalWrite(LED_PIN, LOW);
debugln("Gerakan Tidak Terdeteksi!!");
pirState = LOW;
}
}
delay(100);
}