martedì 4 ottobre 2016

A simple low cost GSM alarm with arduino


A simple low budget GSM alarm with arduino.

I wanted to construct a simple alarm spending less than 30 euros that was capable of sending an sms in case of:

- infraction
- low battery level
- power supply fault

and I am gonna to explait it to you in case it could be useful for you projects.

This alarm contains the following electrinic parts:

- 1 gsm gprs module used to send sms to one or more mobile numbers
- 2 infrared sensors
- 1 battery pack (in this version I did not use rechargeable batteries but it is very simple to modify the scheme)
- 1 arduino UNO board

In order to avoid false alarms, I used two separate infrared sensors, so the alarm is detected only if both the sensors give a positive signal. The are also 2 different buttons. The first one is used to start the initial countdown so you have the necessary time to exit the room, the second one is the reset.
The are also 3 leds on the front of the alarm. The first one indicates the presence of the electrical power, the second one indicates the countdown and the activation of the alarm.

The main scheme is indicated in the following picture:


About the code, this one is just one version and it is not optimized but it works:

#include <SoftwareSerial.h>
#define SIM800_TX_PIN 8
#define SIM800_RX_PIN 9
SoftwareSerial serialSIM800(SIM800_TX_PIN,SIM800_RX_PIN);
// numero massimo di allarmi da mandare per topologia
// sensore l'allarme si conta solo quando si attiva mentre per la rete si segnala quando va via e quando torna. per la batteria quando scende oltre un certo livello.
int max_sensore=6;
int max_rete=6;
int max_batteria=6;
int n_al_sensore=0;
int n_al_rete=0;
int n_al_batteria=0;
int secondi_partenza=30;

// PIN DEI SENSORI
int sensore = A0;    // SENSORE DI PRESENZA
int sensore2 = A2;    // SENSORE DI PRESENZA
int rete = A1; // TENSIONE DI RETE DA ALLARME PER TENSIONE DI ALIMENTAZIONE MANCANTE
int batteria = A5;  // TENSIONE BATTERIA DEVE ESSERE 9V O SUPERIORE E DARE ALLARME SE INFERIORE A 6V

int lettura_sensore = 0; 
int lettura_sensore2 = 0; 
int lettura_rete = 0; 
int lettura_batteria = 0; 

byte allarme_sensore=0;
byte allarme_rete=0;
byte allarme_batteria=0;

unsigned long tempo1=0;
unsigned long tempo2=0;

int nmisure;

long totale_sensore,totale_sensore2,totale_rete,totale_batteria;
int media_sensore=0;
int media_sensore2=0;
int media_rete=1000;
int media_batteria=1000;
int attivazione=7; // PIN CHE ATTIVA L'ALLARME HIGH=ATTIVO

String stringa[20];

void setup() {

while(!Serial);
serialSIM800.begin(9600);
delay(1000);
Serial.println("Setup GSM Complete!");
  
  pinMode(sensore, INPUT);
    pinMode(sensore2, INPUT);
  pinMode(rete, INPUT);
  pinMode(batteria, INPUT);

// interruttore con l'attivazione dell'allarme
  pinMode(attivazione, INPUT); 

  pinMode(2, OUTPUT); // sensore con il led di allarme
  pinMode(3, OUTPUT); // sensore con il led dell'SMS

  Serial.begin(9600);
lampeggia_verde();
Serial.println("In attesa di premere il pulsante rosso per attivare l'allarme...");
while (digitalRead(attivazione)==LOW) {} // attende "secondi_partenza" secondi per iniziare a funzionare
Serial.println("PULSANTE ROSSO PREMUTO...");  
lampeggia_partenza();
  delay(secondi_partenza*1000);
Serial.println("Allarme attivato...");  //INTERRUTTORE PREMUTO

digitalWrite(3,LOW); // led SMS
}

void loop() {

// LEGGE I PARAMETRI IN INGRESSO
rilevato();

// INOLTRA GLI ALLARMI
verifica_allarmi();
}

void print_parametri()
{
Serial.println("-------------------------PARAMETRI---------------------------------------"); 
Serial.print("media sensore: "); Serial.println(media_sensore); 
Serial.print("media sensore 2: "); Serial.println(media_sensore2)
Serial.print("media tensione rete: "); Serial.println(media_rete); 
Serial.print("media tensione batteria: "); Serial.println(media_batteria*9.79/695); 
Serial.println("-------------------------PARAMETRI---------------------------------------"); 
}

