PROGETTO DI DOMOTICA



Codice del progetto di domotica per gestire la visualizzazione dei sensori sul display LCD

/*
  Versione: 15/06/2012
  Gestione OUTPUT su LCD
*/

// Libreria LCD:
#include <LiquidCrystal.h>

// Inizializzo rispettando il numero dei pin collegati all'LCD
LiquidCrystal mylcd(12, 11, 5, 4, 3, 2);
void ScriviLCD(int c, int r, char *s)
{
   mylcd.setCursor(c, r);
   mylcd.print(s); // metto Auto ON
}

// ----------------------------------------------
// PARTE IN COMUNE CON Versione WEB
// Variabili del mio progetto
// ----------------------------------------------
int ContaCicli;
int luce=0, gas=0, suono=0, mov=0, temp=0;
char buffer[10]; 
// ----------------------------------------------
// sezione relativa al SENSORE LUCE
// ----------------------------------------------
#define led_pin     6 // led che simula una lampadina di illuminazione accesa
#define on_off      7 // la lampadina si accende con l'uso del dipswitch
#define auto        8 // uso il sensore di luce
int sensore_luce  = A0;
// Variabili Switch
int OnOff=-1;
int Auto=-1;
const int soglia_buio  = 600;
const int cst_accendiluce = 1;
const int cst_spegniluce = 0;
void CosaFai(int CosaFaccio,int lux)
{
  if (CosaFaccio==cst_accendiluce)
  {
     ScriviLCD(6,0,"ON ");
     digitalWrite(led_pin, HIGH); // Accende la lampadina
  }
  else
  {
     ScriviLCD(6,0,"OFF");
     digitalWrite(led_pin, LOW); // spegne la lampadina
  }
}
int controlla_luce()
{
  #ifdef DEBUG
  return(0);
  #endif
  int luce  = analogRead(sensore_luce);
  //Serial.print("Luce: ");
  //Serial.println(luce,DEC);
  OnOff=digitalRead(on_off);
  Auto=digitalRead(auto);
  if (Auto==1)
     ScriviLCD(6,3,"ON "); // metto Auto ON
  else
     ScriviLCD(6,3,"OFF"); // metto Auto OFF
  if (OnOff==1)
     CosaFai(cst_accendiluce,luce);
  else   // OnOff spento o 0
  {
    if (Auto==1)
    {
      if(luce>soglia_buio) // Valori Alti => + buio
        CosaFai(cst_accendiluce,luce);
      else
        CosaFai(cst_spegniluce,luce);
    }
    else
       CosaFai(cst_spegniluce,luce);
  }
  return(luce);
}

// ----------------------------------------------
// sezione relativa al SENSORE TEMPERATURA
// ----------------------------------------------
int sensore_temp  = A1;
float vref =5.0;	                    
// Vref dell'ADC (quell'interno è di 1,1V) - arduino 168
int controlla_temp()
{
  #ifdef DEBUG
  return(1);
  #endif
  int temp = analogRead(sensore_temp)*0.36;  
  //temp = (5.0* temp *100.0)/1024.0;
  temp=29;
  ScriviLCD(16,3,"    ");
  sprintf(buffer, "%d", temp); 
  ScriviLCD(16,3,buffer);
  return(temp);
}

// ----------------------------------------------
// sezione relativa al SENSORE MOVIMENTO
// ----------------------------------------------
#define alert     9 // attivo l'allarme intrusione
int sensore_mov   = A2;
const int soglia_mov  = 500;
int SirenaPin=10;
boolean Sirena = false;
int controlla_mov()
{
    #ifdef DEBUG
    return(2);
    #endif
    int AlertOnOff=digitalRead(alert);
    if (AlertOnOff==1)
    {
       ScriviLCD(16,2,"ON "); // metto Allarme ON
       int mov = analogRead(sensore_mov);
       //sprintf(buffer, "%d", mov); 
       //ScriviLCD(16,2,buffer);
       if (mov > soglia_mov)
       {
          ScriviLCD(6,2,"YES"); // ha rilevato uno spostamento
          Sirena=true;  
       }
       else
          ScriviLCD(6,2,"NO "); // non ha rilevato uno spostamento
       return(mov);
    }
    else
    {
       ScriviLCD(16,2,"OFF"); // metto Allarme OFF
       ScriviLCD(6,2,"   ");  // azzero il rilevamento di movimento
       return(0);
    }
}

