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(" |