void manda_sms()
{Serial.println("SMS SMS SMS SMS SMS SMS SMS SMS SMS SMS ");

/* PARTE DA INSERIRE PER FAR PARTIRE L'SMS
serialSIM800.write("AT+CMGF=1\r\n");
delay(1000);
//Send new SMS command and message number
serialSIM800.write("AT+CMGS=\"??????????\"\r\n");
delay(1000);
//Send SMS content
serialSIM800.write("ALLARME PRESENZA");
delay(1000);
//Send Ctrl+Z / ESC to denote SMS message is complete
serialSIM800.write((char)26);
delay(1000);
Serial.println("SMS Sent!");

*/

digitalWrite(3,HIGH);
delay(250);
digitalWrite(3,LOW);
}
  
void verifica_allarmi()  {

if ((media_sensore < 200)&& (allarme_sensore==1))
{allarme_sensore=0; Serial.print("*** SENSORE TORNATO OFF ***    ");
  digitalWrite(2,LOW); // spegniamo il led all'uscita 2
// n_al_sensore=n_al_sensore+1; Serial.println(n_al_sensore);
// manda_sms();
}

if ((media_rete > 200) && (allarme_rete==1))
{allarme_rete=0; Serial.print("*** RETE TORNATA ON ***    ");
n_al_rete=n_al_rete+1; Serial.println(n_al_rete);
stringa[7]="RETE ON";
manda_sms();
}

if ((media_batteria > 200)&& (allarme_batteria==1))
{allarme_batteria=0; Serial.print("*** BATTERIA TORNATA ON ***");
n_al_batteria=n_al_batteria+1; Serial.println(n_al_batteria);
manda_sms();
}

  if ((media_sensore > 200) && (media_sensore2 >200))
{
  // SE IL SENSORE NON ERA GIA' IN ALLARME MANDA UN ALLARME
    if (allarme_sensore==0){
    if(n_al_sensore<max_sensore){
      stringa[16]="ALLARME PRESENZA";
    manda_sms();
    n_al_sensore=n_al_sensore+1;}
     // ALLARME PRESENZA
  Serial.println("<<<<<<<<<<<<<<<<<<<<<  ALLARME PRESENZA"); 
  digitalWrite(2,HIGH); // accendiamo il led all'uscita 2
  
    allarme_sensore=1;}

  }

  if (media_rete < 200)
{

  // SE IL SENSORE NON ERA GIA' IN ALLARME MANDA UN ALLARME
    if (allarme_rete==0){
   if (n_al_rete<max_rete){
     stringa[16]="RETE OFF";
    manda_sms();
    n_al_rete=n_al_rete+1;}
     // ALLARME PRESENZA
  Serial.println("<<<<<<<<<<<<<<<<<<<<< ALLARME RETE");
  Serial.print("MEDIA RETE: "); Serial.println(media_rete); 
    allarme_rete=1;}
}

  if (media_batteria < 200)
{
  // SE IL SENSORE NON ERA GIA' IN ALLARME MANDA UN ALLARME
    if (allarme_batteria==0){
    if(n_al_batteria<max_batteria){
 // TOGLIERE IL COMMENTO DALLA RIGA SUCCESSIVA
 // stringa[20]="ALLARME BATTERIA";
 //   manda_sms();
    n_al_batteria=n_al_batteria+1;}
     // ALLARME PRESENZA
  Serial.println("<<<<<<<<<<<<<<<<<<<<< ALLARME BATTERIA"); 
    allarme_batteria=1;}
}

  }

void rilevato() {
tempo1=millis();
tempo2=tempo1;
nmisure=0;
totale_sensore=0;
totale_sensore2=0;
totale_rete=0;
totale_batteria=0;

while((tempo2-tempo1) <= 1000){
lettura_sensore = analogRead(sensore);
lettura_sensore2 = analogRead(sensore2);
lettura_rete = analogRead(rete);
lettura_batteria = analogRead(batteria);

nmisure=nmisure+1;
totale_sensore=totale_sensore+lettura_sensore;
totale_sensore2=totale_sensore2+lettura_sensore2;
totale_rete=totale_rete+lettura_rete;
totale_batteria=totale_batteria+lettura_batteria;

  tempo2=millis();
}
media_sensore=totale_sensore/nmisure;
media_sensore2=totale_sensore2/nmisure;
media_rete=totale_rete/nmisure;
media_batteria=totale_batteria/nmisure;

}

void suona_sirena()

{}

void lampeggia_verde()
{digitalWrite(3,HIGH); delay(300);
 digitalWrite(3,LOW); delay(300);
 }


void lampeggia_partenza()
{digitalWrite(2,HIGH); delay(300);
 digitalWrite(2,LOW); delay(300);
 }


It is also very simple to introduce some magnetic switches: it is only necessary to connect them to an arduino's input and verify if the corresponding circuit changes its state.