// ----------------------------------------------
// sezione relativa al SENSORE SUONO
// ----------------------------------------------
int sensore_suono = A3;
short conta_suono = 0;
int prec_suono;
const int soglia_suono = 15;
const int delta_suono = 3;
int controlla_suono()
{
  #ifdef DEBUG
  return(3);
  #endif
  int suono = analogRead(sensore_suono);
  if ((suono > soglia_suono) && ((prec_suono+delta_suono)<suono))
  {
     conta_suono = conta_suono +1;
     ScriviLCD(16,0,"   "); // pulisco
     sprintf(buffer, "%d", conta_suono); 
     ScriviLCD(16,0,buffer);
     prec_suono=suono;
     return true;
  }
  else
  {
     //ScriviLCD(16,0,"   ",""); // pulisco
     prec_suono=suono;
     return false;
  }
}

// ----------------------------------------------
// sezione relativa al SENSORE GAS
// ----------------------------------------------
int sensore_gas   = A4;
#define allarme 13 // attivo l'allarme gas
const int soglia_gas = 580;
int controlla_gas()
{
   #ifdef DEBUG
   return(4);
   #endif
   int gas = analogRead(sensore_gas);
   int AlarmOnOff=!digitalRead(allarme);
   //sprintf(buffer, "%d", gas); 
   //ScriviLCD(6,1,buffer);
   Serial.print("AlarmOnOff: ");
   Serial.println(AlarmOnOff,DEC);
   if (AlarmOnOff==1)
       ScriviLCD(16,1,"ON  "); // Mostra che l'allarme GAS è ON
   else 
       ScriviLCD(16,1,"OFF "); // Mostra che l'allarme GAS è OFF
   if (gas > soglia_gas)
   {
       ScriviLCD(6,1,"YES"); 
       if (AlarmOnOff==1)
          Sirena=true;  
   }
   else
       ScriviLCD(6,1,"NO "); 
   return(gas);
}
// FINE PARTE IN COMUNE con versione WEB

void print_menu()
{
   
  // 1 COLONNA
  ScriviLCD(0,0,"Luci :"); 
  ScriviLCD(0,1,"Gas  :"); 
  ScriviLCD(0,2,"Move :"); 
  ScriviLCD(0,3,"Auto :"); 

  // 2 COLONNA
  ScriviLCD(10,0,"Knock:"); 
  ScriviLCD(10,1,"Alarm:"); 
  ScriviLCD(10,2,"Alert:"); 
  ScriviLCD(10,3,"Temp :"); 
}

void setup() 
{
 
   Serial.begin(9600);
   mylcd.begin(20, 4);
   mylcd.clear();
   print_menu();
     
   // INIZIO PARTE IN COMUNE con versione WEB
   ContaCicli=0;
   // Inizializzazione PIN Luce
   pinMode(led_pin, OUTPUT);
   pinMode(SirenaPin, OUTPUT);
   pinMode(on_off, INPUT);
   pinMode(auto, INPUT);
   pinMode(alert, INPUT);       // Allarme intrusione
   pinMode(allarme, INPUT);     // Allarme GAS
   digitalWrite(on_off, HIGH);
   digitalWrite(auto, HIGH);
   digitalWrite(alert, HIGH);   // Allarme intrusione
   digitalWrite(allarme, HIGH); // Allarme GAS
}

