Visualizzazione post con etichetta domotica. Mostra tutti i post
Visualizzazione post con etichetta domotica. Mostra tutti i post

lunedì 22 settembre 2014

Domotica - Controllo remoto

Il controllo remoto delle luci è ottenuto grazie all’utilizzo della scheda aggiuntiva di Arduino chiamata “Ethernet Shield”. Impostando l’indirizzo IP del router a cui è collegato Arduino, ci si potrà , grazie ad una connessione internet e un browser, collegare al sistema  e comandare l’accensione e lo spegnimento delle luci all’interno della casa.
Grazie al controllo remoto è possibile controllare la nostra abitazione anche a distanza, ad esempio chi possiede una casa in montagna può attivare il riscaldamento a distanza in modo da trovare una temperatura accogliente una volta raggiunta la destinazione.

PROGRAMMA ARDUINO

#include <SPI.h>
#include <Ethernet.h>
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = {192, 168, 9, 55 };
byte subnet[] = {255, 255, 255, 0 };
EthernetServer server(80);
String readString;
byte out_1 = 7;
byte out_2 = 6;
byte out_3 = 5;
byte out_4 = 4;
byte out_5 = 3;

void setup() {

Ethernet.begin(mac, ip);

pinMode (out_1, OUTPUT);
pinMode (out_2, OUTPUT);
pinMode (out_3, OUTPUT);
pinMode (out_4, OUTPUT);
pinMode (out_5, OUTPUT);
}

void loop() {

EthernetClient  client = server.available();

  if (client) {
    boolean currentLineIsBlank = true;

    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        readString.concat(c);  
        if (c == '\n' && currentLineIsBlank) {

          if(readString.indexOf("on_1") > 0) {
            digitalWrite(out_1, HIGH);
            delay(325);
            digitalWrite(out_1, LOW);
            }       
          if(readString.indexOf("off_1") > 0) {
            digitalWrite(out_1, HIGH);
            delay(325);
            digitalWrite(out_1, LOW);
            }         
          if(readString.indexOf("on_2") > 0) {
            digitalWrite (out_2, HIGH);
            delay (325);
            digitalWrite (out_2, LOW);
            }       
          if(readString.indexOf ("off_2") > 0) {
            digitalWrite (out_3, HIGH);
            delay (325);
            digitalWrite (out_3, LOW);
            }
          if(readString.indexOf ("on_3") > 0) {
            digitalWrite (out_3, HIGH);
            delay (325);
            digitalWrite (out_3, LOW);
            }
          if(readString.indexOf ("off_3") > 0) {
            digitalWrite (out_4, HIGH);
            delay (325);
            digitalWrite (out_4, LOW);
            }
          if(readString.indexOf ("on_4") > 0) {
            digitalWrite (out_4, HIGH);
            delay (325);
            digitalWrite (out_4, LOW);
            }
          if(readString.indexOf ("off_4") > 0) {
            digitalWrite (out_4, HIGH);
            delay (325);
            digitalWrite (out_4, LOW);
            }
          if(readString.indexOf ("on_5") > 0) {
            digitalWrite (out_5, HIGH);
            delay (325);
            digitalWrite (out_5, LOW);
            }       
          if(readString.indexOf ("off_5") > 0) {
            digitalWrite (out_5, HIGH);
            delay(325);
            digitalWrite (out_5, LOW);
            }

Parte dedicata al rilevamento della selezione dalla pagina HTML all'azionamento vero e proprio dell'azione fisica, accensione/spegnimento luci.

          client.println("HTTP/1.1 200 OK");
          client.println ("Content-Type: text/html");
          client.println ();
          client.print ("<html><head><title>CASA DOMOTICA</title><meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1' ></head><body>");
          client.print("<BR><BR>");
          client.print ("<h2>Controllo remoto</h2>");
          client.print ("<p>");
          client.print ("<br>");
          if (digitalRead(2)== true) client.print ("<a href=/?off_1><strong>PULSANTE</strong>"); 
          else client.print ("<a href=/?on_1><strong>PULSANTE</strong>");
          client.print ("<-- LUCE BAGNO");
          client.print ("<br>");
          if (digitalRead(3)== true) client.print ("<a href=/?off_2><strong>PULSANTE</strong>"); 
          else client.print ("<a href=/?on_2><strong>PULSANTE</strong>");
          client.print ("<-- LUCE CORRIDOIO");
          client.print ("<br>");
          if (digitalRead(4)== true) client.print ("<a href=/?off_3><strong>PULSANTE</strong>"); 
          else client.print ("<a href=/?on_3><strong>PULSANTE</strong>");
          client.print ("<-- LUCE CAMERA");
          client.print ("<br>");
          if (digitalRead(5)== true) client.print ("<a href=/?off_4><strong>PULSANTE</strong>"); 
          else client.print ("<a href=/?on_4><strong>PULSANTE</strong>");
          client.print ("<-- LUCE CUCINA");
          client.print ("<br>");
          if (digitalRead(6)== true) client.print ("<a href=/?off_5><strong>PULSANTE</strong>"); 
          else client.print ("<a href=/?on_5><strong>PULSANTE</strong>");
          client.print ("<-- LUCE SALOTTO");
          client.print ("<br>");
          client.println("</body></html>");

          readString="";
          delay(5);

          client.flush();
          client.stop();
        }
      }
    }

}

