#include <LiquidCrystal.h> // LCD Screen
#include <Keypad.h> // Keypad
#include <IRremote.h> // IR remote
#include <Servo.h> // Servo
#include <math.h>
// define pi
#define pi M_PI
// Motion Sensor Setup
const int moInPin = 16; // motion sensor pin
int moState;
bool doDoor = true; // listen to door command
// LCD Screen Setup
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);
// IR signal pin connected to pin 15
const int RECV_PIN = 15;
//key pad setup
const byte KEYPAD_ROWS = 4;
const byte KEYPAD_COLS = 4;
byte rowPins[KEYPAD_ROWS] = {53, 51, 49, 47};
byte colPins[KEYPAD_COLS] = {52, 50, 48, 46};
char keys[KEYPAD_ROWS][KEYPAD_COLS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, KEYPAD_ROWS, KEYPAD_COLS);
// Servo setup
Servo gServo;
// Buzzer setup
const int buz = 17;
// variables
bool armed = true;
char key;
char request = -1;
char remotePress[] = {'p','1','2','3','4','5','6','7','8','9','m'}; // p for power button, m for menu button
bool doorState = false; // true for open, false for closed
bool doorSleep = true; // prevents door moving on startup
bool doMove = true;
// passkey string
String passkey = "1234";
String temp;
// Remote Button array {button value} (IR remote)
unsigned long button[] = {1570963200,3476094720,3877175040,2239430400,4010868480,3342401280,2774204160,3175284480,3041591040,2907897600,501415680};
unsigned long currentBut = 0;
void setup(){
Serial.begin(9600);
lcd.begin(16, 2);
lcd.setCursor(0, 0);
IrReceiver.begin(RECV_PIN); // setup and assign receive pin
gServo.attach(42);
pinMode(buz, OUTPUT);
pinMode(moInPin, INPUT);
pinMode(18, OUTPUT);
// Startup Sequence
lcd.println("Starting ");
Serial.println("Setup Complete");
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Alarm On ");
}
void loop(){
// keypad use
key = keypad.getKey();
if (key){ // keypad test
switch(key){
case 'A':
break;
case 'B':
break;
case 'C':
break;
case 'D':
break;
case '*':
armed = true;
lcd.setCursor(0,0);
lcd.print("Alarm On ");
if (doorState == true){
doMove = true;
doorState = false;
}
Serial.println(armed);
digitalWrite(buz, HIGH);
delay(100);
digitalWrite(buz, LOW);
break;
case '#':
if (armed == false){
doMove = true;
doorState = !doorState;
}
break;
default:
temp += key;
}
}
// remote use
if (IrReceiver.decode() == 1){
currentBut = IrReceiver.decodedIRData.decodedRawData;
// command lookup
for (int i = 0; i < 11; i++){
if (currentBut == button[i]){
request = remotePress[i];
}
}
// command excute
switch(request){
case 'p':
if (armed == false){
doMove = true;
doorState = !doorState;
}
break;
case 'm':
armed = true;
lcd.setCursor(0,0);
lcd.print("Alarm On ");
if (doorState == true){
doMove = true;
doorState = false;
}
Serial.println(armed);
digitalWrite(buz, HIGH);
delay(100);
digitalWrite(buz, LOW);
break;
default:
temp += request;
}
delay(500);
IrReceiver.resume();
}
if (temp.length() == 4){
Serial.println(temp);
if (temp == passkey){
armed = false;
lcd.setCursor(0,0);
lcd.print("Alarm Off ");
Serial.println(armed);
digitalWrite(18, LOW);
noTone(buz);
}
temp = "";
}
if (doMove == true){
lcd.setCursor(0,1);
if (doorState == true){ // Open door
lcd.print("Door Open ");
for (float i = 30; i <= 120; i++){
int j = floor(55*atan((i-75)/13)*2/pi+75.5);
gServo.write(j);
delay(11);
}
}
if (doorState == false){ // Close door
lcd.print("Door Closed ");
for (float i = 120; i >= 30; i--){
int j = floor(55*atan((i-75)/13)*2/pi+75.5);
gServo.write(j);
delay(11);
}
}
doMove = false; // set move to false
}
if (armed == true){
moState = digitalRead(moInPin);
if( moState > 0){
Serial.println("Motion Detected!");
digitalWrite(buz, HIGH);
delay(250);
digitalWrite(buz, LOW);
delay(250);
}
}
}