void loop() 
{
  // Inizializzo il display leggendo gli allarmi
  int hoAllarmatoIntrusione=digitalRead(alert);
  int hoAllarmatoGas=!digitalRead(allarme);
  if ( (hoAllarmatoIntrusione==0) &&  (hoAllarmatoGas==0) )
  {
      noTone(SirenaPin);
      Sirena=false;
  }

  luce = controlla_luce();
  if (ContaCicli==0)
  {
    // Entra qui ogni 500 loop - equivalente a delay(500);
    // Lettura dei sensori indipendentemente dal fatto che il Web Funzioni o Meno
  }
  if ((ContaCicli % 500) == 1)
  {
     temp = controlla_temp();
  }
  if ((ContaCicli % 100) == 1)
  {
     mov = controlla_mov();
  }

  if ((ContaCicli % 200) <= 100)
     if (Sirena)
        tone(SirenaPin,1000,1);
     else
       noTone(SirenaPin);
  else
     noTone(SirenaPin);
  if ((ContaCicli % 20) == 1)
  {
     // sensori letti ogni ventesimo di secondo
     suono = controlla_suono();
     gas = controlla_gas();
  }
  ContaCicli++;
  if (ContaCicli>1000)
  {
     ContaCicli=0;
     Sirena=false; //spengo la sirena dopo 3 secondi
     noTone(SirenaPin);
  }
  // FINE PARTE IN COMUNE con versione WEB
  delay(1);
}

Codice del progetto di domotica per gestire la visualizzazione sul server WEB


/*
  Versione: 15/06/2012
  Gestione OUTPUT Web Server
*/

void ScriviLCD(int c, int r, char *s)
{
    // Lascio vuota questa funzione per poter utilizzare pari pari
    // il codice della gestione dell'output su LCD
} 

#include <SPI.h>
#include <Ethernet.h>
 
// Imposto il MAC Address e l'indirizzo IP della porta Eth su Arduino
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,1, 177);
 
// Inizializzo la libreria Ethernet con l'IP e la porta del WEBServer
// (la porta 80 è la predefinita per HTTP):
EthernetServer server(80);
 
// ----------------------------------------------
// PARTE IN COMUNE CON Versione WEB
// Variabili del mio progetto
// ----------------------------------------------
int ContaCicli;
int luce=0, gas=0, suono=0, mov=0, temp=0;
char buffer[10]; 
boolean Sirena = false;
//int SirenaPin=10;

// ----------------------------------------------
// sezione relativa al SENSORE LUCE
// ----------------------------------------------
#define led_pin     6 // led che simula una lampadina di illuminazione accesa
#define on_off      7 // la lampadina si accende con l'uso del dipswitch
#define auto        8 // uso il sensore di luce
int sensore_luce  = A0;
// Variabili Switch
int OnOff=-1;
int Auto=-1;
const int soglia_buio  = 600;
const int cst_accendiluce = 1;
const int cst_spegniluce = 0;
void CosaFai(int CosaFaccio,int lux)
{
  if (CosaFaccio==cst_accendiluce)
  {
     ScriviLCD(6,0,"ON ");
     digitalWrite(led_pin, HIGH); // Accende la lampadina
  }
  else
  {
     ScriviLCD(6,0,"OFF");
     digitalWrite(led_pin, LOW); // spegne la lampadina
  }
}
int controlla_luce()
{
  #ifdef DEBUG
  return(0);
  #endif
  int luce  = analogRead(sensore_luce);
  //Serial.print("Luce: ");
  //Serial.println(luce,DEC);
  OnOff=digitalRead(on_off);
  Auto=digitalRead(auto);
  if (Auto==1)
     ScriviLCD(6,3,"ON "); // metto Auto ON
  else
     ScriviLCD(6,3,"OFF"); // metto Auto OFF
  if (OnOff==1)
     CosaFai(cst_accendiluce,luce);
  else   // OnOff spento o 0
  {
    if (Auto==1)
    {
      if(luce>soglia_buio) // Valori Alti => + buio
        CosaFai(cst_accendiluce,luce);
      else
        CosaFai(cst_spegniluce,luce);
    }
    else
       CosaFai(cst_spegniluce,luce);
  }
  return(luce);
}

// ----------------------------------------------
// sezione relativa al SENSORE MOVIMENTO
// ----------------------------------------------
#define alert     9 // attivo l'allarme intrusione
int sensore_mov   = A2;
const int soglia_mov  = 500;
int controlla_mov()
{
    #ifdef DEBUG
    return(2);
    #endif
    int AlertOnOff=digitalRead(alert);
    if (AlertOnOff==1)
    {
       ScriviLCD(16,2,"ON "); // metto Allarme ON
       int mov = analogRead(sensore_mov);
       //sprintf(buffer, "%d", mov); 
       //ScriviLCD(16,2,buffer);
       if (mov > soglia_mov)
       {
          ScriviLCD(6,2,"YES"); // ha rilevato uno spostamento
          Sirena=true;  
       }
       else
          ScriviLCD(6,2,"NO "); // non ha rilevato uno spostamento
       return(mov);
    }
    else
    {
       ScriviLCD(16,2,"OFF"); // metto Allarme OFF
       ScriviLCD(6,2,"   ");  // azzero il rilevamento di movimento
       return(0);
    }
}