Parte di programma utilizzata per la creazione della pagina HTML, visualizzabile dal browser, per l'accensione e lo spegnimento delle luci da remoto. Il risultato ottenuto è questo:

Domotica - Controllo tenda

L’innalzamento e l’abbassamento della tenda è ottenuto tramite pulsanti fisici inoltre se la tenda è del tutto abbassata e si preme il pulsante per abbassarla, il programma non farà nulla; lo stesso avviene per la tenda del tutto avvolta.Sono presenti due sensori: un anemometro, che permette alla centralina di determinare la velocità del vento, e un pluviostato, speciale trasduttore che riesce a determinare se sta piovendo oppure no  grazie al variare della sua resistenza. Questi due sensori tengono sotto controllo le condizioni ambientali esterne, non appena uno dei due rileva un  valore che supera quello prefissato nel programma la tenda viene riavvolta automaticamente per evitare danni.

Programma Arduino

const int btSuTenda = 5;
const int SuTendaPin = 22;
int StTSu = 0;
const int btGiuTenda = 6;
const int GiuTendaPin = 52;
int StTGiu = 0;
int StTenda = 0;

void setup() {
pinMode (btSuTenda, INPUT);
pinMode (btGiuTenda, INPUT);
pinMode (SuTendaPin, OUTPUT);
pinMode (GiuTendaPin, OUTPUT);
pinMode (pluvPin, INPUT);
pinMode (AnPin, INPUT);
}

void loop() {
ce = 0;
  t = millis();
  for (se = 0; se < 10000; se++) {  
    state = digitalRead(AnPin);
    if (state != oldstate) {
      ce++;
      oldstate = state;
    }
  }
  t = millis() - t;
  ce = ce / 2;
  f = 1000 * ce / t;

Questo ciclo for all'interno del programma rappresenta il contatore della frequenza di un treno di impulsi (segnali ottenuti dal pluviostato) in ingresso in una entrata digitale. Quest'azione viene ripetuta sempre durando 10000 cicli. Durante questo tempo il programma conta gli impulsi in ingresso e tramite opportuni calcoli matematici li trasforma in frequenza. 

  StTGiu = digitalRead(btGiuTenda);
  StTSu = digitalRead (btSuTenda);
  if ((StTGiu == HIGH) && (StTenda == 0)) {
    digitalWrite(GiuTendaPin, HIGH);
    delay(9500);
    digitalWrite(GiuTendaPin, LOW);
    StTenda = 1;
    delay(50);
  }

Parte di programma che abbassa la tenda non appena si pigia il pulsante, L'azione viene completata solamente se la tenda è alzata (stato definito dalla variabile StTenda, variabile a 0 la tenda è alzata mentre se la variabile è a 1 la tenda è abbassata).

  if ((StTSu == HIGH) && (StTenda == 1)) {
    digitalWrite(SuTendaPin, HIGH);
    delay(9500);
    digitalWrite(SuTendaPin, LOW);
    StTenda = 0;
  }

Parte di programma che alza la tenda non appena si pigia il pulsante, L'azione viene completata solamente se la tenda è abbassata (stato definito dalla variabile StTenda, variabile a 0 la tenda è alzata mentre se la variabile è a 1 la tenda è abbassata).

  if ((StTenda == 1) && ((analogRead(pluvPin) < 500) || (f >= 4))) {
    digitalWrite(SuTendaPin, HIGH);
    delay(9500);
    digitalWrite(SuTendaPin, LOW);
    StTenda = 0;
  }
}

