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.
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:
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.
- Di cosa abbiamo bisogno?
Per realizzare il nostro progetto abbiamo bisogno:
- ELENCO MATERIALE CON ARDUINO
- Arduino 2009 / Uno / Mega
- Ricevente 433Mhz modello XY-MK-5V
- n°2 Relè a 5Vdc di tensione bobina tipo OMRON G5LA-14 o equivalenti.
- n°2 Transistor BC337.
- n°2 Diodo 1N4148
- n°4 Resistenze da 1K
- n°1 Led
- n°1 Resistenza da 220 ohm
- Telecomando (no rolling code) a 433MHz
- Breadboard bella capiente
- Cavo vari colori per breadboard
- Cavo USB.
- Sensori Infrarossi o Contatti magnetici radio a 433MHz alimentati a batteria.
- Sirena filare
- ELENCO MATERIALE ETA BETA IDEA
- Scheda Eta Beta IDEA
- Telecomando (no rolling code) a 433MHz
- Ricevente 433MHz modello XY-MK-5V
- Cavo USB.
- Sensori Infrarossi o Contatti magnetici radio a 433MHz alimentati a batteria.
- Sirena filare
- 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.
- 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.
- 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