mercoledì 3 agosto 2016

Tutorial: Come realizzare una centrale antintrusione radio con Arduino.

Centrale allarme radio con Arduino

In questo Tutorial mostreremo come realizzare un piccolo sistema di antifurto radio sfruttando sensori radio (senza fili) a 433MHz reperibili facilmente su internet.

Per poter realizzare il progetto possiamo utilizzare la nostra scheda ETA BETA EDI oppure Arduino 2009 / UNO / Mega.


I sensori che andremo ad utilizzare sono dei sensori radio con frequenza di 433Mhz alimentati a batteria e posso essere di vario tipo:
  • Sensori Infrarossi:  inviano un codice alla scheda idea o Arduino quando un oggetto interrompe il fascio IR. Utilizzati di solito per la protezione interna dell’appartamento o del negozio.
  • Contatti Magnetici: costituiti da 2 parti il REED ed un MAGNETE quando il magnete si allontana dal reed viene inviato alla scheda un codice. Utilizzati di solito per la protezione perimetrale (porte di ingresso / porte basculanti).
  • Sensori a tenda: stesso principio di funzionamento degli IR, utilizzati solitamente vicino le finestre.



L’allarme realizzato in questo progetto prevede sia l’inserimento totale  che parziale.
Nell’ inserimento totale tutti i sensori codificati generano un allarme, quindi viene utilizzato quando per esempio in casa non c’è nessuno,  mentre nell’ inserimento parziale (anche definito notturno) solo alcuni sensori in genere perimetrali come ad esempio il contatto magnetico della porta d’ingresso e i sensori a tenda delle finestre generano un allarme.
Per poter effettuare la discriminazione tra inserimento parziale ed inserimento totale utilizzeremo un telecomando a 4 tasti di cui uno utilizzato per il totale, uno per il perimetrale, uno per il disinserimento, il quarto può essere utilizzato ad esempio per far scattare la sirena in caso di allarme panico.


  1. Di cosa abbiamo bisogno?


Per realizzare il nostro progetto abbiamo bisogno:
  • ELENCO MATERIALE CON ARDUINO
  1. Arduino 2009 / Uno / Mega
  2. Ricevente 433Mhz modello XY-MK-5V
  3. n°2 Relè a 5Vdc di tensione bobina tipo OMRON G5LA-14 o equivalenti.
  4. n°2 Transistor BC337.
  5. n°2 Diodo 1N4148
  6. n°4 Resistenze da 1K
  7. n°1 Led
  8. n°1 Resistenza da 220 ohm
  9. Telecomando (no rolling code) a 433MHz
  10. Breadboard bella capiente
  11. Cavo vari colori per breadboard
  12. Cavo USB.
  13. Sensori Infrarossi o Contatti magnetici radio a 433MHz alimentati a batteria.
  14. Sirena filare


  • ELENCO MATERIALE ETA BETA IDEA
  1. Scheda Eta Beta IDEA
  2. Telecomando (no rolling code) a 433MHz
  3. Ricevente 433MHz modello XY-MK-5V
  4. Cavo USB.
  5. Sensori Infrarossi o Contatti magnetici radio a 433MHz alimentati a batteria.
  6. Sirena filare


  1. Schemi Elettrici


Per chi utilizza la scheda Eta beta idea, la prima cosa da fare è montare sulla scheda la ricevente a 433MHz e chiudere il ponticello per alimentarla e portare in on il DIP 5 e 6 del DS1 e il DIP 6  del DS2 per attivare rispettivamente il relè 1, il relè 2 e il “DATA” della ricevente (come in foto).



Per chi utilizza Arduino, la ricevente utilizza i Pin INTERRUPT che sulla scheda Arduino 2009 sono 2: il PIN DIGITALE 2 (interrupt0) e 3 (interrupt1). Infine colleghiamo come da schema precedente il relè al PIN Digitale 7.


  1. Sketch uguale sia per Arduino 2009 sia per ETA BETA idea


Scarichiamo la libreria “RCSwitch.h” necessaria per la decodifica del segnale radio e carichiamola tra le librerie di Arduino.
La libreria è la stessa sia per Arduino sia per ETA BETA idea .
Il relè uno viene utilizzato per indicare lo stato dell’impianto, cioè se è inserito totalmente oppure disinserito (possiamo collegarci un bulbo luminoso di segnalazione stato impianto), al relè 2 andremo a collegare la nostra sirena.
Il LED 13 lo utilizzeremo per indicare l’inserimento del Perimetrale.


  1. Spiegazione dello skecth uguale per entrambe le schede


Parte 1 - Dichiarazioni Variabili e Librerie utilizzate:
Nella prima parte dello Sketch andiamo ad inserire la libreria RCSwitch che utilizzeremo per leggere la stringa inviata dai tasti del telecomando e dai sensori radio montati la libreria EEPROM per memorizzare lo stato dell’impianto (inserito / disinserito/ inserito perimetrale) in modo da non perdere l’informazione nel caso di mancanza di corrente, e come da schema abbiamo il relè 1 collegato al pin digitale 7,il relè 2 collegato al pin digitale 8 ed il LED al pin digitale 13. Inizializziamo le variabili per la funzione MILLIS che utilizzeremo per stabilire la durata del suono della sirena. La variabile blocco viene utilizzata per non far risuonare l’allarme se è già scattato.