Parte in cui se il programma riconosce che la tenda è abbassata e se la lettura del pluviostato è al di sotto di un determinato valore (fissato da noi per far riconoscere al programma che sta piovendo) oppure se la frequenza in ingresso dall'anemometro è troppo alta la centralina alzerà automaticamente la tenda per evitare danni. 

Domotica - Sistema anti intrusione

La casa è protetta da un antifurto perimetrale composto da reed (contatti magnetici) applicati a ogni
finestra. I contatti magnetici sono particolari interruttori che permettono il passaggio della corrente
a seconda che un magnete sia allontanato o avvicinato al dispositivo, in questo caso esso è posto su un oggetto mobile (porta o finestra). Mentre il sistema è abilitato, non appena una finestra o
porta viene aperta, l’allarme si attiva con una segnalazione acustica, ottenuta tramite un campanello, e da una segnalazione visiva data da una luce lampeggiante. Il sistema anti intrusione è attivabile e disattivabile tramite tastierino numerico, digitando una password. Il programma visualizza lo stato dell’allarme sul display della centralina.

Programma Arduino

#include <Keypad.h>
#define sirena 24
#define LEDA 17
#define mg1 4
#define mg2 3
#define mg3 2
#define mg4 44
#define mg5 45
#define mg6 14
#define mg7 15
#define mg8 16
int x = 0;
int y = 0;
int m = 0;
const byte ROWS = 4;
const byte COLS = 3;
char keys[ROWS][COLS] = {
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'*','0','#'}
};
byte rowPins[ROWS] = {34, 35, 36, 37};
byte colPins[COLS] = {38, 39, 40};
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

void setup() {
pinMode(LEDA, OUTPUT);
pinMode (sirena, OUTPUT);
pinMode (mg1, INPUT);
pinMode (mg2, INPUT);
pinMode (mg3, INPUT);
pinMode (mg4, INPUT);
pinMode (mg5, INPUT);
pinMode (mg6, INPUT);
pinMode (mg7, INPUT);
pinMode (mg8, INPUT);
keypad.addEventListener(keypadEvent);
}

void loop() {
char key = keypad.getKey();
  pinMode ( x == 0) {
    lcd.setCursor(0, 0);
    lcd.print("CASA DOMOTICA   ");
    lcd.setCursor(0, 1);
    lcd.print("allarme off     ");
  }
  else {
    lcd.setCursor(0, 0);
    lcd.print("CASA DOMOTICA   ");
    lcd.setCursor(0, 1);
    lcd.print("allarme on      ");
  }
  if ( (digitalRead(mg1) == LOW) || (digitalRead (mg2) == LOW) || (digitalRead (mg3) == LOW) || (digitalRead (mg4) == LOW) || (digitalRead (mg5) == LOW) || (digitalRead (mg6) == LOW) || (digitalRead (mg7) == LOW) || (digitalRead (mg8) == LOW)) {
    y = 1;
  }
  else {
    y = 0;
  }
  if (( y == 1) && ( x == 1)) {
    do {
      digitalWrite(sirena, HIGH);
      do {
        digitalWrite(LEDA, HIGH);
        delay(100);
        digitalWrite(LEDA, LOW);
        delay(100);
        m = m + 1;
      }
      while (m < 1);
      m = 0;
      char key = keypad.getKey();
    }
    while (x == 1);
    digitalWrite(sirena, LOW);
    digitalWrite(LEDA, LOW);
  }
}
void keypadEvent(KeypadEvent key) {
  switch (keypad.getState()) {
    case PRESSED:
      if (key == '#') {
        x = !x;
      }
      break;
  }
}

