Progetto di Domotica
Progetto di Domotica
Titolo dell’esercitazione: Progetto di Domotica
Descrizione sommaria dell’esperienza:
Realizzazione di un circuito che permette il controllo di vari sensori all’interno di un
edificio. Il valore di ogni singolo sensore sarà consultabile localmente, tramite display LCD, o da
remoto, tramite WEB Server.
a) Elenco dei componenti e della strumentazione
Per la realizzazione del circuito sono stati impiegati i seguenti componenti:
Nr.
1
8
2
1
1
1
1
1
Descrizione
Arduino Nano v 3.0
LED (gialli)
Switch (DIP switch con 4 interruttori)
Sensore di temperature (LM35)
Sensore di movimento
Sensore di Gas
Sensore di luce ambientale
Sensore di suono
Tipo
Strumentazione
Componente
Componente
Componente
Componente
Componente
Componente
Componente
Definizioni:
• Arduino (Nano v 3.0): è un framework (struttura di supporto su cui il software può
essere organizzato e progettato) open source che permette di realizzare prototipi e di
apprendere i principi fondamentali dell’elettronica e della programmazione. La scheda
Progetto di domotica
1/7
Progetto di Domotica
programmabile Arduino è basata su un circuito
stampato che integra un microcontrollore con PIN
connessi alle porte I/O, un regolatore di tensione e
un’interfaccia USB tramite la quale è possibile caricare i
programmi scritti a computer.
• LED: (o diodo a emissione luminosa) è un dispositivo che
sfrutta le proprietà ottiche di alcuni materiali semiconduttori
per produrre fotoni attraverso il fenomeno dell’emissione
spontanea.
• Switch (DIP switch): è un componente impiegato nei circuiti
elettronici. È formato da un gruppo di interruttori incapsulati in
un singolo contenitore, dotato di terminali disposti su due file a
distanza normalizzata. Questo componente integra quindi più
interruttori (ON/OFF) in un solo involucro. Permette quindi di
controllare lo stato di più componenti contemporaneamente (es
due lampadine).
Prima di introdurre i sensori e il loro utilizzo occorre precisare il termine sensore:
• Sensore: è un trasduttore uvvero un dispositivo che permette di convertire una
grandezza fisica in una grandezza elettrica.
I sensori utilizzati nel progetto saranno quindi i seguenti:
o Sensore di temperatura (LM35): fornisce una tensione
proporzionale alla temperatura rilevata con una sensibilità di 10
mV per grado centigrado (sulla scala Celsius).
o Sensore di movimento: scatta una fotografia della stanza ogni 1-2
secondi. Se, confrontando le immagini, viene captata qualche
differenza verrà mandato in uscita il segnale basso.
o Sensore di Gas: è in grado di rilevare
fumo, metano, anidride carbonica e
altri gas.
o Sensore di suono: permette, tramite l’utilizzo di un microfono e di un
amplificatore, di convertire il segnale sonoro in segnale analogico.
Progetto di domotica
2/7
Progetto di Domotica
o Sensore di luce ambientale: permette di rilevare l’intensità della
luce tramite una foto-resistenza (che varierà il suo valore in ohm
proporzionalmente alla luce che la colpisce).
b) Analisi di alto livello e schema del circuito
Il circuito verrà realizzato in due parti:
o Parte per la visualizzazione dei valori da locale
o Parte per la visualizzazione dei valori da remoto (sviluppi futuri)
Analisi delle due parti del circuito:
o La parte per la visualizzazione dei dati da locale consiste in un circuito formato da un
display LCD che riporterà lo stato e i valori restituiti dai sensori:
Luce (ON-OFF): indica se le luci sono accese o spente all’interno dell’edificio
Alert: indica se l'allarme per le intrusioni è stato attivato
Alarm: indica se l'allarme per fughe di gas è stato attivato
Gas (ON-OFF): indica lo stato di eventuali fughe di gas. Se sono presenti fughe di
gas e se è attivo l’allarme verrà emesso un segnale acustico
Movimento (ON-OFF): indica se sono stati rilevati movimenti all’interno
dell’edificio. Se è attivo lo switch “alert” allora, quando verrà rilevato un
movimento, suonerà l’allarme.
Auto (ON-OFF): indica se le luci crepuscolari sono attive. Questa funzione
permette, quindi, di accendere le luci in modo automatico.
Knock (numero): indica quante volte si bussa alla porta
Temperatura (numero): indica la temperatura presente nell’edificio.
o La parte per la visualizzazione dei dati da remoto consiste nella visualizzazione dei
valori letti dai sensori tramite il nostro browser. Questa funzione è possibile
Progetto di domotica
3/7
Progetto di Domotica
utilizzando uno shield per Arduino che aggiunge un connettore RJ45 (presa Ethernet)
al nostro microprocessore.
Su una pagina internet verranno visualizzati i valori inviati da Arduino:
Temperatura: visualizza la temperatura presente nell’edificio
Luce: visualizza se le luci all’interno dell’edificio sono accese o spente e se sono in
modalità automatica o no
Movimento: visualizza se sono presenti spostamenti all’interno della casa e se
l’allarme è attivo
Gas: visualizza il valore di gas presente nell’edificio e se è attivo l’allarme.
Suono: visualizza il numero di bussate alla porta.
Stato degli switch: visualizza lo stato degli allarmi e luce
Progetto di domotica
4/7
Progetto di Domotica
c) Procedimento
Circuito locale:
o Utilizzando la guida presente sul sito di Arduino
(http://arduino.cc/en/Tutorial/LiquidCrystal) è stato possibile realizzare primi
esempi di funzionamento del display e, successivamente, la visualizzazione del
seguente “menu” definitivo riportante il valore dei sensori:
Realizzazione del programma per la consultazione dei dati da locale:
Il programma per la visualizzazione dei dati su LCD è stato realizzato basandosi su alcune
delle semplici funzioni fornite dall’ambiente Arduino:
o digitalRead(pin): permette la lettura di un dato digitale su un determinato pin
o digitalWrite(pin, stato): permette la scrittura di un dato digitale su un determinato pin.
È inoltre necessario specificare lo stato del pin considerato che, essendo digitale, potrà
assumere uno di due possibili valori: HIGH o LOW
o analogRead(pin): permette la lettura di un dato analogico su un determinato pin
o lcd.begin(colonne, righe): permette di inizializzare le dimensioni del display
o lcd.setCursor(colonna, riga): permette di posizionarsi in una determinata cella del
display LCD specificando la colonna e la riga
o lcd.print(): permette di stampare una stringa o un valore
Per poter ottenere quindi la visualizzazione dei valori sul display è bastato collegarlo (come
mostrato nell'immagine sottostante)
e combinare le istruzioni in modo da visualizzare:
Progetto di domotica
5/7
Progetto di Domotica
• un menu fisso: in modo da non dover riscrivere ogni volta le medesime stringhe. Il menu
è composto dalle scritte come: “Luci:”,”Gas:”,”Alert:” ..
• il valore restituito da ogni sensore: i sensori saranno collegati ognuno a un piedino
analogico differente. Da programma basterà soltanto leggere tramite analogRead(pin) il
valore presente sul pin e stamparlo tramite lcd.print(valore) nella corretta posizione.
Esempio: si vuole mostrare il valore restituito dal sensore di temperatura.
Verrà prima letto il valore mediante l’istruzione analogRead(sensore_temperatura);
Successivamente ci si posiziona sul display nella cella dove mostrare il valore letto con
l'istruzione lcd.setCursor(17,3)
Stampare il valore mediante l’istruzione lcd.print(valore_temperatura).
Fasi per la realizzazione del programma:
Includere la libreria <LiquidCrystal.h> che permette il corretto funzionamento del
display a cristalli liquidi
Per poter funzionare correttamente il display necessita di quattro piedini per il
trasporto dei dati (D2, D3, D4, D5) e due per le operazioni di lettura e scrittura (D11,
D12). Saranno tutti inizializzati creando la variabile di tipo LiquidCrystal: LiquidCrystal
lcd(12, 11, 5, 4, 3, 2)
Dichiarare le variabili per la memorizzazione del valore dei sensori. La dichiarazione è
analoga per ogni sensore, cambierà solo il nome della variabile e il piedino assegnato:
Esempio: int sensore_luce = A0;
Impostare le dimensioni del display tramite lcd.begin(20, 4);
Leggere i valori dai sensori e salvarli nelle corrispondenti variabili. Le variabili
verranno dichiarate nella procedura loop del programma e serviranno per operare
sui dati forniti.
esempio: int luce = analogRead(sensore_luce);
Il valore restituito verrà poi “analizzato” in una serie di condizioni (istruzioni if) per
poter, per esempio, stabilire se il sensore è acceso o spento. Anche questo
procedimento risulta analogo per ogni sensore. Infatti ogni sensore è collegato a
un piedino analogico, quindi può restituire un intervallo di valori. È quindi
necessario scegliere, in base all'utilizzo e alla sensibilità desiderata, il valore soglia
per discriminare i valori letti. Dopo i controlli sul valore potremo quindi stampare la
stringa più adatta ottenendo il seguente risultato:
Progetto di domotica
6/7
Progetto di Domotica
Realizzazione del programma per la consultazione dei dati da remoto:
Il programma per la visualizzazione dei
dati tramite browser è stato realizzato
basandosi principalmente su alcune
semplici funzioni fornite dall’ambiente
Arduino. Tali funzioni consentono di
realizzare un vero e proprio web server. Per
evitare eccessivi carichi si è deciso di non
far produrre l’intera pagina web
all’arduino ma si è preferito generare un
array di valori in Javascript che un web
server di frontend, mediante una pagina
dinamica scritta in php rielabora e
presenta in maniera più leggibile i valori e
gli stati degli switch.
Con lo shield ethernet viene fornita a corredo una libreria che consente la realizzazione
delle funzioni di base disponibili nel protocollo di rete TCP/IP. Vediamone alcune di
esempio:
o EthernetServer server(80): permette di dichiarare la porta che si intende usare
per il web server
o Ethernet.begin(mac, ip): permette, dopo aver dichiarato l’ip desiderato e il mac
di assegnare all’arduino l’ip e il mac address passati come parametri.
server.begin(): permette di avviare il web server su arduino.
o EthernetClient client: dichiarazione di una variabile per gestire un client ethernet
o client.println(dati): permette di scrivere sullo stream del server web i dati
La pagina sul portatile è stata realizzata con php utilizzando un server Apache. Mediante
la seguente istruzione la pagina php legge il vettore javascript prodotto dal web server
installato sull’Arduino.
$ValoriArduino = file_get_contents('http://192.168.1.177/index.htm');
L’indirizzo 192.168.1.177 è l’ip associato all’Arduino.
d) Verifica sperimentale del funzionamento e osservazioni personali
Il circuito funziona correttamente nella sua implementazione locale con display LCD. Per
la parte WEB è stato realizzato un prototipo completo composto da un web server su
arduino e una pagina web di presentazione dei dati su Apache (nel portatile).
Progetto di domotica
7/7