// ----------------------------------------------
// sezione relativa al SENSORE SUONO
// ----------------------------------------------
int sensore_suono = A3;
short conta_suono = 0;
int prec_suono;
const int soglia_suono = 15;
const int delta_suono = 3;
int controlla_suono()
{
  #ifdef DEBUG
  return(3);
  #endif
  int suono = analogRead(sensore_suono);
  if ((suono > soglia_suono) && ((prec_suono+delta_suono)<suono))
  {
     conta_suono = conta_suono +1;
     ScriviLCD(16,0,"   "); // pulisco
     sprintf(buffer, "%d", conta_suono); 
     ScriviLCD(16,0,buffer);
     prec_suono=suono;
     return true;
  }
  else
  {
     //ScriviLCD(16,0,"   ",""); // pulisco
     prec_suono=suono;
     return false;
  }
}

// ----------------------------------------------
// sezione relativa al SENSORE TEMPERATURA
// ----------------------------------------------
int sensore_temp  = A1;
float vref =5.0;	                     
// Vref dell'ADC (quell'interno è di 1,1V) - arduino 168
int controlla_temp()
{
  #ifdef DEBUG
  return(1);
  #endif
  int temp = analogRead(sensore_temp)*0.36;  
  //temp = (5.0* temp *100.0)/1024.0;
  ScriviLCD(16,3,"    ");
  sprintf(buffer, "%d", temp); 
  ScriviLCD(16,3,buffer);
  return(29);
  return(temp);
}

// ----------------------------------------------
// sezione relativa al SENSORE GAS
// ----------------------------------------------
int sensore_gas   = A4;
#define allarme 13 // attivo l'allarme gas
const int soglia_gas = 580;
int controlla_gas()
{
   #ifdef DEBUG
   return(4);
   #endif
   int gas = analogRead(sensore_gas);
   int AlarmOnOff=!digitalRead(allarme);
   if (AlarmOnOff==1)
       ScriviLCD(16,1,"ON  "); // Mostra che l'allarme GAS è ON
   else 
       ScriviLCD(16,1,"OFF "); // Mostra che l'allarme GAS è OFF
   if (gas > soglia_gas)
   {
       ScriviLCD(6,1,"YES"); 
       if (AlarmOnOff==1)
          Sirena=true;  
   }
   else
       ScriviLCD(6,1,"NO "); 
   return(gas);
}

void setup() 
{
   Serial.begin(9600);
   // Inizializzo la connessione Ethernet e il server WEB:
   Ethernet.begin(mac, ip);
   server.begin();
   Serial.print("HTTP Server: ");
   Serial.println(Ethernet.localIP());
   
   // INIZIO PARTE IN COMUNE CON versione LCD
   ContaCicli=0;
   // Inizializzazione PIN Luce
   pinMode(led_pin, OUTPUT);
   // pinMode(SirenaPin, OUTPUT);
   pinMode(on_off, INPUT);
   pinMode(auto, INPUT);
   // pinMode(alert, INPUT);       // Allarme intrusione
   // pinMode(allarme, INPUT);     // Allarme GAS
   digitalWrite(on_off, HIGH);
   digitalWrite(auto, HIGH);
   // digitalWrite(alert, HIGH);   // Allarme intrusione
   // digitalWrite(allarme, HIGH); // Allarme GAS
   // FINE PARTE IN COMUNE CON versione LCD 
}
 