giovedì 5 giugno 2014

Domotica - Applicazioni reali

Abbiamo pensato (e realizzato) il nostro progetto in modo tale che sia facilmente applicabile in una situazione reale. Tutti gli INPUT e OUTPUT della scheda Arduino possono essere dati da relè posti in un quadro centrale. Tutti i pulsanti dislocati all'interno dell'abitazione, quando premuti, danno una tensione necessaria ai relè per commutare, i quali daranno in ingresso alla scheda i necessari 5 V in corrente continua. Per quanto riguarda le uscite la scheda relè compatibile con Arduino può essere utilizzata per pilotare altri relè che lavorano alla tensione di rete di 230 V in corrente alternata. L'idea è di utilizzare relè a 12 Vca oppure 24 Vca, una tensione molto più bassa di quella di rete ottenendo così una maggior sicurezza dell'impianto e ottenendo anche un isolamento per quanto riguarda i vari comandi digitali da quelli di potenza a 230 V.
Sotto potete trovare un semplice schema che rappresenta l'idea descritta sopra


Per quanto riguarda i segnali di tipo analogici, come il sensore di temperatura, la fotoresistenza del vialetto ed altri sensori aggiuntivi, per evitare interferenze o perdita di segnale dovute a grandi distanze è preferibile utilizzare più schede Arduino collocate in prossimità di questi, così che il segnale arrivi al suo controllore, venga letto e che il programma esegua le relative istruzioni in base ai valori elaborati.

sabato 22 febbraio 2014

Domotica - Modellino Casa

Per illustrare il nostro progetto, la realizzazione di un impianto domotico con Arduino, alla commissione d'esame abbiamo deciso di realizzare il modellino di una casa. Con questo modello illustreremo l'accensione delle luci di ogni singola stanza e del vialetto tramite la fotoresistenza, il sistema anti intrusione, il controllo di una tenda su porta finestra e faremo vedere anche il relativo controllo remoto.

Tutto ebbe inizio con la decisione delle varie grandezze del modellino, tutte scritte sul pianale in legno su cui erge la nostra "casa"
Misure cucina
Dimensioni camera e corridoio
Posizione della porta d'ingresso (destra) e della porta finestra della cucina (in basso) 
Posizione delle finestre del salotto
Dimensioni bagno e corridoio

Dopo aver deciso tutte le varie misure ci siamo procurati il compensato, disegnato su di esso le varie pareti con porte e finestre, lo abbiamo fatto tagliare e questo è il risultato
Modellino con pareti montate
Procurati anche i contatti magnetici ad incasso c'è venuta la bella idea di "incassarli" nelle pareti del modellino, e così abbiamo fatto. L'alloggiamento dei contatti lo abbiamo fatto grazie ad una piccola fresa per modellismo, il risultato ottenuto non è niente male 
Prove per l'incasso dei contatti

Contatto magnetico inserito nel suo alloggiamento

Contatti inseriti sia sulla finestra che sotto


Contatti stuccati al legno

Risultato ottenuto una volta asciugato lo stucco
Vista vialetto e contatti magnetici inseriti nel pavimento

Vista interna della cucina

Vista del resto delle stanze
Cassone aperto
Abbiamo voluto dare un tocco di classe al modellino, perchè non farlo mettendo un bel parquet in mogano?
Pavimento e LED


Preparazione del fondo per l'erba 

Pulsanti e tastierino numerico posizionati

Posizionamento delle canaline che andranno a contenere i vari cavi di collegamento

Anemometro, pluviostato e foto resistenza

Prova dei LED del vialetto

Sensore di temperatura e ventola per la simulazione del condizionamento

Tenda della cucina come dovrebbe apparire totalmente abbassata

Tenda della cucina come dovrebbe apparire totalmente alzata
Il modellino terminato