Esame di MECCA MECCATRONICA TRONICA
Sistema di videosorveglianza videosorveglianza comandato comandato da Arduino Mega 2560 Docente: Prof. Ing. Nicola Ivan Giannoccaro
Presentazione a cura di: GIOVINAZZI Mattia MANIERI Giancarlo MORTELLA Eddy MARTINA Paolo
22/04/2016
Generalità Il lavoro d’anno inerente il corso di Meccatronica consiste in un sistema di videosorveglianza comandato per mezzo della scheda programmabile Arduino Mega 2560. 2560. Tale sistema d’allarme si avvale di sensori di rilevamento di tipo PIR per l’individuazione di eventuali infrazioni all’interno di un’unità abitativa, che attivano dei dispositivi dispositivi acustici acustici e luminosi d’allarme . La sua attivazione/disattivazione attivazione/disattivazione avviene per mezzo dell’ inserimento di un’apposita password tramite tastierino numerico. numerico. Le informazioni relative al sistema d’allarme sono visualizzate a mezzo di schermo LCD .
Elementi impiegati per la realizzazione del progetto
a) b)
a) Arduino Mega 2560 b) Sensore Infrarossi Infrarossi Piroelettrico
c)
c) Schermo LCD 20 x 4
d)
d) Orologio (RTC)
e) e) Tastiera numerica 4 x 4
f) Servo motore
f)
a) Arduino Mega 2560 Il modello utilizzato per la realizzazione del del sistema di videosorveglianza è il «Arduino Mega 2560». La scheda è corredata di microcontrollore Atmel, ATmega2560, ATmega2560, 54 pin input/output digitali (dei quali 15 possono essere usati come output PWM), 16 input analogici, analogici, 4 UARTs UARTs ( porte seriali), un oscillatore al cristallo a 16 MHz, un header ICSP, ICSP, un connettore USB, un jack per l’alimentazione e un pulsante di reset.
b) c) d) e)
f)
a) Arduino Mega 2560 Caratteristiche tecniche
• • • • • • • • • • • • • • •
Microcontrollore: Microcontrol lore: Tensione di lavoro: Tensione di input (consigliata): Tensione di input (limite): Pin digitali I/O: Pin di input analogici: Corrente continua per i Pin I/O: Corrente continua per i Pin a 3.3 V: Memoria Flash: SRAM: EEPROM: Frequenza Frequenza di Clock: Lunghezza: Larghezza: Peso:
ATmega2560, 8bit 5V 7-12 V 6-20 V 54 16 20 mA 50 mA 256 kB 8 kB 4 kB 16 MHz 101,52 mm 53,3 mm 37 g
Posizione dei componenti interni Arduino Mega 2560 Microcontrollore Microcontrollore Atmega 2560 Pin I/O digitali Header Header ICSP ICSP Porta USB Chip comunicazione seriale Cristallo al Quarzo Regolatore 5 V 2,1 mm jack per alimentazione esterna
Pin di alimentazione Pin analogici
Elementi impiegati per la realizzazione del progetto
a) b)
a) Arduino Mega 2560
b) Sensore Infrarossi Passivo
c)
c) Schermo LCD 20 x 4
d)
d) Orologio (RTC)
e) e) Tastiera numerica 4 x 4
f) Servo motore
f)
b) Sensore Infrar I nfrarossi ossi Passivo
a)
Principio fisico PIR) è un sensore elettronico in Un sensore infrarossi passivo (PIR) grado di rilevare i raggi infrarossi (IR) irradiati dagli oggetti nel suo campo di vista. Tutti gli oggetti con temperatura superiore allo zero assoluto emettono energia sotto forma di radiazioni luminose. luminose. La maggior parte delle volte queste radiazioni sono invisibili all’occhio all’occhio umano, poiché a frequenza inferiore a quella della l uce dello spettro visibile, ma possono essere rilevate tramite specifici dispositivi elettronici progettati a tal scopo. Il termine passivo si riferisce al fatto che i PIR non emettono emettono energia, ma lavorano esclusivamente rilevando l’energia irradiata dagli oggetti. All’interno di un PIR è presente un sensore di materiale materiale piroelettr piroelettrico ico,, in grado cioè di accumulare cariche elettriche di segno opposto sulle facce opposte di certi cristalli (nitruro di Gallio, nitruro di Cesio) in risposta ad un cambiamento di temperatura. Questi sensori sono molto usati come ri levatori di movimento.
c) d) e)
f)
b) Sensore Infrar I nfrarossi ossi Passivo Funzionamento Un sensore PIR associa il concetto di movimento alla variazione di temperatura rispetto ad uno stato «memorizzato» «memorizzato» come quello di ri ferimento. ferimento. Quando qualcosa o qualcuno passa di fronte a uno sfondo, ad esempio un muro, precedentemente «fotografato» dal PIR come stato normale, la temperatura in quel punto si innalza bruscamente, passando dalla temperatura temperatura della stanza a quella del corpo. Questo rapido cambiamento attiva il rilevamento. rilevamento. I PIR più comuni sono quelli che implementano le cosiddette cosiddette lenti di Fresnel, o lenti a specchio, con un range di rilevamento di, al massimo, massimo, 10 – 10 – 12 metri e un campo che può arrivare a 300 gradi. Su di essi possono essere presenti due potenziometri potenziometri adibiti alla regolazione della «sensibilità» e del «tempo d’attesa».
b) Sensore Infrar I nfrarossi ossi Passivo Specifiche tecniche sensore HC-SR501 • • • • • • • • • •
Tensione di funzionamento: funziona mento: 4.5 ~ 20Vcc Corrente di riposo: <50uA Range di rilevamento: rilevamento: 0~7m Livello di uscita: alto 3,3V / basso 0V Tempo di attesa: 5-200s (regolabile) (regolabi le) Angolo di rilevamento: rilevamento: <100° Misura della lente del sensore: diametro 23 mm Temperatura emperatura di funzionamento: funzionamento: -15/ +70° C Dimensioni scheda: 32 x 24 x 2 mm Peso: 6g
GND
Regolatore 3V DC
Sensibilità
Digital OUT Pin 7-9 3-5V DC
int Pir_g Pir_gara arage ge = 9; int Pir_cavea Pir_caveau= u= 7;
Dichiarazione delle variabili intere e assegnazione dei Pin di collegamento collegamento sulla scheda Arduino.
pinMode(Pir_garage, pinMode(Pir_garage, INPUT); pinMode(Pir_caveau, INPUT);
Definizione dei Pir come INPUT. INPUT.
Serial.println(digitalRead(Pir_garage)); Serial.println(digitalRead(Pir_caveau));
Stampa su monitor seriale dello stato logico dei Pir.
if (digitalRead(Pir_garage) (digitalRead(Pir_garage) == HIGH) { zone = 0; alarmTriggered(); } if (digitalRead(Pir_caveau) (digitalRead(Pir_caveau) == HIGH) { zone = 3; alarmTriggered(); }
Ciclo IF di controllo dei Pir.
Elementi impiegati per la realizzazione del progetto
a) b)
a) Arduino Mega 2560 b) Sensore Infrarossi Infrarossi Piroelettrico
c)
c) Schermo LCD 20 x 4
d)
d) Orologio (RTC)
e) e) Tastiera numerica 4 x 4
f) Servo motore
f)
c) Schermo LCD 20 x 4 Il Dislay LCD è un interessante interessante strumento, strumento, utile per interfacciare il mondo digitale con quello umano. Con questo strumento, sarà possibile leggere unità fisiche, come il rilevamento da parte del PIR, l’ora, lo stato di accensione di un LED, oppure potremmo comporre testo, scritte scorrevoli scorrevoli e tanto altro ancora. In commercio ne esistono di diversi tipi e modelli. Questo in figura è un display LCD retroilluminato 4 x 20 a 16 contatti. La luminosità viene regolata regolata agendo sul pin 15 e 16.
a) b)
d) e)
f)
c) Schermo LCD 20 x 4 Collegamenti I display a matrice di punti utilizzano un protocollo comune basato sul chip HD44780 prodotto dalla Hitachi. Sono formati da diverse righe ed i valori tipici vengono RIGHE, nel caso in espressi nella forma COLONNE x RIGHE, esame il display è un 20 x 4, quindi composto composto da 20 colonne per ognuna delle 4 righe. L’interfaccia per poter inviare i comandi ed i dati è di tipo pin. parallelo, composta composta da 16 pin. La piedinatura riportata accanto ha ordine e significato ben precisi.
N° Pin
Simbolo
Descrizione
1
Vss
Collegamento a massa dell’alimentazione del display
2
Vcc
Alimentazione del display, tipicamente 5Vdc
3
Vee
Controllo del contrasto dei caratteri
4
RS
Segnale di selezione registro
2 Vcc
5
R/W
Specifica se si vuole scrivere o leg gere dal display
6
E
Necessario per far leggere al display il comando o il dato presente sulle linee DB
3 Vee 4 RS
1 Vss
5 R/W 6 E
7
DB0
Data bus line 0
8
DB1
Data bus line 1
8 DB1
9
DB2
Data bus line 2
10
DB3
Data bus line 3
9 DB2 10 DB3
11
DB4
Data bus line 4
12
DB5
Data bus line 5
13
DB6
Data bus line 6
14
DB7
Data bus line 7
15
LED+
Alimentazione per la retroilluminazione del display
7 DB0
11 DB4 12 DB5 13 DB6 14 DB7 15 LED+ 16 LED-
c) Schermo LCD 20 x 4 Collegamenti I pin Data servono per inviare un byte al chip del display. display. Il valore inviato può essere interpretato sia come comando (ad esempio per spostare il cursore, per posizionarsi su una riga specifica, per pulire il display) sia un valore ASCII da scrivere sulla matrice. La scelta tra comando e carattere RS. ASCII viene gestita dal livello l ogico posto sul pin RS. Il pin E abilita l’esecuzione l’esecuzione del comando o lla a scrittura sulla matrice. Nello schema d’esempio accanto, si nota che i Data Pin non sono collegati completamente ma vengono utilizzati solo i bit più significativi (bus line 4, 5, 6, 7). Questa peculiarità è possibile poiché il display supporta la modalità a 4 bit, bit, che essendo implementata anche dalla libreria LiquidCristal, LiquidCristal, fa in modo di usare solo 4 collegamenti piuttosto che 8.
#include
Inclusione della libreria per il display LCD. LiquidCrystal lcd(12,11, 5, 4, 4, 3, 2); Assegnazione dei pin di collegamento collegamento sulla scheda Arduino.
lcd.begin(20, 4);
Definizione del numero di colonne e righe costituenti il display LCD.
lcd.clear(); lcd.setCursor(0,0); lcd.print("INFRAZIONE RILEVATA!") RILEVATA!");; lcd.setCursor(7,1); if(zone == 0){ lcd.print("Garage"); lcd.setCursor(0,3); lcd.print("ULT.INF."); else if(zone == 3){ lcd.print("Caveau"); lcd.setCursor(0,3); lcd.print("ULT.INF.");
Esempio di comando di stampa a video su display LCD all’interno di un ciclo IF: il comando lcd.clear() impone la cancellazione del display, il comando lcd.setCursor() definisce la localizzazione della scritta sul display, il comando lcd.print() definisce il testo da visualizzare sul display.
lcd.clear(); lcd.setCursor(0,3); lcd.print("Inserire PIN:"); lcd.setCursor(1,0); lcd.print("Video sorveglianza"); lcd.setCursor(4,1); lcd.print("Casa Laplace");
Esempio di stampa a video su display LCD della schermata iniziale.
Elementi impiegati per la realizzazione del progetto
a) b)
a) Arduino Mega 2560 b) Sensore Infrarossi Infrarossi Piroelettrico
c)
c) Schermo LCD 20 x 4
d)
d) Orologio (RTC)
e) e) Tastiera numerica 4 x 4
f) Servo motore
f)
d) Orologio (RTC) Un real-time clock (RTC), RTC), o orologio in tempo reale, è un dispositivo con funzione di orologio, solitamente costituito da un processore a circuito integrato, in grado di scandire il tempo (anno, mese, giorno, ore, minuti e secondi) anche nel caso di util izzatore spento. spento. Viene usato in molti campi dell’elettronica dell’elettronica ed è presente presente in tutti i moderni PC. Il modello utilizzato nel presente progetto progetto è il DS1307 di Maxim. Questo modello possiede la caratteristica di essere molto preciso grazie alla presenza di un oscillatore a temperatura temperatura controllata ed il rispettivo sensore di temperatura, utilizzato per compensare la frequenza di oscillazione.
a) b) c)
e)
f)
d) Orologio (RTC) Principio di funzionamento I microcontrollori funzionano grazie ad una sorgente di clock che permette di temporizzare e sincronizzare tutti i moduli che lo compongono. compongono. Il clock è un segnale con frequenza fissa e stabile tipicamente prodotta prodotta da un oscillatore al quarzo. Questo segnale è la base per tutte quelle applicazioni che devono gestire date e orari. In effetti esistono molte applicazioni in cui la gestione del tempo è il fattore principale, come ad esempio tutti gli automatismi attivati in funzione dell’ora e della data corrente o che devono compiere delle azioni cicliche. La gestione del tempo viene affidata a librerie esterne all’Arduino IDE, quella impiegata nel progetto è denominata «Arduino Time». Questa libreria libreria contiene le classi Time, Time, TimeAlarms e DS1307RTC, DS1307RTC, con cui è stato possibile avere controllo pressoché completo sulla data e sull’orario. La sorgente di clock alla base della generazione del dato di tempo può essere quella interna interna al microcontrollore microcontrollore oppure quella gestita da un circuito esterno, tipicamente chiamato Real Time Clock (RTC) come l’integrato DS1307.
La differenza sostanziale è che usando un RTC si hanno sempre a disposizione il tempo e la data correnti poiché questo circuito tiene in memoria il conteggio impiegando impiegando una batteria tampone. Quando invece la base dei tempi è il clock interno del microcontrollore, microcontrollore, al vantaggio del risparmio sul costo dell’hardware dell’hardware esterno, si oppone la perdita del conteggio del alimentazione. tempo in caso di reset o mancata alimentazione. Si noti che di fabbrica, l’RTC non è impostato con le indicazioni temporali corrette. Ha bisogno di un’iniziale un’iniziale calibrazione tramite software e solo successivamente è in grado di conteggiare in maniera autonoma.
d) Orologio (RTC) Collegamenti Nel caso dell’RTC , i Pin 20 e 21 non hanno bisogno di essere dichiarati, è sufficiente collegarli direttamente direttamente alle porte SDA ed SDC.
Serial clock – clock – Pin 21 Serial Data – Data – Pin 20 Vcc-3,3 V Massa-GND
#include #include " RTClib.h« RTClib.h« RTC_DS1307 RTC;
Inclusione delle librerie per l’RTC e dichiarazione dello stesso.
Wire.begin(); RTC.begin(); if (! RTC.isrunning()) { RTC.adjust(DateTime(__DATE__, __TIME__)); }
Richiamo delle librerie e impostazione di data e ora dell’RTC da PC.
DateTime DateTime now = RTC.now() RTC.now();; lcd.setCursor(0,2); if(now.day()<10)lcd.print(0); lcd.print(now.day(),DEC); lcd.print("/"); if(now.month()<10)lcd.print(0); lcd.print(now.month(),DEC); lcd.print("/"); lcd.print(now.year(),DEC); lcd.setCursor(12,2); if(now.hour()<10)lcd.print(0); lcd.print(now.hour(),DEC); lcd.print(":"); if(now.minute()<10)lcd.print(0); lcd.print(now.minute(),DEC); lcd.print(":"); if(now.second()<10)lcd.print(0); lcd.print(now.second(),DEC);
Comandi per la lettura di data e ora da RTC e conseguente stampa a video su display LCD. I cicli IF sono stati utilizzati utilizzati per la corretta visualizzazione visualizzazione a due digit di data e ora.
Elementi impiegati per la realizzazione del progetto
a) b)
a) Arduino Mega 2560 b) Sensore Infrarossi Infrarossi Piroelettrico
c)
c) Schermo LCD 20 x 4
d)
d) Orologio (RTC)
e) e) Tastiera numerica 4 x 4
f) Servo motore
f)
e) Tastiera numerica 4 x 4 Il tastierino numerico è una periferica di input. Per il sistema di video sorveglienza è stato impiegato impiegato il modello a matrice 4 x 4. La sua struttura permette di verificare facilmente con l’ausilio l’ausilio di un microcontrollore microcontrollore quale dei tasti sia stato digitato tramite la lettura lettura dei pin di di output del tastierino stesso. Il tastierino accanto ha un totale di 16 tasti e presenta un’uscita con 8 pin che permettono la lettura della matrice righe/colonne. righe/colonne.
a) b) c) d)
f)
e) Tastiera numerica 4 x 4 Layout tastiera
Rig iga/ a/Co Colo lon nna
Tas asti ti col olle leg gat atii
Pin Pi n
Colonna 1
1 – 4 - 7 - *
1
Colonna 2
2-5-8-0
2
Colonna 3
3-6-9-#
3
Colonna 4
A - B - C – C – D
4
Riga 1
1-2-3-A
5
Riga 2
4-5-6-B
6
Riga 3
7-8-9-C
7
Riga 4
*-0-#-D
8
#include const byte RIGHE = 4; const byte COLONNE COLONNE = 4;
Inclusione libreria e dichiarazione delle variabili di tipo "const".
char tasti[RIGHE][COLONNE] tasti[RIGHE][COLONNE] = { { '1','2','3','A' } , { '4','5','6','B' } , { '7','8','9','C' } , { '*','0','#','D' }}; byte rowPins[RIGHE] rowPins[RIGHE] = { 22, 23, 24, 25}; byte colPins[COLONNE] colPins[COLONNE] = { 26, 27, 28, 29};
Definizione del tastierino numerico.
Assegnazione dei pin di collegamento collegamento sulla scheda Arduino.
Keypad keypad = Keypad( makeKeymap(tasti), makeKeymap(tasti), rowPins, colPins, RIGHE, COLONNE COLONNE ); keypad.addEventListener(keypadEvent);
keypad.getKey();
Creazione del tastierino numerico. Impostazione della funzione che viene richiamata al verificarsi dell'evento specificato, sull'oggetto specificato.
Comando per l’acquisizione della password da tastierino.
if(passwd_pos>20) { passw passwd_p d_pos os = 15; Ciclo IF di controllo del numero di caratteri della password inseriti. Se la condizione è verificata, si ha il reset della password e la invalidCode2(); passwd_p passwd_pos os = 15; visualizzazione della schermata iniziale. break; } switch switch (eKey){ (eKey){ case '#': passw passwd_p d_pos os = 15; checkPassword(); break; Ciclo Switch-Case per la conferma (#) e successivo controllo, o cancellazione(*) della case '*': password inserita. passwd_pos = 15;//* resetta la password password invalidCode2();
Elementi impiegati per la realizzazione del progetto
a) b)
a) Arduino Mega 2560 b) Sensore Infrarossi Infrarossi Piroelettrico
c)
c) Schermo LCD 20 x 4
d)
d) Orologio (RTC)
e) e) Tastiera numerica 4 x 4
f) Servo motore
f)
f) Servo motore
a)
Il servomotore è un dispositivo capace di eseguire dei movimenti meccanici in funzione del segnale applicato al suo ingresso. Sostanzialmente un servo è composto da un motore elettrico, un motoriduttore ed un circuito di feedback per la gestione della posizione. In commercio esiste una vasta scelta di servi, ciascuno caratterizzabile caratterizzabile per valore di coppia e precisione. Quindi le caratteristiche comuni comuni tra i servo sono principalmente l’angolo l’angolo di rotazione, la velocità di rotazione e la coppia motrice. I comuni servomotori hanno un angolo di rotazione di circa 180° (la rotazione effettiva è un po’ inferiore), inferiore), inoltre esistono altri tipi di servi che hanno una rotazione continua e, anziché pilotarne la posizione, se ne può gestire la velocità. Qualunque sia il servo scelto, si hanno sempre 3 contatti di cui due destinati all’alimentazione all’alimentazione (5V e GND) mentre il terzo è il pin di controllo che nel nostro caso andrà collegato al pin 8 di arduino. La complessità associata al loro impiego è dovuta alla necessità di impiegare impiegare un duty-cycle per impartire comandi a questi oggetti in grado di trasformare la volontà elettronica in
b) c) d) Arduino dispone, secondo i modelli, di uscite PWM ossia pin digitali in grado di generare generare un duty-cycle duty-cycle utilizzabile per far muovere un servo. Il modo più semplice per pilotare i servomotori è utilizzare una libreria che traduca angoli in segnali ed evitare di impiegare i duty-cycle e i relativi calcoli dei tempi. La libreria in questione e la
e)
#include Servo myservo; int pos = 90;
Inclusione libreria per il servomotore; Creazione di un oggetto "servo" per controllare il servomotore. Dichiarazione variabile intera associata alla posizione iniziale del servomotore.
myservo.attach(8); myservo.write(pos);
Assegnazione del pin di collegamento sulla scheda Arduino. Disposizione del servo in posizione iniziale.
int Posizione_servo; int incr; Posizione_servo = 60; Posizione_servo = 120;
Dichiarazione variabile intera associata alla posizione del servomotore. Dichiarazione variabile variabile intera " incr ". Disposizione del servomotore in posizione assegnata.
if (Posizione_servo > pos) { incr = 1; else { incr = -1; }
Ciclo IF di controllo della posizione del servomotore rispetto alla posizione iniziale e conseguente assegnazione assegnazione del valore della variabile variabile " incr ".
for (pos = pos; pos != Posizione_servo; pos += incr) { myservo.write(pos); delay(5); }
Disposizione del servomotore in posizione iniziale.
Elementi impiegati per la realizzazione del progetto
a) b)
a) Arduino Mega 2560 b) Sensore Infrarossi Infrarossi Piroelettrico
c)
c) Schermo LCD 20 x 4
d)
d) Orologio (RTC)
e) e) Tastiera numerica 4 x 4
f) Servo motore
f)
Flow Chart
Librerie e dichiarazione variabili #include #include #include #include #include #include "RTClib.h" Servo myservo; int pos= 90; int passwd passwd_po _poss = 15; in intt i; in intt t; in intt s; RTC_DS1307 RTC; Password password = Password( "1111" "1111" ); const byte RIGHE RIGHE = 4; const byte COLONNE COLONNE = 4; char tasti[RIGHE][COLONNE] = { { '1','2','3','A' } , { '4','5','6','B' } , { '7','8','9','C' } , { '*','0','#','D' } }; byte rowPins[RIGHE] = { 22, 23, 24, 25}; byte colPins[COLONNE] = { 26, 27, 28, 29}; Keypad keypad = Keypad( makeKeymap(tasti), rowPins, colPins, RIGHE, RIGHE, COLONNE );
LiquidCrystal LiquidCrystal lcd(12,11, lcd(12,11, 5, 4, 3, 2); int ledDelay ledDelay = 50; int redPin redPin = 38; 38; int bluePin bluePin = 30; 30; int greenPi greenPin n = 34; int Led_gar Led_garage age = 10; int Led_ca Led_cavea veau u = 6; int greenLE greenLED D = 48; int redLED redLED = 50; 50; int Pir_gar Pir_garage age = 9; int Pir_caveau= Pir_caveau= 7; int speaker speakerPin Pin = 43; int Stato_a Stato_alla llarme rme = 0; int zone = 0; int Allarme_attiv Allarme_attivo o = 0;
void setup() setup(){{ Serial.begin(9600); lcd.begin(20, 4); Wire.begin(); RTC.begin(); if (! RTC.isrunning()) RTC.isrunning()) { RTC.adjust(DateTime(__DATE__, __TIME__)); } myservo.attach(8); Schermata_iniziale();; Schermata_iniziale() pinMode(redPin, OUTPUT); pinMode(bluePin, OUTPUT); pinMode(redLED, OUTPUT); pinMode(greenLED, OUTPUT); pinMode(speakerPin, OUTPUT); pinMode(Led_garage, OUTPUT); pinMode(Led_caveau, OUTPUT); pinMode(Pir_garage, INPUT); pinMode(Pir_caveau, INPUT); digitalWrite(redLED, LOW); digitalWrite(greenLED, HIGH); keypad.addEventListener(keypadEvent keypad.addEventListener( keypadEvent); ); myservo.write(pos);
void keypadEvent keypadEvent(Keypa (KeypadEvent dEvent eKey){ void setup() setup(){{
void Schermata_iniziale() Schermata_iniziale(){{
Serial.begin(9600);
lcd.clear();
lcd.begin(20, 4);
lcd.setCursor(0,3);
Wire.begin();
lcd.print("Inserire PIN:");
RTC.begin();
lcd.setCursor(1,0);
if (! RTC.isrunning()) RTC.isrunning()) {
lcd.print("Video sorveglianza");
RTC.adjust(DateTime(__DATE__, __TIME__)); } myservo.attach(8); Schermata_iniziale();; Schermata_iniziale() pinMode(redPin, OUTPUT); pinMode(bluePin, OUTPUT); pinMode(redLED, OUTPUT); pinMode(greenLED, OUTPUT); pinMode(speakerPin, OUTPUT); pinMode(Led_garage, OUTPUT); pinMode(Led_caveau, OUTPUT); pinMode(Pir_garage, INPUT); pinMode(Pir_caveau, INPUT); digitalWrite(redLED, LOW); digitalWrite(greenLED, HIGH); keypad.addEventListener(keypadEvent keypad.addEventListener( keypadEvent); ); myservo.write(pos);
switch (keypad.getSta (keypad.getState()){ te()){ case PRESSED: lcd.setCursor((passwd_pos++),3); if(passwd_pos>20){
void invalidCode2() invalidCode2(){{
passwd_ passwd_pos pos = 15;
password.reset();
invalidCode2();; invalidCode2()
lcd.clear();
passwd_pos passwd_pos = 15;
Schermata_iniziale();; Schermata_iniziale()
lcd.setCursor(4,1);
break;
}
lcd.print("Casa Laplace");
}
}
switch (eKey){ (eKey){ case '#': passwd passwd_po _poss = 15; checkPassword();; checkPassword() break; case '*': passwd passwd_po _poss = 15; invalidCode2();; invalidCode2() passwd_pos passwd_pos = 15; break; default: password.append(eKey); lcd.print("*"); }
void keypadEvent keypadEvent(Keypa (KeypadEvent dEvent eKey){ switch (keypad.getSta (keypad.getState()){ te()){ case PRESSED: lcd.setCursor((passwd_pos++),3); if(passwd_pos>20){
void invalidCode2() invalidCode2(){{
passwd passwd_po _poss = 15;
password.reset();
invalidCode2();; invalidCode2()
lcd.clear();
passwd_pos passwd_pos = 15;
Schermata_iniziale();; Schermata_iniziale()
break;
}
void checkPassword() checkPassword(){{ if (password.eva (password.evaluate()) luate()){{ if(Allarme_at if(Allarme_attivo tivo == 0 && Stato_allarme Stato_allarme == 0){
}
activate();; activate()
switch (eKey){ (eKey){
}
case '#': passwd_ passwd_pos pos = 15;
else if( Allarme_atti Allarme_attivo vo == 1 || Stato_allarme Stato_allarme == 1) { deactivate();; deactivate()
checkPassword();; checkPassword()
}
break; }
case '*': passwd_ passwd_pos pos = 15;
else { invalidCode();; invalidCode()
invalidCode2();; invalidCode2()
}
passwd_pos passwd_pos = 15; break; default: password.append(eKey); lcd.print("*"); }
}
void activate() activate(){{ if((digitalRead(Pir_garage) == LOW) && (digitalRead(Pir_caveau) == LOW)){ digitalWrite(redLED, HIGH); digitalWrite(greenLED, LOW); digitalWrite(8, HIGH); lcd.clear(); void checkPassword() checkPassword(){{
void deactivate() deactivate(){{
lcd.setCursor(3,0);
if (password.ev (password.evaluate()) aluate()){{
Stato_allarme Stato_allarme = 0;
lcd.print("ALLARME ATTIVO");
if(Allarme_at if(Allarme_attivo tivo == 0 && Stato_allarme Stato_allarme == 0){
digitalWrite(redLED, LOW);
Allarme_attiv Allarme_attivo o = 1;
activate();; activate()
digitalWrite(greenLED, HIGH);
password.reset();
}
lcd.clear();
delay(2000);
void invalidCode() invalidCode(){{
lcd.setCursor(0,0);
}
deactivate();; deactivate()
password.reset();
lcd.print("ALLARME DISATTIVATO");
}
lcd.clear();
digitalWrite(speakerPin, LOW);
deactivate();; deactivate()
lcd.setCursor(3,0);
Allarme_attiv Allarme_attivo o = 0;
}
lcd.print("CODICE ERRATO");
password.reset();
invalidCode();; invalidCode()
lcd.setCursor(1,1);
delay(5000);
}
lcd.print("REINSERIRE CODICE");
Schermata_iniziale();; Schermata_iniziale()
digitalWrite(greenLED, LOW);
}
else if( Allarme_att Allarme_attivo ivo == 1 || Stato_allarme Stato_allarme == 1) {
} else {
}
digitalWrite(redLED, HIGH); delay(2000); digitalWrite(redLED, LOW); delay(1000);
else{
}
void loop( loop()){
Serial.println(digitalRead(Pir_garage));
DateTime DateTime now = RTC.now() RTC.now();;
Serial.println(digitalRead(Pir_caveau));
lcd.setCursor(0,2);
if (Allarme_atti (Allarme_attivo vo == 1){ 1){
if(now.day()<10)lcd.print(0);
if (digitalRead(Pir (digitalRead(Pir_garage) _garage) == HIGH){ HIGH){
lcd.print(now.day(),DEC);
zone = 0;
lcd.print("/");
alarmTriggered();; alarmTriggered()
if(now.month()<10)lcd.print(0);
}
lcd.print(now.month(),DEC);
if (digitalRead(Pir_caveau) == HIGH){
lcd.print("/");
zone = 3;
lcd.print(now.year(),DEC);
alarmTriggered();; alarmTriggered()
lcd.setCursor(12,2);
}
if(now.hour()<10)lcd.print(0);
}
lcd.print(now.hour(),DEC);
}
lcd.print(":"); if(now.minute()<10)lcd.print(0); lcd.print(now.minute(),DEC); lcd.print(":"); if(now.second()<10)lcd.print(0); lcd.print(now.second(),DEC); keypad.getKey();
lcd.print(now.hour(),DEC); void alarmTriggered() alarmTriggered(){{
lcd.print(":");
Serial.println(digitalRead(Pir_garage));
int Posizione_ser Posizione_servo; vo;
if(now.minute()<10)lcd.print(0);
incr incr = 1;
Serial.println(digitalRead(Pir_caveau));
int incr; incr;
lcd.print(now.minute(),DEC);
}
if (Allarme_atti (Allarme_attivo vo == 1){ 1){
DateTime DateTime now = RTC.now() RTC.now();;
digitalWrite(Led_garage, HIGH);
digitalWrite(redPin, HIGH);
delay(1000);
incr incr = -1;
zone = 0;
password.reset();
}
}
alarmTriggered();; alarmTriggered()
Stato_allarme Stato_allarme = 1;
else if(zone == 3){
}
lcd.clear();
Posizione_se Posizione_servo rvo = 120;
myservo.write(pos);
lcd.setCursor(0,0);
lcd.print("Caveau");
delay(5);
zone = 3;
lcd.print("INFRAZIONE RILEVATA!");
lcd.setCursor(0,3);
}
alarmTriggered();; alarmTriggered()
lcd.setCursor(7,1);
lcd.print("ULT.INF.");
{
}
if(zone == 0){
if(now.day()<10)lcd.print(0);
StrokeLight();; StrokeLight()
if (digitalRead(Pir_garag e) == HIGH){
if (digitalRead(Pir (digitalRead(Pir_caveau) _caveau) == HIGH){ HIGH){
if (Posizione_s (Posizione_servo ervo > pos) pos) {
else {
for (pos= pos; pos pos != Posizione_s Posizione_servo; ervo; pos+= incr) {
}
Posizione_se Posizione_servo rvo = 60;
lcd.print(now.day(),DEC);
}
}
lcd.print("Garage");
lcd.print("/");
{
lcd.setCursor(0,3);
if(now.month()<10)lcd.print(0);
speaker();; speaker()
lcd.print("ULT.INF.");
lcd.print(now.month(),DEC);
}
if(now.day()<10)lcd.print(0);
lcd.setCursor(15,3);
{
lcd.print(now.day(),DEC);
if(now.hour()<10)lcd.print(0);
digitalWrite(Led_garage, LOW);
lcd.print("/");
lcd.print(now.hour(),DEC);
digitalWrite(Led_caveau, LOW);
if(now.month()<10)lcd.print(0);
lcd.print(":");
}
lcd.print(now.month(),DEC);
if(now.minute()<10)lcd.print(0);
lcd.setCursor(15,3);
lcd.print(now.minute(),DEC);
if(now.hour()<10)lcd.print(0);
digitalWrite(Led_caveau, HIGH);
}
void StrokeLight() StrokeLight(){{
if (Posizione_se (Posizione_servo rvo > pos) pos) {
digitalWrite(redPin, HIGH);
incr= 1;
delay(ledDelay);
}
digitalWrite(redPin, LOW); delay(ledDelay);
else { incr= -1;
digitalWrite(redPin, HIGH);
}
delay(ledDelay);
for (pos= pos; pos pos != Posizione_se Posizione_servo; rvo; pos+= incr) { myservo.write(pos);
void speaker() speaker(){{ for(t=0;t<3;t++){ for(i=0;i<350;i++){
delay(5);
digitalWrite(43,HIGH);
}
delay(1);
{
digitalWrite(redPin, LOW); delay(ledDelay); digitalWrite(redPin, HIGH); delay(ledDelay); digitalWrite(redPin, LOW); delay(ledDelay);
StrokeLight();; StrokeLight()
digitalWrite(43,LOW);
}
delay(1);
{
}
delay(10);
speaker();; speaker()
delay (50);
}
for(i=0;i<150;i++){
digitalWrite(bluePin, HIGH); delay(ledDelay); digitalWrite(bluePin, LOW); delay(ledDelay);
{
digitalWrite(43,HIGH);
digitalWrite(bluePin, HIGH);
digitalWrite(Led_garage, LOW);
delay(2);
delay(ledDelay);
digitalWrite(Led_caveau, LOW);
digitalWrite(43,LOW);
digitalWrite(bluePin, LOW);
}
delay(2);
delay(ledDelay);
}
}
delay(50); }
digitalWrite(bluePin, HIGH); delay(ledDelay); digitalWrite(bluePin, LOW);
Grazie per la cortese attenzione!