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