/*******************GSM SIM A7670C 5V MODULE BASED SECURITY SYSTEM***********************/
//HEADER FILES
#include <SoftwareSerial.h>
#include <EEPROM.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
/************************************************************************************/
//CONFIGURE DISPLAY AND SERIAL COMMUNICATION
SoftwareSerial mySerial(A0, A1); // These pins are connected to GSM module( RX, TX )
LiquidCrystal_I2C lcd(0x27, 16, 2); // set the LCD address to 0x3F for a 16 chars and 2 line disp
/************************************************************************************/
//INPUTS
#define MENU 5 // p down
#define UP 6 // p down
#define DOWN 7 // p down
#define SET 8 // p down
#define PIR 3 // p up
#define LS 4 // p up
#define keysw 2 // p up
//OUTPUTS
#define BUZZ A3
#define RLY A2
/************************************************************************************/
//VARIABLES AND ARRAYS DECLARATION
byte KVAL = 0;
byte m = 0;
byte n = 0;
byte a, b, i, indel, outdel, sms, numb, nomob, mobloc = 1, sirentime;
byte sv, hl, ll, col, row, digi;
byte col1, col2, col3, row1, row2, fn, ln;
byte k[51];
char buffer[10];
//char message1[5];
const unsigned long eventInterval = 10000;
unsigned long previousTime = 0;
const unsigned int MAX_MESSAGE_LENGTH = 12;
/************************************************************************************/
/************************************************************************************/
//CONTROLLER SETUP
void setup() {
mySerial.begin(9600);
pinMode(BUZZ, OUTPUT);
pinMode(RLY, OUTPUT);
lcd.init();
lcd.clear();
lcd.backlight(); // Make sure backlight is on
lcd.cursor();
lcd.blink();
lcd.print("LEE PRO DIGICARE");
lcd.setCursor(0, 1);
lcd.print("Security System");
/************************************************************************************/
for(i=0; i<=50; i++)
{
EEPROM.update(i, 0); // to be removed before final upload
}
/************************************************************************************/
readmemory();
digitalWrite(BUZZ, LOW);
digitalWrite(RLY, LOW);
//delay(30000); to initiated before fusing the program
mySerial.print("AT\r");
delay(1000);
mySerial.print("ATE0\r");
delay(1000);
mySerial.print("AT+CMGF=1\r");
delay(1000);
mySerial.print("AT+CMGD=4\r");
delay(1000);
mySerial.print("AT&W\r");
delay(1000);
lcd.clear();
}
/************************************************************************************/
//MAIN CODE
void loop() {
// put your main code here, to run repeatedly:
while (digitalRead(keysw) == 0) {
lcd.setCursor(0, 0);
lcd.print("SYSTEM ACTIVE");
lcd.setCursor(0, 1);
lcd.print("DEL OUT: ");
if (n == 0) {
mySerial.print("AT+CMGD=4\r"); //Deleting SMS Messages from Message Storage
for (i = 0; i <= outdel; i++) {
digitalWrite(BUZZ, HIGH);
delay(500);
digitalWrite(BUZZ, LOW);
delay(500);
sv = i;
showsv(9, 1, 1);
if (digitalRead(keysw) == 1) {
i = outdel + 1;
n = 1;
m = 1;
}
}
digitalWrite(BUZZ, LOW);
n = 1;
}
delay(1000);
if (digitalRead(keysw) == 1) {
m = 1;
}
if ((digitalRead(PIR) == 1 || digitalRead(LS) == 0) && m == 0 && digitalRead(keysw) == 0) {
lcd.setCursor(0, 0);
lcd.print("ALARM ACTIVATED");
if (indel == 1) {
digitalWrite(RLY, HIGH);
}
if (sms == 1) {
mobloc = 1;
lcd.setCursor(0, 1);
lcd.print("SENDING SMS");
sendsms();
delay(5000);
}
mobloc = 1;
lcd.setCursor(0, 1);
lcd.print("MAKING CALL");
makecall();
delay(5000);
//if ((digitalRead(PIR) == 1 || digitalRead(LS) == 0) && m == 0 && digitalRead(keysw) == 0)
if (m == 0 && digitalRead(keysw) == 0) {
if (indel > 1) {
lcd.setCursor(0, 1);
lcd.print("IN: ");
for (i = 0; i <= indel; i++) {
delay(1000);
sv = i;
showsv(10, 1, 1);
if (digitalRead(keysw) == 1) {
i = indel + 1;
m = 1;
}
}
digitalWrite(RLY, HIGH);
}
}
for (i = 0; i <= sirentime; i++) {
delay(1000);
if (digitalRead(keysw) == 1) {
i = sirentime + 1;
}
}
digitalWrite(RLY, LOW);
m = 1;
}
if (m == 1) {
lcd.setCursor(0, 1);
lcd.print("RESET THE ALARM");
}
signalstrength();
}
if (digitalRead(keysw) == 1) {
m = 1;
}
while (digitalRead(keysw) == 1) {
if (m == 1) {
lcd.setCursor(0, 0);
lcd.print("LEE PRO DIGICARE");
lcd.setCursor(0, 1);
lcd.print("SYSTEM OFF");
m = 0;
n = 0;
}
digitalWrite(RLY, LOW);
if (digitalRead(MENU) == 0) {
menu();
}
signalstrength();
}
}
/************************************************************************************/
//SENDING SMS
void sendsms() {
up1:
mobnum2();
mySerial.println("AT+CMGF=1");
delay(1000);
mySerial.print("AT+CMGS=\x22+91"); // 1)
for (i = fn; i <= ln; i++) {
mySerial.print(EEPROM.read(i));
}
mySerial.println("\x22\r");
delay(1000);
mySerial.print("ALARM ACTIVATED"); // 2) text content
delay(100);
mySerial.println((char)26); // 3)
if (mobloc < nomob) {
mobloc++;
} else mobloc = 6;
if (digitalRead(keysw) == 1) {
mobloc = 6;
}
if (mobloc != 6)
goto up1;
if (mobloc == 6)
return 1;
}
/************************************************************************************/
//MAKEING CALL
void makecall() {
up2:
mobnum2();
mySerial.println("AT+CVHU=0");
mySerial.print("ATD+91"); //Number to call
for (i = fn; i <= ln; i++) {
mySerial.print(EEPROM.read(i));
}
mySerial.println(";\r");
delay(25000); // wait for 25 seconds...
mySerial.println("ATH"); //Hang up the call
if (mobloc < nomob) {
mobloc++;
} else mobloc = 6;
if (digitalRead(keysw) == 1) {
mobloc = 6;
}
if (mobloc != 6)
goto up2;
if (mobloc == 6)
return 1;
}
/************************************************************************************/
//Signal Strength detection
void signalstrength() {
/* Updates frequently */
unsigned long currentTime = millis();
/* This is the event */
if (currentTime - previousTime >= eventInterval) {
/* Event code */
// display.setCursor(0, 50);
lcd.setCursor(0, 1);
mySerial.println("AT+CSQ\r");
delay(100);
while (mySerial.available() > 0) {
//Create a place to hold the incoming message
static char message[MAX_MESSAGE_LENGTH];
static unsigned int message_pos = 0;
//Read the next available byte in the serial receive buffer
char inByte = mySerial.read();
//Message coming in (check not terminating character) and guard for over message size
if (inByte != '\n' && (message_pos < MAX_MESSAGE_LENGTH - 1)) {
//Add the incoming byte to our message
message[message_pos] = inByte;
message_pos++;
}
//Full message received...
else {
//Add null character to string
message[message_pos] = '\0';
//Print the message (or do other things)
lcd.print(message);
//Reset for the next message
message_pos = 0;
}
}
/* Update the timing for the next time around */
previousTime = currentTime;
}
}
/************************************************************************************/
//MENU FUNCTION
void menu() {
lcd.clear();
lcd.print("Menu");
ensms();
delay(500);
lcd.clear();
indelaytime();
delay(500);
lcd.clear();
outdelaytime();
delay(500);
lcd.clear();
mobcount();
delay(500);
lcd.clear();
sirent();
delay(500);
lcd.clear();
mobloc = 1;
mobnum();
delay(2000);
//lcd.clear();
readmemory();
m = 1;
lcd.clear();
}
/************************************************************************************/
//ENABLE SMS
void ensms() {
sv = EEPROM.read(0);
lcd.setCursor(0, 0);
lcd.print("Enable SMS: ");
col = 10;
row = 1;
while (digitalRead(SET) == 1) {
dispyn(col, row);
if ((digitalRead(UP) == LOW)) //UPrement Button
{
delay_100();
sv = 1;
dispyes(col, row);
}
if (digitalRead(DOWN) == LOW) //DOWNrement Button
{
delay_100();
sv = 0;
dispno(col, row);
}
delay_100();
}
dispyn(col, row);
EEPROM.update(0, sv);
}
/************************************************************************************/
//INDELAY TIME FUNCTION
void indelaytime() {
sv = EEPROM.read(100);
lcd.setCursor(0, 0);
lcd.print("Timer In: ");
showsv(10, 1, 1);
hl = 240;
ll = 0;
col = 10;
row = 1;
digi = 1;
setval(hl, ll, col, row, digi);
EEPROM.update(100, sv);
}
/************************************************************************************/
//OUTDELAY TIME FUNCTION
void outdelaytime() {
sv = EEPROM.read(101);
lcd.setCursor(0, 0);
lcd.print("Out Time: ");
showsv(10, 1, 1);
hl = 240;
ll = 0;
col = 10;
row = 1;
digi = 1;
setval(hl, ll, col, row, digi);
EEPROM.update(101, sv);
}
/************************************************************************************/
void mobcount() {
sv = EEPROM.read(102);
lcd.setCursor(0, 0);
lcd.print("No. of mob: ");
showsv(10, 1, 1);
hl = 5;
ll = 1;
col = 10;
row = 1;
digi = 1;
setval(hl, ll, col, row, digi);
nomob = sv;
EEPROM.update(102, sv);
}
/************************************************************************************/
void sirent() {
sv = EEPROM.read(103);
lcd.setCursor(0, 0);
lcd.print("siren time: ");
//lcd.print(sv);
showsv(10, 1, 1);
hl = 255;
ll = 1;
col = 10;
row = 1;
digi = 1;
setval(hl, ll, col, row, digi);
sirentime = sv;
EEPROM.update(103, sv);
}
/************************************************************************************/
//mobile loc
void mobnum() {
//lcd.clear();
if (mobloc == 1) {
lcd.clear();
// col1 = 7;
// row1 = 0;
// col2 = 40;
fn = 1;
ln = 10;
// row2 = 50;
// col3 = 72;
digi = 0;
numb = 1;
mob();
}
if (mobloc == 2) {
lcd.clear();
// col1 = 0;
// row1 = 10;
// col2 = 40;
fn = 11;
ln = 20;
// row2 = 50;
// col3 = 72;
digi = 0;
numb = 2;
mob();
}
if (mobloc == 3) {
lcd.clear();
// col1 = 0;
// row1 = 20;
// col2 = 40;
fn = 21;
ln = 30;
// row2 = 50;
// col3 = 72;
numb = 3;
digi = 0;
mob();
}
if (mobloc == 4) {
lcd.clear();
// col1 = 0;
// row1 = 30;
// col2 = 40;
fn = 31;
ln = 40;
// row2 = 50;
// col3 = 72;
numb = 4;
digi = 0;
mob();
}
if (mobloc == 5) {
lcd.clear();
// col1 = 0;
// row1 = 40;
// col2 = 40;
fn = 41;
ln = 50;
// row2 = 50;
// col3 = 72;
numb = 5;
digi = 0;
mob();
}
}
/************************************************************************************/
void mobnum2() {
if (mobloc == 1) {
fn = 1;
ln = 10;
}
if (mobloc == 2) {
fn = 11;
ln = 20;
}
if (mobloc == 3) {
fn = 21;
ln = 30;
}
if (mobloc == 4) {
fn = 31;
ln = 40;
}
if (mobloc == 5) {
fn = 41;
ln = 50;
}
}
/************************************************************************************/
//STORING MOBILE NUMBERS
void mob() {
//lcd.setCursor(0, 0);
lcd.print("Mob#");
lcd.print(numb);
lcd.print(":");
lcd.setCursor(0, 1);
for (i = fn; i <= ln; i++) {
k[i] = EEPROM.read(i);
lcd.print(k[i]);
}
lcd.setCursor(7, 0);
lcd.print("Edit?");
//col = col3;
//row = row2;
while (digitalRead(SET) == 1) {
lcd.setCursor(12, 0);
if ((digitalRead(UP) == LOW)) //UPrement Button
{
delay_100();
sv = 1;
dispyes(12, 0);
}
if (digitalRead(DOWN) == LOW) //DOWNrement Button
{
delay_100();
sv = 0;
dispno(12, 0);
}
delay_100();
}
dispyn(12, 0);
if (sv == 1) {
delay(1000);
b = 0;
for (i = fn; i <= ln; i++) {
sv = k[i];
setval(9, 0, b, 1, digi); //setval(int hl, int ll, int col, int row, int digi)
EEPROM.update(i, sv);
b = b + 1;
delay(1000);
}
if (mobloc < nomob) {
mobloc++;
} else mobloc = 6;
} else {
if (mobloc < nomob) {
mobloc++;
} else mobloc = 6;
}
}
/************************************************************************************/
//SET VALUES
void setval(int hl, int ll, int col, int row, int digi) {
while (digitalRead(SET) == 1) {
showsv(col, row, digi);
if ((digitalRead(UP) == LOW)) //UPrement Button
{
delay_100();
if (sv >= hl) {
sv = ll;
}
sv++;
showsv(col, row, digi);
}
if (digitalRead(DOWN) == LOW) //DOWNrement Button
{
delay_100();
if (sv <= ll) {
sv = hl;
}
sv--;
showsv(col, row, digi);
}
delay_100();
}
showsv(col, row, digi);
}
/************************************************************************************/
//SHOW VALUES
void showsv(int col, int row, int digi) {
lcd.setCursor(col, row);
if(digi == 1){
sprintf (buffer, "%3d", sv);
lcd.print(buffer);
}
else if(digi == 0){
lcd.print(sv);
lcd.setCursor(col, row);
}
}
/************************************************************************************/
//100ms DELAY FUNCTION
void delay_100() {
delay(100);
}
/************************************************************************************/
//Subroutine for Display "YES" or "NO" depends upon bit
void dispyn(int col, int row) {
if (sv == 1) {
dispyes(col, row);
} else {
dispno(col, row);
}
}
/************************************************************************************/
//Subroutine contains string "YES" for Display
void dispyes(int col, int row) {
lcd.setCursor(col, row);
lcd.print(" Yes");
}
/************************************************************************************/
//Subroutine contains string "NO" for Display
void dispno(int col, int row) {
lcd.setCursor(col, row);
lcd.print(" No ");
}
/************************************************************************************/
//readmemory
void readmemory() {
sms = EEPROM.read(0);
indel = EEPROM.read(100);
outdel = EEPROM.read(101);
nomob = EEPROM.read(102);
sirentime = EEPROM.read(103);
}