/* ------
| Alat Pendeteksi Pergerakan Manusia Dalam Ruangan (anti-theft)
| by Wildan,
| NusaBot Batch #5
| [email protected]
| 19 Nov 2022
------- */
#include <LiquidCrystal_I2C.h> //untuk menambahkan library LCD
LiquidCrystal_I2C lcd(0x27, 20, 4); //object dari library LiquidCrystal_I2C.h
#define pinRedLED 11 //konst utk pin yg akan digunakan RGB LED (red) yaitu pin 11 pwm arduino
#define pinGreenLED 10 //konst utk pin yg akan digunakan RGB LED (green) yaitu pin 10 pwm arduino
#define pinBlueLED 9 //konst utk pin yg akan digunakan RGB LED (blue) yaitu pin 9 pwm arduino
#define pinPIR1 2 //konst utk pin yg akan digunakan sensor PIR1 yaitu pin 2
#define pinPIR2 7 //konst utk pin yg akan digunakan sensor PIR2 yaitu pin 7
#define pinBuzz 4 //konst utk pin yg akan digunakan Buzzer yaitu pin 4
int valPIR1; //var utk value yg dihasilkan dari sensor PIR 1 atau 0, HIGH atau LOW
int valPIR2; //var nyimpen value dari hasil sensor PIR 2
int alertRoom1, alertRoom2, bothRoom; //var utk menyimpan nilai di setiap kondisi berbeda
String alarmStat, warnStat = "NA"; //var untuk status alarm
void setup() { // put your setup code here, to run once:
pinMode(pinRedLED, OUTPUT); //set pin arduino yg akan digunakan led rgb (red)
pinMode(pinGreenLED, OUTPUT); //set pin arduino yg akan digunakan led rgb (green)
pinMode(pinBlueLED, OUTPUT); //set pin arduino yg akan digunakan led rgb (blue)
pinMode(pinPIR1, INPUT); //set pin input sensor PIR 1
pinMode(pinPIR2, INPUT); //set pin input sensor PIR 2
lcd.init(); //inisialisasi lcd
}
void loop() { // put your main code here, to run repeatedly:
valPIR1 = digitalRead(pinPIR1); //baca nilai pada sensor PIR 1, 1 = pergerakan terdeteksi, 0 = tidak ada pergerakan terdeteksi sensor
valPIR2 = digitalRead(pinPIR2); //baca nilai pada sensor PIR 2, 1 = pergerakan terdeteksi, 0 = tidak ada pergerakan terdeteksi sensor
if(warnStat == "active"){ //jika warnStat bernilai "active" jalankan program dibawah, jika tidak, lewati
lcd.clear(); //hapus text lcd
warnStat = "notActive"; //isi warnStat jadi "notActive"
}
//kondisi ketika salah satu atau kedua sensor PIR mendeteksi pergerakan (bernilai 1)
if(valPIR1 == 1 || valPIR2 == 1){ //Jika kondisi sesuai maka jalankan program dibawah
lcd.backlight(); //nyalain backlight lcd
// Tampilkan di LCD
lcd.setCursor(0, 0); //set posisi text
lcd.print("ADA SESEORANG"); //tampilkan teks ke lcd
//kondisi ketika sensor PIR 1 (RUANG TAMU) mendeteksi pergerakan manusia
if(valPIR1 == 1 && valPIR2 == 0) { //jika value PIR1 adalah 1 dan PIR2 adalah 0, jalankan program dibawah
if(alertRoom2 == 1 || bothRoom == 1){ //cek kondisi salah satu apakah bernilai 1, jika ya jalankan program dibawah
lcd.clear(); //hapus text lcd
alertRoom2 = 0; //isi var
bothRoom = 0;
}
lcd.setCursor(0, 1); //tampilkan text sesuai posisi, di lcd
lcd.print("DI RUANG TAMU GES!");
alertRoom1 = 1;
//kondisi ketika sensor PIR 2 (RUANG BRANGKAS) mendeteksi pergerakan manusia
}else if(valPIR1 == 0 && valPIR2 == 1){ //jika PIR1 bernilai 0 dan PIR2 bernilai 1, jalankan program dibawah
if(alertRoom1 == 1 || bothRoom == 1){
lcd.clear();
alertRoom1 = 0;
bothRoom = 0;
}
lcd.setCursor(0, 1);
lcd.print("DI BRANGKAS GES!");
alertRoom2 = 1;
//kondisi ketika sensor PIR 1 dan PIR 2 (RUANG TAMU & BRANGKAS) mendeteksi pergerakan
}else if(valPIR1 == 1 && valPIR2 == 1){ //jika kondisi terpenuhi jalankan program dibawah
if(alertRoom1 == 1 || alertRoom2 == 1){
lcd.clear();
alertRoom1 = 0;
alertRoom2 = 0;
}
lcd.setCursor(0, 1);
lcd.print("DI RUANG TAMU");
lcd.setCursor(0, 2);
lcd.print("DAN BRANKAS GES!");
bothRoom = 1; //isi nilai 1 pada var bothRoom
}
RGB_LED(255,0,0); //nyalakan rgb led warna merah
tone(pinBuzz, 4000, 100); // bunyikan buzzer 4000Hz selama 0.100 detik
delay(50);
RGB_LED(0,0,0); //matikan rgb led
delay(150);
alarmStat = "triggered"; //agar menandakan bahwa sensor telah mendeteksi pergerakan
//kondisi ketika sensor PIR telah mendeteksi pergerakan tetapi sekarang sudah tidak lagi
}else if ((valPIR1 == 0 || valPIR2 == 0) && alarmStat == "triggered"){ //jika sensor tidak mendeteksi pergerakan (value=0) dan alarmStat berisi triggered, jalankan program dibawah
if(alertRoom1 == 1 || alertRoom2 == 1 || bothRoom == 1){ //cek kondisi, jalankan program dibawah jika benar
lcd.clear();
alertRoom1 = alertRoom2 = bothRoom = 0;
}
lcd.setCursor(0, 0);
lcd.print("SESORANG TELAH");
lcd.setCursor(0, 1);
lcd.print("TERDETEKSI MASUK!");
//nyalakan lampu kuning kedap kedip mode breathing
RGB_LED(255,255,0);
delay(300);
RGB_LED(200,200,0);
delay(300);
RGB_LED(150,150,0);
delay(300);
RGB_LED(100,100,0);
delay(300);
RGB_LED(50,50,0);
delay(300);
RGB_LED(5,5,0);
delay(300);
RGB_LED(50,50,0);
delay(300);
RGB_LED(100,100,0);
delay(300);
RGB_LED(150,150,0);
delay(300);
RGB_LED(200,200,0);
delay(300);
warnStat = "active"; //menandakan bahwa program telah masuk dalam kondisi warning lampu kuning, isi warnStat dengan "active"
}else{ //kondisi ketika tidak ada pergerakan terdeteksi oleh sensor PIR 1 dan 2 (kondisi awal/reset)
lcd.clear(); //hapus teks di LCD
lcd.noBacklight(); //matikan backlight LCD
RGB_LED(0,255,0); //nyalakan red RGB warna hijau
}
}
//function untuk RGB LED
void RGB_LED (int redLED, int greenLED, int blueLED) {
analogWrite(pinRedLED, redLED); //menuliskan nilai analog pada pin PWM 11 (red)
analogWrite(pinGreenLED, greenLED); //menuliskan nilai analog pada pin PWM 10 (green)
analogWrite(pinBlueLED, blueLED); ////menuliskan nilai analog pada pin PWM 9 (blue)
}