#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include "pitches.h"
#include "DHT.h"
#define DHTPIN 29
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
#define I2C_ADDR 0x27
#define LCD_COLUMNS 20
#define LCD_LINES 4
int led_state;
volatile int pir_1_state;
volatile int pir_2_state;
int mute_butt=40;
unsigned long currentMillis_sec_1 = 0;
unsigned long prev_millis_sec_1 = 0;
unsigned long period_sec_1 = 100;
unsigned long currentMillis_sec_2 = 0;
unsigned long prev_millis_sec_2 = 0;
unsigned long period_sec_2 = 100;
unsigned long start_count_1;
unsigned long start_count_2;
unsigned long dect_time_1;
unsigned long dect_time_2;
unsigned long diff_sens;
int pir_1_read_stat=0;
int pir_1_prev_read_stat=0;
int pir_2_read_stat=0;
int pir_2_prev_read_stat=0;
int pin_led_green=5;
int pin_led_red=6;
int pin_led_yellow=7;
int pir_sec_1=51;
int pir_sec_2=53;
int reset_button=23;
int alarm_switch_1=22;
int alarm_switch_2=24;
int pot_pin=A8;
int SPEAKER_PIN=13;
const int Tones[] ={
NOTE_C4, NOTE_D4, NOTE_E4, NOTE_F4,
NOTE_G4, NOTE_A4, NOTE_B4, NOTE_C5
};
LiquidCrystal_I2C lcd(I2C_ADDR, LCD_COLUMNS, LCD_LINES);
void setup() {
Serial.begin(9600);
dht.begin();
pinMode(SPEAKER_PIN, OUTPUT);
pinMode(pin_led_green,OUTPUT);
pinMode(pin_led_red,OUTPUT);
pinMode(pin_led_yellow,OUTPUT);
pinMode(pot_pin,INPUT);
pinMode(pir_sec_1,INPUT);
pinMode(pir_sec_2,INPUT);
pinMode(reset_button,INPUT);
pinMode(alarm_switch_1,INPUT);
pinMode(alarm_switch_2,INPUT);
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Time: ");
lcd.setCursor(8, 0);
lcd.print("MODE: ");
lcd.setCursor(10, 1);
lcd.print("MOTION IN: ");
noTone(SPEAKER_PIN);
}
void pot_read(){
period_sec_1=period_sec_2=map(analogRead(pot_pin),0,1023,1,10)*1000;
lcd.setCursor(6, 0);
lcd.print(" ");
lcd.setCursor(5, 0);
lcd.print(period_sec_1/1000);
}
void alarms_spound() {
for (int i=0; i<=7; i++){
tone(SPEAKER_PIN, Tones[i]);
delay(15);
noTone(SPEAKER_PIN);}
for (int i=7; i<=0; i--){
tone(SPEAKER_PIN, Tones[i]);
delay(15);
noTone(SPEAKER_PIN);}
}
void alarm_in_sec_1() {
if (digitalRead(pir_sec_1)==HIGH) {
//if (digitalRead(mute_butt)==0) {alarms_spound();}
pir_1_state=1; start_count_1=millis();digitalWrite(pin_led_green,HIGH);
if (digitalRead(alarm_switch_1)==HIGH){digitalWrite(pin_led_yellow,HIGH);}
}
if (millis()-start_count_1>=period_sec_1 && pir_1_state==1) {
digitalWrite(pin_led_green,LOW);
digitalWrite(pin_led_yellow,LOW);
pir_1_state=0;
}
}
void alarm_in_sec_2() {
if (digitalRead(pir_sec_2)==HIGH) {
//if (digitalRead(mute_butt)==0) {alarms_spound();}
pir_2_state=1; start_count_2=millis();digitalWrite(pin_led_red,HIGH);
if (digitalRead(alarm_switch_1)==HIGH){digitalWrite(pin_led_yellow,HIGH);}
}
if (millis()-start_count_2>=period_sec_2 && pir_2_state==1) {
digitalWrite(pin_led_red,LOW);
digitalWrite(pin_led_yellow,LOW);
pir_2_state=0;
}
}
void reset_alarms(){
if(digitalRead(reset_button)==HIGH) {
pir_1_state=0;
pir_2_state=0;
digitalWrite(pin_led_red,LOW);
digitalWrite(pin_led_yellow,LOW);
digitalWrite(pin_led_green,LOW);}
}
void loop() {
if (digitalRead(alarm_switch_1)==HIGH){
lcd.setCursor(13, 0);
lcd.print("BOTH ");}
else {
lcd.setCursor(13, 0);
lcd.print("SINGLE");}
pot_read();
alarm_in_sec_1();
alarm_in_sec_2();
reset_alarms();
/* if (pir_1_state==1&&pir_2_state==1){lcd.setCursor(0, 2); lcd.print("SECTOR 1, SECTOR 2");} else{
if (pir_1_state==1){lcd.setCursor(0, 2); lcd.print("SECTOR 1 ");}
if (pir_2_state==1){lcd.setCursor(0, 2); lcd.print("SECTOR 2 ");}}
if (pir_1_state==0&&pir_2_state==0){lcd.setCursor(0, 2); lcd.print(" ");}*/
if (digitalRead(pir_sec_1)==1&&digitalRead(pir_sec_2)==1){lcd.setCursor(0, 2); lcd.print("SECTOR 1, SECTOR 2");} else{
if (digitalRead(pir_sec_1)==1){lcd.setCursor(0, 2); lcd.print("SECTOR 1 ");}
if (digitalRead(pir_sec_2)==1){lcd.setCursor(0, 2); lcd.print("SECTOR 2 ");}}
if (digitalRead(pir_sec_1)==0&&digitalRead(pir_sec_2)==0){lcd.setCursor(0, 2); lcd.print(" ");}
if (pir_1_prev_read_stat==!digitalRead(pir_sec_1)&&digitalRead(pir_sec_1)==1){
dect_time_1=millis();
Serial.println(dect_time_1);
}
pir_1_prev_read_stat=digitalRead(pir_sec_1);
if (pir_2_prev_read_stat==!digitalRead(pir_sec_2)&&digitalRead(pir_sec_2)==1){
dect_time_2=millis();
Serial.println(dect_time_2);
}
pir_2_prev_read_stat=digitalRead(pir_sec_2);
if (dect_time_1>=dect_time_2&&dect_time_1>0&&dect_time_2>0) {diff_sens=dect_time_1-dect_time_2;}
if (dect_time_1<dect_time_2&&dect_time_1>0&&dect_time_2>0) {diff_sens=dect_time_2-dect_time_1;}
diff_sens=diff_sens/1000;
lcd.setCursor(0, 1);
lcd.print("D:");
if (diff_sens>0) {lcd.print(diff_sens);}
if (digitalRead(pir_sec_1)==0){dect_time_1=0; lcd.setCursor(0, 1);lcd.print("D: ");}
if (digitalRead(pir_sec_2)==0){dect_time_2=0;lcd.setCursor(0, 1);lcd.print("D: ");}
lcd.setCursor(0, 3);
lcd.print("T:");
lcd.setCursor(2, 3);
lcd.print(dht.readTemperature());
lcd.print("C");
lcd.setCursor(12, 3);
lcd.print("H:");
lcd.setCursor(14, 3);
lcd.print(dht.readHumidity());
lcd.print("%");
}