void loop() 
{
   // Resto in attesa di richieste al server
   EthernetClient client = server.available();
   if (client) 
   {
     Serial.println("new client");
     // Una richiesta http finisce con una linea bianca
     boolean currentLineIsBlank = true;
     while (client.connected()) 
     {
       if (client.available()) 
       {
         char c = client.read();
         Serial.write(c);
         // se ho ricevuto un end of line (ricevo un carattere newline)
         // e la linea è vuota, allora la richiesta http è conclusa e si
         // si può procedere con la risposta
         if (c == '\n' && currentLineIsBlank) 
         {
           // manda un'intestazione di risposta HTTP standard
           client.println("HTTP/1.1 200 OK");
           client.println("Content-Type: text/html");
           client.println("Connnection: close");
           client.println();

           // PARTE SENSORI
           int hoAllarmatoIntrusione=digitalRead(alert);
           int hoAllarmatoGas=!digitalRead(allarme);
           /*
           if ( (hoAllarmatoIntrusione==0) &&  (hoAllarmatoGas==0) )
           {
               noTone(SirenaPin);
               Sirena=false;
           }
           */
           luce = controlla_luce();
           gas = controlla_gas();
           temp = controlla_temp();
           mov = controlla_mov();
           suono = controlla_suono();

           /*
           if ((ContaCicli % 20) == 1)
           {
               // sensori letti ogni ventesimo di secondo
               // suono = controlla_suono();
               gas = controlla_gas();
           }
           ContaCicli++;
           if (ContaCicli>1000)
           {
               ContaCicli=0;
               //Sirena=false; //spengo la sirena dopo 3 secondi
               //noTone(SirenaPin);
           }
           */ 
           // --------------------------------------------------------
           // Scrivo i valori dei sensori in un array JavaScript:
           // --------------------------------------------------------
           // LUCE
           client.print("AnalogChannel[0]=");
           if (luce>soglia_buio)
               client.print("1");
           else
             client.print("0");
           client.println(";");
           // TEMP
           client.print("AnalogChannel[1]=");
           client.print(temp);
           client.println(";");
           // MOVIMENTO    
           client.print("AnalogChannel[2]=");
           if (mov>soglia_mov)
               client.print("1");
           else
               client.print("0");
           client.println(";");
           // SUONO
           client.print("AnalogChannel[3]=");
           client.print(conta_suono);
           client.println(";");          
           // GAS
           client.print("AnalogChannel[4]=");
           if (gas>soglia_gas)
              client.print("1");
           else
              client.print("0");
           client.println(";");
           // Switch
           client.print("DigitalChannel[");
           client.print(allarme);
           client.print("]=");
           client.print(hoAllarmatoGas);
           client.println("; // Allarme GAS attivato/disattivato");
           client.print("DigitalChannel[");
           client.print(on_off);
           client.print("]=");
           client.print(OnOff);
           client.println(";");
           client.print("DigitalChannel[");
           client.print(auto);
           client.print("]=");
           client.print(Auto);
           client.println(";");
           client.print("DigitalChannel[");
           client.print(alert);
           client.print("]=");
           client.print(hoAllarmatoIntrusione);
           client.println("; // Allarme Intrusione attivato/disattivato");

           // Fine parte sensori
           /*
           for (int analogChannel = 0; analogChannel < 6; analogChannel++) 
           {
               int sensorReading = analogRead(analogChannel);
               client.print("AnalogChannel[");
               client.print(analogChannel);
               client.print("]=");
               client.print(sensorReading);
               client.println(";");
           }
           */
           // Aggiusto i dati
           // Luce OK - valori bassi corrispondono alla luce (range 0 -> 1024)
           // Movimento OK - valori bassi corrispondono alla luce (range 0 -> 1024)

           /*        
           // visualizzo per test i valori letti su ogni ingresso analogico
           for (int analogChannel = 0; analogChannel < 6; analogChannel++) 
           {
              int sensorReading = analogRead(analogChannel);
              client.print("analog input ");
              client.print(analogChannel);
              client.print(" is ");
              client.print(sensorReading);
              client.println("");       
           }
           client.println("");
           */
           break;
         }
         if (c == '\n') 
           currentLineIsBlank = true;
        else if (c != '\r') 
           currentLineIsBlank = false;
       }
     }
     // fornisco al browser il tempo necessario a ricevere i dati
     delay(1);
     // chiudo la connessione con il server
     client.stop();
     Serial.println("client disconnected");
   }
 }