Here is the process flow of the Xtreme Defender
And here is the full code of this project (arduino sketch)
/*
* Copyright (C) 2016 Samarth Gupta
* Project Title: Xtreme Defender - Home Security System
* Author: Samarth Gupta
* Started Date: 15/4/16
* Project Sponsored by - www.samteck.net
* Version: 1.0
*/
/////////////////////////////////////////////////////////////////////////
#include<LiquidCrystal.h>
#include<Wire.h>
#include<Password.h>
#include<Keypad.h>
#include<Servo.h>
#include "RTClib.h"
//-----Declaring Global Variables-----//
//Keypad
Password password = Password("1234"); //Delared the password for system
const byte ROWS = 4; //Delared the number of rows in keypad
const byte COLS = 4; //Delared the number of colums in keypad
char keys[ROWS][COLS] = { {'1','2','3','A'}, //telling the arduino about the keys of keypad
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'} };
byte rowPins[ROWS] = {46,47,48,49}; //Rows pins connection to Arduino
byte colPins[COLS] = {50,51,52,53}; //Columns pins connection to Arduino
Keypad keypad = Keypad(makeKeymap(keys),rowPins,colPins,ROWS,COLS); //Making the keypad object
//Servo
Servo myservo;
int pos = 90; //initial position of servo at Right angle
//Real time Clock
RTC_DS1307 RTC;
//LCD Display
LiquidCrystal lcd(7,8,9,10,11,12); //Assigning the various pins of LCD to Arduino
int passwd_pos = 15; //password position on the LCD
//Notifications LED
int redPin = 29; //connect red pin of LED to pin no. 29 on arduino
int bluePin = 31; //connect blue pin of LED to pin no. 31 on arduino
int ledDelay = 50;//delay the led time by 50ms
//Staus Light
int greenLED = 37; //connect green LED to pin no. 37 on arduino
int redLED = 38; //connect red LED to pin no. 38 on arduino
//PIR Sensors
int pirPin1 = 39; //connect pir 1 to pin no 39 in arduino
int pirPin2 = 34; //connect pir 2 to pin no 34 in arduino
//Door Switches
int door1 = 41; //door 1 switch is connected to pin no 41 on arduino
int door2 = 42; //door 2 switch is connected to pin no 42 on arduino
//Speaker
int speakerPin = 35; //alaram speaker is connected to pin no 35;
//Blue anbient light Relay connection
int relay = 4; //Connect pin 4 of arduino to realy board
//Other variables
int alarmStatus = 0; //setting these variables to 0
int zone = 0;
int alarmActive = 0;
//-----Beginning setup Function-----//
void setup(){
Serial.begin(9600); //send data to computer via serial communication at 9600bps
lcd.begin(20, 4); //Telling the size of the LCD by samteck
Wire.begin(); //Setting up I2C communication with Arduino
RTC.begin(); //Start getting time form RTC module
RTC.adjust(DateTime(__DATE__,__TIME__));//Set the time on RTC to compile time
myservo.attach(2); // attaches the servo on pin 2 to the servo object
myservo.write(pos);
//setting up pin modes of LED Lights
pinMode(redPin,OUTPUT);
pinMode(bluePin,OUTPUT);
pinMode(redLED,OUTPUT);
pinMode(greenLED,OUTPUT);
pinMode(speakerPin,OUTPUT);
pinMode(relay,OUTPUT);
//setting pinmode of sensors and switches
pinMode(pirPin1,INPUT); //Bedroom 1
pinMode(pirPin2,INPUT); //Garage
pinMode(door1,INPUT); //Front door
pinMode(door2,INPUT); //Back door
digitalWrite(redLED,LOW);
digitalWrite(greenLED,HIGH);
digitalWrite(speakerPin,LOW);
digitalWrite(relay,HIGH);
digitalWrite(pirPin1,LOW);
digitalWrite(pirPin2,LOW);
calibration(); //call the calibration function to PIR initialization
displayCodeEntryScreen(); //display the starting screen
keypad.addEventListener(keypadEvent); //add an event listener for this keypad
}
//-----Beginning loop Function-----//
void loop(){
DateTime now = RTC.now(); //take current time and date from RTC module
digitalWrite(redPin,HIGH);
digitalWrite(bluePin,HIGH);
//Setting the date and time
lcd.setCursor(0,1);
lcd.print(now.day(),DEC);
lcd.print('/');
lcd.print(now.month(),DEC);
lcd.print('/');
lcd.print(now.year(),DEC);
lcd.print(' ');
lcd.setCursor(13,1);
lcd.print(now.hour(),DEC);
lcd.print(':');
lcd.setCursor(16,1);
lcd.print(now.minute(),DEC);
keypad.getKey(); //get key press from keypad
if(alarmActive==1){
if(digitalRead(pirPin1)==HIGH)
{
zone=0;
alarmTriggered();
}
if(digitalRead(door2)==LOW)
{
zone=1;
alarmTriggered();
}
if(digitalRead(door1)==LOW)
{
zone=2;
alarmTriggered();
}
if(digitalRead(pirPin2)==HIGH)
{
zone=3;
alarmTriggered();
}
}
}
////////////// Here comes Functions ////////////////
void keypadEvent(KeypadEvent eKey){
switch(keypad.getState()){
case PRESSED:
if(passwd_pos - 15 >=5){
return;
}
lcd.setCursor((passwd_pos++),0);
switch(eKey){
case '#':
passwd_pos=15;
checkPassword();
break;
case '*':
password.reset();
passwd_pos=15;
break;
default:
password.append(eKey);
lcd.print("*");
}
}
}
void checkPassword(){ //to check if correct pin is entered or not
if(password.evaluate()){
if(alarmActive==0 && alarmStatus==0){
activate();
}
else if(alarmActive==1 || alarmStatus==1){
deactivate();
}
}
else{
invalidCode();
}
}
void activate(){ //to activate the system if correct pin is entered
if((digitalRead(door1)==HIGH) && (digitalRead(door2)==HIGH)){
digitalWrite(redLED,HIGH);
digitalWrite(greenLED,LOW);
digitalWrite(2,HIGH);
lcd.setCursor(0,0);
lcd.print("SYSTEM ACTIVE !!!!!");
alarmActive=1;
password.reset();
delay(2000);
}
else{
if(digitalRead(door1)==LOW && digitalRead(door2)==LOW){
lcd.clear();
lcd.setCursor(0,1);
lcd.print(" BOTH Door Open ");
lcd.setCursor(0,2);
lcd.print("Close & Reactivate");
}
else if(digitalRead(door1)==LOW){
lcd.clear();
lcd.setCursor(0,1);
lcd.print(" FRONT Door Open ");
lcd.setCursor(0,2);
lcd.print("Close & Reactivate");
}
else{
lcd.clear();
lcd.setCursor(0,1);
lcd.print(" BACK Door Open ");
lcd.setCursor(0,2);
lcd.print("Close & Reactivate");
}
delay(2000);
deactivate(); //if door are open then system will not activate
}
}
void deactivate(){ // to deacivate the system
alarmStatus=0;
digitalWrite(redLED,LOW);
digitalWrite(greenLED,HIGH);
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" SYSTEM DEACTIVATED!");
digitalWrite(speakerPin,LOW);
alarmActive=0;
password.reset();
delay(5000);
digitalWrite(relay,HIGH);
displayCodeEntryScreen(); //basically restarts the system
}
void displayCodeEntryScreen(){ //show up the first screen on the boot
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Enter PIN:");
lcd.setCursor(0,2);
lcd.print("Home Security System");
lcd.setCursor(0,3);
lcd.print("By Samarth,-SamTeck-");
}
void invalidCode(){ //display when invalid code is entered
password.reset();
lcd.clear();
lcd.setCursor(1,0);
lcd.print("INVALID CODE! LOL!");
lcd.setCursor(5,2);
lcd.print("TRY AGAIN!");
digitalWrite(greenLED,LOW);
digitalWrite(redLED,HIGH);
delay(2000);
digitalWrite(redLED,LOW);
delay(1000);
displayCodeEntryScreen();
}
void alarmTriggered(){ //this function is called whenever input is received on any of the sensor
int expected_pos;
int incr;
digitalWrite(speakerPin,HIGH);
digitalWrite(relay,LOW);
digitalWrite(redPin,HIGH);
digitalWrite(bluePin,LOW);
password.reset();
alarmStatus=1;
lcd.clear();
lcd.setCursor(0,2);
lcd.print(" SYSTEM TRIGGERED ");
lcd.setCursor(0,4);
if(zone==0)
{
expected_pos=95;
lcd.print("Motion in Bedroom 1 ");
delay(1000);
}
else if(zone==1)
{
expected_pos=60;
lcd.print(" Back Door Open");
delay(1000);
}
else if(zone==2)
{
expected_pos=70;
lcd.print(" Front Door Open");
delay(1000);
}
else if(zone==3)
{
expected_pos=10;
lcd.print(" Motion in Garage ");
delay(1000);
}
//setting up position for Servo motor
if(expected_pos > pos)
incr=1;
else
incr=-1;
for(pos=pos; pos != expected_pos; pos += incr)
{
myservo.write(pos);
delay(5);
}
StrokeLight();
}
void StrokeLight(){ //Stroke LED Lights
digitalWrite(redPin, HIGH); // turn the red light on
delay(ledDelay); // wait 50 ms
digitalWrite(redPin, LOW); // turn the red light off
delay(ledDelay); // wait 50 ms
digitalWrite(redPin, HIGH); // turn the red light on
delay(ledDelay); // wait 50 ms
digitalWrite(redPin, LOW); // turn the red light off
delay(ledDelay); // wait 50 ms
digitalWrite(redPin, HIGH); // turn the red light on
delay(ledDelay); // wait 50 ms
digitalWrite(redPin, LOW); // turn the red light off
delay(ledDelay); // wait 50 ms
delay(10); // delay midpoint by 100ms
digitalWrite(bluePin, HIGH); // turn the blue light on
delay(ledDelay); // wait 50 ms
digitalWrite(bluePin, LOW); // turn the blue light off
delay(ledDelay); // wait 50 ms
digitalWrite(bluePin, HIGH); // turn the blue light on
delay(ledDelay); // wait 50 ms
digitalWrite(bluePin, LOW); // turn the blue light off
delay(ledDelay); // wait 50 ms
digitalWrite(bluePin, HIGH); // turn the blue light on
delay(ledDelay); // wait 50 ms
digitalWrite(bluePin, LOW); // turn the blue light off
delay(ledDelay); // wait 50 ms
}
void calibration(){
int i=0;
lcd.clear();
lcd.setCursor(5,0);
lcd.print("WELCOME TO");
lcd.setCursor(0,1);
lcd.print("Xtreme Defender 666");
lcd.setCursor(0,2);
lcd.print(" A Fully Automated ");
lcd.setCursor(0,3);
lcd.print("Home Security System");
delay(5000);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("LOADING BOOTSTRAP");
lcd.setCursor(0,1);
for(i=0;i<20;i++){
lcd.print(".");
delay(150);
}
lcd.setCursor(0,2);
lcd.print("LOADING NCC. FILES");
lcd.setCursor(0,3);
for(i=0;i<20;i++){
lcd.print(".");
delay(100);
}
delay(1000);
for(i=0;i<=100;i++){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Initializing .......");
lcd.setCursor(0,1);
lcd.print("PIR Sensors");
lcd.setCursor(0,2);
lcd.print(i);
lcd.print("%");
delay(50);
}
lcd.setCursor(8,2);
lcd.print("--OK DONE--");
delay(500);
lcd.setCursor(0,3);
lcd.print("LOADING START SCREEN");
delay(1500);
}