Parte 2 - Void Setup
Impostiamo i relè ed il led come OUTPUT, ovviamente inizializziamo la seriale a 9600 e andremo a dichiarare che la nostra ricevente è collegata al pin INTERRUPT 1, quindi al PIN digitale 3 del nostro micro.


Parte 3 - Void LOOP
La prima cosa da fare è leggere dalla EEPROM lo stato dell’impianto.
I cicli if attivano e disattivano il relè 1 o il led 13 in caso di inserimento totale/perimetrale o disinserimento.
Attiviamo la comunicazione radio, ed associamo le operazioni di inserimento e disinserimento ai 3 tasti del telecomando.
Nei 2 cicli if successivi andremo ad associare i codici dei sensori allo stato di inserimento totale e perimetrale.
L’ ultimo ciclo if attiva la sirena ed il conteggio per la durata del suono.




 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#include <EEPROM.h>
#include <RCSwitch.h>
RCSwitch mySwitch = RCSwitch();
const int rele1 = 7;               // Pin a cui è collegato il relè 1 SIRENA
const int rele2 = 8;               // Pin a cui è collegato il relè 2 STATO INS/DISINSERIMENTO TOTALE  
const int ledpin = 13;             // Pin a cui è collegato il LED 13 che indica l'inserimento PERIMETRALE
int inserimento;                   // Variabile che indica lo stato della centrale (1 inserito, 0 disinserita)
int value;                         // Variabile che indica il segnale inviato dai sensori radio e dal telecomando
unsigned long conteggio = 3000;    // durata suono sirena (3 secondi)
unsigned long previsioneMillis=0;  // variabili di inizio e fine conteggio
unsigned long correntiMillis=0;    // variabili di inizio e fine conteggio
boolean blocco = false;            // variabile di blocco della sirena se è gia in allarme la centralina
boolean statorele2;                // Stato rele2 a cui è collegata la sirena

void setup() {
  Serial.begin(9600);
  pinMode(rele1,OUTPUT);
  pinMode(rele2,OUTPUT);
  pinMode(ledpin,OUTPUT);
  mySwitch.enableReceive(1);    // La ricevente è collegata al pin INTERRUPT 1, cioè il pin digitale 3

}

void loop() {
  unsigned long correntiMillis = millis();   // memorizziamo il valore di millis 
  inserimento = EEPROM.read(10);             //Andiamo a leggere sulla EEPROM all'accensione se l'impianto è inserito in modo da tutelarci in caso di mancanza di corrente
  
  if (inserimento == 1){                 // INSERITO TOTALE
    digitalWrite(rele1, HIGH);  
    } 
    
  if (inserimento == 0){                 //DISINSERITO
    digitalWrite(rele2, LOW);
    digitalWrite(ledpin, LOW);
    digitalWrite(rele1, LOW);
    }
    
  if (inserimento == 2){                 // INSERITO PERIMETRALE
    digitalWrite(ledpin, HIGH);
    }
       
  if (mySwitch.available()) {         // Inizializza lettura sensori radio
     value = mySwitch.getReceivedValue();
     Serial.print("Received ");
     Serial.println( value);          // Valore letto dai sensori radio
     
      if (value == 18368){            //tasto 1 del telecomando
       inserimento = 1; 
       EEPROM.write(10, 1); 
}
      if (value == 18188){            //tasto 2 del telecomando
       inserimento = 0;
       EEPROM.write(10, 0); 
       EEPROM.write(11, 0);
       blocco = false;            //Resettare condizione di blocco allarme
}
      if (value == 18224){          //tasto tre del telecomando
       inserimento = 2; 
       EEPROM.write(10, 2);
}

if ((value == 31664 || value == 16036 || value == 7516 || value == 18179)&& inserimento == 1 && blocco == false){    //ALLARME PER INSERIMENTO TOTALE (Inserire codici dei sensori)
        previsioneMillis = correntiMillis + conteggio;  // creiamo il valore di off sommando i millis catturati prima + il tempo impostato di off
  blocco =  true;                                       //Per non farlo rientrare nella condizione di allarme quando già è in allarme
     digitalWrite(rele2, HIGH);
  statorele2 = 1;                       
  }
  
if (value == 31664 && inserimento == 2 && blocco == false){   //ALLARME PER INSERIMENTO  ZONA PERIMETRALE (Inserire codici sensori appartenenti al perimetrale)
   previsioneMillis = correntiMillis + conteggio;  // creiamo il valore di off sommando i millis catturati prima + il tempo impostato di off
  blocco =  true;                                       //Per non farlo rientrare nella condizione di allarme quando già è in allarme
  statorele2 = 1;
      digitalWrite(rele2, HIGH);
  }
   mySwitch.resetAvailable();
 }  //Fine lettura radio
  
if(statorele2 == 1){                          // Gestione durata suono sirena
   if (correntiMillis >= previsioneMillis) {  // Quando raggiungiamo il tempo di durata del suono della sirena   
        digitalWrite(rele2, LOW); 
        statorele2 = 0;                       // reimpostiamo statorele2 per iniziare nuovamente un ciclo
    }
  }  
}   // Fine loop


Buon Divertimento
Christian e Massimo