1 Marzo 2024

Benvenuti nel BLOG di Vincenzo

Il blog realizzato mattoncino su mattoncino…!

La casa DOMOTICA con ARDUINO — Blynk

Einstein un tempo disse : “Un giorno le macchine riusciranno a risolvere tutti i problemi, ma mai nessuna di esse potrà porne uno.”

Io, con questo progetto di Casa Domotica, ho provato, per lo meno, per quanto è in mio potere, a rendere la permanenza presso la propria abitazione, la più comoda, accessibile e spensierata possibile. Chissà quante volte abbiamo sentito nostra madre ribattere: “Non dimenticarti le luci accese!”, “Accendi il condizionatore e imposta una temperatura né troppo bassa né troppo alta!”. Ormai siamo nel 2020 e il concetto o, più che altro, la filosofia della casa domotica non è più una fantasia, bensì una realtà all’avanguardia e, per quanto tutto questo possa essere assiomatico,  dobbiamo iniziare ad abituarci. Per questo motivo ho pensato di realizzare il progetto della CASA DOMOTICA D’AMBROSIO che ora vi presenterò nei dettagli. DOMOTICA perché possiede un’intelligenza artificiale fornita da un computer centrale costituito da un Arduino Mega con un processore Atmega 2560 il quale montando una Ethernet Shield ha la possibilità di collegarsi alla rete locale. E nel caso del modellino quest’ultima è stata collegata via porta LAN a un dispositivo Tp-link Wifi adapter. 


Inoltre trattandosi di un micro-controllore, ha la potenzialità di eseguire una serie di comandi in base a quanto viene indicato nel codice di programmazione che vi è scaricato permettendone l’adeguato funzionamento, inoltre il codice è stato scritto in Arduino IDE, un’esemplificazione del codice c++. Il percorso che compiranno i messaggi inviati stesso dall’arduino centrale, sarà quello di  percorrere la rete locale giungendo a un server locale installato sul computer che li girerà a sua volta ad eventuali dispositivi adibiti a ricevere tali messaggi, stiamo parlando di semplici smartphone o di computer stessi. Per messaggi intendiamo risposte di sensori che monitorano l’ambiente domestico, quali  sensori di temperatura o sensori di presenza GPL, ma anche indicatori modificabili dall’utente per impostare e comunicare al sistema centrale le proprie preferenze circa l’ambiente casalingo da gestire. La piattaforma usata corrisponde al nome di BLYNK grazie alla quale è stato possibile interfacciare tutto il sistema domotico con un app scaricabile sul proprio cellulare.


I componenti elettronici adoperati in tale progetto corrispondono ai seguenti:

  • 1x ARDUINO MAGA – ATmega2560
  • 1x Ethernet Shield W5100
  • 1x Tp-Link WiFi adapter
  • 1x Cavo ethernet
  • 1x Breadboard Power Supply Module
  • 1x Breadboard
  • 1x Relè 4 canali
  • 1x Lettore di tessere tag RFID RC522
  • 1x Display LCD 16×2 I2C
  • 1x Pulsante Reset + Resistore di Pull-Down 10 kΩ
  • 3x Diodi LED (rosso/giallo/verde) + Resistori 220 Ω
  • 1x Motore Micro Servo
  • 1x Sensore Luce (Photoresistor Module)
  • 1x Sensore GAS MQ2
  • 1x Sensore PIR Movimento
  • 1x Buzzer passivo
  • 2x Moduli DHT11
  • 1x Ventola
  • 1x Kit cavetti di collegamento 
  • 1x Alimentatore 9V 1A (Per i componenti)
  • 1x Alimentatore 5v (Per Arduino)

A seguire lo schema di collegamento dei vari componenti elettronici…

In Modellino di casa DOMOTICA (visualizzabile in fondo alla pagina) è dotato di numerose funzioni peculiari, a partire dall’antifurto incorporato che permette la memorizzazione di chiavi slave attraverso una chiave Master il cui codice viene prefissato all’interno dello sketch (dalla riga 188 a 192) e allo schermo LCD, che in stato di default rende visibili ora e data, ricavati dal server Blynk, temperatura e umidità. Continuando con il sistema di climatizzazione, esso ci consente di decidere sull’interfaccia grafica la DIFFERENZA DI TEMPERATURA che vogliamo mantenere fra l’esterno e l’interno, di conseguenza il termostato provvederà ad accendere o meno la “ventola di raffreddamento” a seconda della valutazione di un algoritmo che andrà a considerare le due temperature. Inoltre gli innumerevoli dati che il nostro sistema domotico ci comunicherà, andranno a occupare la prima facciata dell’interfaccia creata sull’app di Blynk insieme ha un display virtuale che consente all’utente di visualizzare in tempo reale cosa in quel momento è proiettato sul display fisico dell’impianto d’antifurto. Per quanto concerne il sistema crepuscolare, questo, grazie a un fotoresistore, ha la facoltà di monitorare l’intensità luminosa esterna e di opzionare attivazione o la disattivazione delle luci esterne. Ultima, ma non per importanza, inviare e-mail in caso di furto o di fuga di gas, è una funzione che di certo non poteva mancare in un impianto di allerta di antifurto che si rispetti, in quanto permettendo appunto l’allerta istantanea da remoto, si rende l’utente fuori casa, immediatamente al corrente di quanto stia succedendo presso la propria abitazione; il buzzer PASSIVO, ne permette per l’appunto l’avviso uditivo.

Per permettere il funzionamento e la comunicazione con il server esterno e quindi con il nostro Smartphone, è necessario indicare nella riga 15 l’Auth Token inviato in precedenza dalla nostra app.

Sul nostro Smartphone, andremo ad impostare i vari Widget nel seguente modo andato ad occupare completamente i 2000 PUNTI ENERGIA fornitoci per creare la nostra interfaccia con server esterno: (Eventualmente con un server locale potremmo usufruire di punti di energia illimitati)


Per poi ottenere tale risultato complessivo, costituito da due pagine:

Cliccando qui potrai scaricare il circuito e lo sketch di questo progetto:

Il codice da caricare sul nostro Micro-controllore, che gli permetterà di collegarsi al server BLYNK e di inviare dati e informazioni circa le condizioni ambientali, è il seguente:

//www.vincenzonet.it

#define BLYNK_PRINT Serial

#include <SPI.h>
#include <Ethernet.h>
#include <BlynkSimpleEthernet.h>
#include <Servo.h>
#include <DHT.h>
#include <RFID.h>
#include <EEPROM.h>
#include <Wire.h> 
#include <TimeLib.h>
#include <WidgetRTC.h>
#include <LiquidCrystal_I2C.h>

char auth[] = "Your Auth Token";

#define W5100_CS  10
#define SDCARD_CS 4
#define SS_PIN 48
#define RST_PIN 49

//*********************************************LUCI
#define piano_pri 27
int piano_pri_stato = 0;
int piano_pri_va = 0;

#define piano_ter 25
int piano_ter_stato = 0;
int piano_ter_va = 0;

BlynkTimer timer;

WidgetRTC rtc;

int buzzer = 5;  

int smoke_mq2 = A1;
int smoke = 0; 
float perc_smoke = 0;
int result_smoke = 0;
int Buzzer_gas = 31;

int pir_hc_sr501 = 39;          // choose the pin for the PIR
int pirState = LOW;             // we start, assuming no motion detected
int pirval = 0;                 // variable for reading the pin status

#define DHT1PIN 2///////////////////////////////////////////////////////////////////////////////////////
#define DHT2PIN 7///////////////////////////////////////////////////////////////////////////////////////

#define DHT1TYPE DHT11     // DHT 11
#define DHT2TYPE DHT11   // DHT 22, AM2302, AM2321
//#define DHTTYPE DHT21   // DHT 21, AM2301

DHT dht1(DHT1PIN, DHT1TYPE);
DHT dht2(DHT2PIN, DHT2TYPE);

Servo servo;

int attivo = 0;

//*********************************************Luce
#define fotoresistenza_pin A0
#define crepuscolare 29
int foto = 0;
float perc = 0;
int result = 0;
int result_opp =0;

void fotoresistore () {
  foto = analogRead(fotoresistenza_pin);
  perc = map(foto, 0, 1023, 0, 100); 
  result = floor(perc); 
  result_opp = 100-result;
  Blynk.virtualWrite(V6, "update", 5, "LUMINOSITA'", String(result_opp) + " %");
  if (result_opp<=50){
    digitalWrite(crepuscolare, LOW);
    Blynk.virtualWrite(V6, "update", 8, "CREPUSCOLARE", "ACCESO");
  }
  else {
    digitalWrite(crepuscolare, HIGH);
    Blynk.virtualWrite(V6, "update", 8, "CREPUSCOLARE", "SPENTO");    
  }
}

//*********************************************PIR
int presenza_val = 0;
String presenza = "";
void PIRSENSOR () {
    pirval = digitalRead(pir_hc_sr501);  // read input value
    Blynk.virtualWrite(V6, "update", 7, "PRESENZA", presenza);
    if (pirval == HIGH) {
      // check if the input is HIGH
       if(presenza_val==0){
        presenza = "MOVIM."; 
        presenza_val = 1;   
       }
    if (pirState == LOW) {
    // we have just turned on
    // We only want to print on the output change, not state
    pirState = HIGH;
    }
    }
     
  else 
  {
       if(presenza_val == 1){
        presenza = "NO MOVIM.";
        presenza_val = 0;
       }
    if (pirState == HIGH){
    // we have just turned of
    // We only want to print on the output change, not state
    pirState = LOW;
    }
  }
}

//*********************************************DHT
void DHTSensor()
{
  float h1 = dht1.readHumidity();
  float t1 = dht1.readTemperature(); // or dht.readTemperature(true) for Fahrenheit
  float h2 = dht2.readHumidity();
  float t2 = dht2.readTemperature();
  
  if (isnan(h1) || isnan(t1)) {
    Serial.println("Failed to read from DHT sensor! DHT #1");
    return;
  }
    if (isnan(h2) || isnan(t2)) {
    Serial.println("Failed to read from DHT sensor! DHT #2");
    return;
  }
  // You can send any value at any time.
  // Please don't send more that 10 values per second.
  Blynk.virtualWrite(V6, "update", 0, "TEMPERATURA INTERNA", String(t1) + " °C");
  Blynk.virtualWrite(V6, "update", 1, "UMIDIDA' INTERNA", String(h1) + " %");
  Blynk.virtualWrite(V6, "update", 2, "TEMPERATURA ESTERNA", String(t2) + " °C");
  Blynk.virtualWrite(V6, "update", 3, "UMIDITA' ESTERNA", String(h2) + " %");
  Blynk.virtualWrite(V6, "update", 4, "Punto di Rugiada", String(dewPointFast(t2, h2)) + " °C");
  }
  double dewPointFast(double t2, double h2)
{
        double a = 17.271;
        double b = 237.7;
        double temp = (a * t2) / (b + t2) + log(h2/100);
        double Td = (b * temp) / (a - temp);
        return Td;
}
 #define condizionatore 31
  
BLYNK_WRITE(V2)
{
 int diff_tem = dht2.readTemperature()-dht1.readTemperature();;
 if(diff_tem < param.asInt()){
  digitalWrite(condizionatore, LOW);
 }
 else{
  digitalWrite(condizionatore, HIGH);
 }
}
  
//*********************************************MQ2
int email_all = 0;
void SMOKESENSOR () {
  smoke = analogRead(smoke_mq2);  
  perc_smoke = map(smoke, 0, 1023, 0, 100); 
  result_smoke = floor(perc_smoke);
  Blynk.virtualWrite(V6, "update", 6, "INQUINAMENTO GPL", String(perc_smoke) + " %");  
  if(smoke>500)       
  {   tone(buzzer, 1000, 400); 
      delay( 600);
      if (email_all == 0){
      Blynk.email("!! ALLARME [fuga gas] !!", "E' stata rilevata una fuga di gas: RISCHIO D'INCENDIO...");
      Blynk.tweet("!! ALLARME-fuga gas- !! E' stata rilevata una fuga di gas: RISCHIO D'INCENDIO... #arduino #IoT #blynk");
      email_all = 1;
      }
  }
  else
  { 
   email_all = 0;
  } 
  
}

//******************************************RFID
// Codice della chiave master.
#define masnum0 82 
#define masnum1 36
#define masnum2 224
#define masnum3 28
#define masnum4 138

#define pir 39
#define ledGreen 33
#define ledRed 35
#define ledgial 37
#define resetkey 6
#define pausa 5000 // Costante che definisce il tempo di ingresso e uscita, in questo caso 5 secondi
RFID rfid(SS_PIN, RST_PIN);

boolean antiON = 0; // Variabile antifurto attivo
boolean allarm = 0; // Variabile centrale in allarme
boolean cardmas = 0; // Variabile chiave master
int ledState = 0;
int slave; // Contatore di chiavi salvate

unsigned long previousMillis = 0;       
unsigned long interval = 500;
int sernum0;
int sernum1;
int sernum2;
int sernum3;
int sernum4;


//****************************************LCD

LiquidCrystal_I2C lcd(0x3f,16,2);


//*****************************************************void rfid
String sta_allarme = "DISATTIVO";
  void standby() {
  if (attivo ==1) {
     lcd.clear();
 lcd.setCursor(0,0);
 lcd.print("ANTIFURTO");
 lcd.setCursor(0, 1);
 lcd.print("ATTIVO");
 delay(700);
  }
  else {
    if (attivo ==2) {
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("GESTIONE CHIAVI");
      lcd.setCursor(0, 1);
      lcd.print("Chiavi slave:  ");
      lcd.setCursor(15, 1);
      lcd.print(slave);
      delay(700);
    }
    else {
        if (attivo ==3) {
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("  !!ALLARME!!  ");
      lcd.setCursor(0, 1);
      lcd.print("               ");
      tone(buzzer, 1000, 500); 
      delay( 700);
    }
    else {
       String currentTime = String(hour()) + ":" + minute();
       String currentDate = String(day()) + "/" + month() + "/" + year();
       lcd.clear();
       lcd.setCursor(2,0);
       lcd.print(currentTime);
       lcd.setCursor(12,0);
       lcd.print(dht1.readTemperature());
       lcd.setCursor(14,0);
       lcd.print((char)223);  
       lcd.print("C");  
       lcd.setCursor(0,1);
       lcd.print(currentDate);
       lcd.setCursor(13,1);
       lcd.print(dht1.readHumidity());
       lcd.setCursor(15,1);  
       lcd.print("%");         
       delay(700);
    }
    }

  }
  
  slave = EEPROM.read(0);
   if (slave == 3){                               
 Blynk.virtualWrite(V6, "update", 10, "CHIAVI SLAVE:", "3 MAX");     
  }  
 else{
 Blynk.virtualWrite(V6, "update", 10, "CHIAVI SLAVE:", slave);                         
  }
  
  // Rileva un tag...
  if (rfid.isCard()) {
      // Legge il seriale...
      if (rfid.readCardSerial()) {
        sernum0 = rfid.serNum[0];
        sernum1 = rfid.serNum[1];
        sernum2 = rfid.serNum[2];
        sernum3 = rfid.serNum[3];
        sernum4 = rfid.serNum[4];
               
                if (sernum0 == masnum0
                && sernum1 == masnum1
                && sernum2 == masnum2
                && sernum3 == masnum3
                && sernum4 == masnum4) {
                  
                if (cardmas==0) {
                  lcd.clear();
                  lcd.print("  CARD MASTER");
                  Blynk.virtualWrite(V7, "  CARD MASTER   ");
                  Blynk.virtualWrite(V8, "                ");
                  tone(buzzer, 988,100);    // Nota B5
                  delay(100);
                  tone(buzzer,1319,800);    // Nota E6
                  delay(1000);
                  lcd.clear();
                  lcd.print("GESTIONE CHIAVI");
                  Blynk.virtualWrite(V7, "GESTIONE CHIAVI");
                  cardmas = 1;
                  lcd.setCursor(0, 1);
                  lcd.print("Chiavi slave:  ");
                  lcd.setCursor(15, 1);
                  lcd.print(slave);                 
                  String currentslave = String("Chiavi slave:  ") + slave;
                  Blynk.virtualWrite(V8, currentslave);                  
                  attivo = 2;
                }  else { 
                  cardmas = 0;
                  lcd.setCursor(0, 0);
                  lcd.print("   Operazione   ");
                  lcd.setCursor(0, 1);
                  lcd.print("---ANNULLATA----");
                  Blynk.virtualWrite(V7, "   Operazione   ");
                  Blynk.virtualWrite(V8, "---ANNULLATA----");
                  tone(buzzer, 870 ,80);  
                  delay ( 325);  
                  tone(buzzer, 760 ,80); 
                  delay(2500);
                  lcd.clear();
                  Blynk.virtualWrite(V7, "ORA_________TEMP");
                  Blynk.virtualWrite(V8, "DATA________UMID");
                  attivo = 0; 
                  standby();
                }
                } 

                else if ((sernum0 == EEPROM.read(1) && sernum1 == EEPROM.read(2) && sernum2 == EEPROM.read(3) && sernum3 == EEPROM.read(4) && sernum4 == EEPROM.read(5))
                        || (sernum0 == EEPROM.read(6) && sernum1 == EEPROM.read(7) && sernum2 == EEPROM.read(8) && sernum3 == EEPROM.read(9) && sernum4 == EEPROM.read(10))
                        || (sernum0 == EEPROM.read(11) && sernum1 == EEPROM.read(12) && sernum2 == EEPROM.read(13) && sernum3 == EEPROM.read(14) && sernum4 == EEPROM.read(15))) {
                              
                             if (antiON == 0) {  
                             antiON = 1;
                             lcd.clear();
                             lcd.print(" CHIAVE VALIDA");
                             Blynk.virtualWrite(V7, " CHIAVE VALIDA  ");
                             Blynk.virtualWrite(V8, "                ");
                             tone(buzzer, 1020 ,80);  
                             delay ( 300);  
                             tone(buzzer, 1020 ,80);  
                             delay ( 150);  
                             tone(buzzer, 1020 ,80); 
                             delay ( 1000);   
                             lcd.clear();
                             lcd.print("ANTIFURTO");
                             lcd.setCursor(0, 1);
                             lcd.print("INSERITO...");
                             Blynk.virtualWrite(V7, "ANTIFURTO       ");
                             Blynk.virtualWrite(V8, "INSERITO...     ");
                             servo.write(0);
                             delay(pausa);
                             servo.write(90);
                             digitalWrite(ledRed, HIGH);
                             lcd.clear();
                             lcd.print("ANTIFURTO");
                             lcd.setCursor(0, 1);
                             lcd.print("ATTIVO");
                             Blynk.virtualWrite(V7, "ANTIFURTO       ");
                             Blynk.virtualWrite(V8, "ATTIVO          ");
                             tone(buzzer, 1000, 1000); 
                             cardmas = 0;
                             sta_allarme = "ATTIVO";
                             Blynk.virtualWrite(V6, "update", 9, "STATO ANTIFURTO:", sta_allarme);
                             piano_pri_stato = digitalRead(piano_pri);                             
                             if(piano_pri_stato == 0){
                              piano_pri_va = 1;
                              digitalWrite(piano_pri, HIGH);                     
                             }
                             piano_ter_stato = digitalRead(piano_ter); 
                             if(piano_ter_stato == 0){
                              piano_ter_va = 1;
                              digitalWrite(piano_ter, HIGH);                     
                             }
                             attivo = 1;
                             } 
                              else {
                                   antiON = 0;
                                   allarm = 0;
                                   digitalWrite(ledRed, LOW);
                                   digitalWrite(ledGreen, LOW);
                                   lcd.clear();
                                   lcd.print(" CHIAVE VALIDA");
                                   Blynk.virtualWrite(V7, " CHIAVE VALIDA  ");
                                   Blynk.virtualWrite(V8, "                ");
                                   tone(buzzer, 1000, 1000); 
                                   delay( 1000);
                                   lcd.clear();
                                   lcd.print("ANTIFURTO");
                                   lcd.setCursor(0, 1);
                                   lcd.print("DISATTIVO");
                                   Blynk.virtualWrite(V7, "ANTIFURTO       ");
                                   Blynk.virtualWrite(V8, "DISATTIVATO     ");
                                   sta_allarme = "DISATTIVO";
                                   Blynk.virtualWrite(V6, "update", 9, "STATO ANTIFURTO:", sta_allarme);
                                   cardmas = 0;
                                   if(piano_pri_va == 1){
                                    digitalWrite(piano_pri, LOW);
                                    piano_pri_va = 0;
                                   }
                                   if(piano_ter_va == 1){
                                    digitalWrite(piano_ter, LOW);
                                    piano_ter_va = 0;
                                   }
                                   attivo = 0;
                                   servo.write(0);
                                   delay(3000);
                                   servo.write(90);
                                   lcd.clear();    
                                   Blynk.virtualWrite(V7, "ORA_________TEMP");
                                   Blynk.virtualWrite(V8, "DATA________UMID");
                                   standby();
                    } 
  
                } 
                else if (cardmas == 1 && slave == 0) {
                    lcd.clear();
                    lcd.print("Chiave rilevata!");
                    EEPROM.write(0, 1);
                    EEPROM.write(1, sernum0);
                    EEPROM.write(2, sernum1);
                    EEPROM.write(3, sernum2);
                    EEPROM.write(4, sernum3);
                    EEPROM.write(5, sernum4);
                    Blynk.virtualWrite(V7, "Chiave rilevata!");
                    Blynk.virtualWrite(V8, "                ");
                    tone(buzzer, 1020 ,80);  
                    delay ( 300);  
                    tone(buzzer, 1020 ,80);  
                    delay ( 150);  
                    tone(buzzer, 1020 ,80); 
                    cardmas = 0;
                    delay(500);
                    lcd.setCursor(0, 1);
                    lcd.print("Slave 1 salvata!");
                    Blynk.virtualWrite(V7, "Chiave rilevata!");
                    Blynk.virtualWrite(V8, "Slave 1 salvata!");
                    delay(3000);
                    attivo =0;
                    lcd.clear(); 
                    Blynk.virtualWrite(V7, "ORA_________TEMP");
                    Blynk.virtualWrite(V8, "DATA________UMID");
                    standby();
                    //www.vincenzonet.it                    
                }
                    else if (cardmas == 1 && slave == 1) {
                              lcd.clear();
                              lcd.print("Chiave rilevata!");
                              EEPROM.write(0, 2);
                              EEPROM.write(6, sernum0);
                              EEPROM.write(7, sernum1);
                              EEPROM.write(8, sernum2);
                              EEPROM.write(9, sernum3);
                              EEPROM.write(10, sernum4);                              
                              Blynk.virtualWrite(V7, "Chiave rilevata!");
                              Blynk.virtualWrite(V8, "                ");
                              tone(buzzer, 1020 ,80);  
                              delay ( 300);  
                              tone(buzzer, 1020 ,80);  
                              delay ( 150);  
                              tone(buzzer, 1020 ,80);   
                              cardmas = 0;
                              delay(500);
                              lcd.setCursor(0, 1);
                              lcd.print("Slave 2 salvata!");                                                                    
                              Blynk.virtualWrite(V7, "Chiave rilevata!");
                              Blynk.virtualWrite(V8, "Slave 2 salvata!");
                              delay(3000);
                              attivo =0;
                              lcd.clear(); 
                              Blynk.virtualWrite(V7, "ORA_________TEMP");
                              Blynk.virtualWrite(V8, "DATA________UMID");
                              standby();
                    }
                              else if (cardmas == 1 && slave == 2) {
                                       lcd.clear();
                                       lcd.print("Chiave rilevata!");
                                       EEPROM.write(0, 3);
                                       EEPROM.write(11, sernum0);
                                       EEPROM.write(12, sernum1);
                                       EEPROM.write(13, sernum2);
                                       EEPROM.write(14, sernum3);
                                       EEPROM.write(15, sernum4);                                                                    
                                       Blynk.virtualWrite(V7, "Chiave rilevata!");
                                       Blynk.virtualWrite(V8, "                ");
                                       tone(buzzer, 1020 ,80);  
                                       delay ( 300);  
                                       tone(buzzer, 1020 ,80);  
                                       delay ( 150);  
                                       tone(buzzer, 1020 ,80);
                                       cardmas = 0;
                                       delay(500);
                                       lcd.setCursor(0, 1);
                                       lcd.print("Slave 3 salvata!");                                                                    
                                       Blynk.virtualWrite(V7, "Chiave rilevata!");
                                       Blynk.virtualWrite(V8, "Slave 3 salvata!");
                                       Blynk.tweet("Attenzione: limite di chiavi memorizzate raggiunto!!! #arduino #IoT #blynk");
                                       delay(3000);
                                       attivo =0;
                                       lcd.clear();                                        
                                       Blynk.virtualWrite(V7, "ORA_________TEMP");
                                       Blynk.virtualWrite(V8, "DATA________UMID");
                                       standby();
                              }
                }
                }
           
 // Se l'infrarosso rileva un movimento accende il led giallo
  if (digitalRead(pir) == HIGH) {
          digitalWrite(ledgial, HIGH);
     }
     else {
           digitalWrite(ledgial, LOW);
          }
          
  if (digitalRead(pir) == HIGH && antiON == 1 && allarm == 0){
          delay(500);
          allarm = 1;
          lcd.clear();
          lcd.print("  !!ALLARME!!   ");                                                                    
          Blynk.virtualWrite(V7, "  !!ALLARME!!   ");
          Blynk.virtualWrite(V8, "                ");
          sta_allarme = "!ALLARME!";
          Blynk.virtualWrite(V6, "update", 9, "STATO ANTIFURTO:", sta_allarme);
          Blynk.email("!! ALLARME [antifurto] !!", "Qualcuno è entrato senza disattivare l'antifurto...");
          Blynk.tweet("!! ALLARME-antifurto- !!  Qualcuno è entrato senza disattivare l'antifurto... #arduino #IoT #blynk");
          tone(buzzer, 1000, 500); 
          delay( 700); 
          attivo = 3;          
     }
  if (antiON == 1 && allarm == 1) {
          lamp();
          delay(10); // Attesa
     }
     
 // Se è stata attivata con la card Master la modalità "Memorizzazione chiavi",
 // premendo il pulsante di reset si azzera il database 
 // delle chiavi salvate fino a quel momento. 
 if (digitalRead(resetkey) == HIGH && cardmas == 1) {
         cardmas = 0;
         for (int i=0; i<16; i++){
           EEPROM.write(i, 0);
             } 
         lcd.clear();
         lcd.print("Reset chiavi... ");                                                                   
         Blynk.virtualWrite(V7, "Reset chiavi... ");
         Blynk.virtualWrite(V8, "                ");
         tone(buzzer, 870 ,80);  
         delay ( 325);  
         tone(buzzer, 760 ,80); 
         delay(1000);
         Blynk.virtualWrite(V6, "update", 10, "CHIAVI SLAVE:", "Reset");
         delay(1500);
         Blynk.virtualWrite(V6, "update", 10, "CHIAVI SLAVE:", "0");
         attivo = 0;
         lcd.clear();          
         Blynk.virtualWrite(V7, "ORA_________TEMP");
         Blynk.virtualWrite(V8, "DATA________UMID");
         standby();
     }        
                
 rfid.halt();
  
}
void lamp() {
  unsigned long currentMillis = millis();
  if(currentMillis - previousMillis > interval) {
    previousMillis = currentMillis; 
    ledState ^= 1;
    digitalWrite(ledGreen, ledState);
  }
}
  
void setup() {

  Serial.begin(9600);

  pinMode(SDCARD_CS, OUTPUT);
  digitalWrite(SDCARD_CS, HIGH); // Deselect the SD card

  Blynk.begin(auth);
  
  dht1.begin();
  dht2.begin();
  servo.attach(3);
  servo.write(90);
  timer.setInterval(4000, DHTSensor);
  timer.setInterval(5000, SMOKESENSOR);
  timer.setInterval(1000, standby);
  timer.setInterval(1000, PIRSENSOR);
  timer.setInterval(2500, fotoresistore);
  
 lcd.init();
 lcd.init(); 
 lcd.backlight(); 
 SPI.begin(); 
 rfid.init();
 rtc.begin(); // Initialize the rtc object
 pinMode(ledRed, OUTPUT);
 pinMode(ledGreen, OUTPUT);
 pinMode(31, OUTPUT);
 pinMode(ledgial, OUTPUT);
 pinMode(resetkey, INPUT);
 pinMode(condizionatore, OUTPUT);
 digitalWrite(condizionatore, HIGH);
 pinMode(crepuscolare, OUTPUT);
 digitalWrite(crepuscolare, HIGH);
 pinMode(piano_pri, OUTPUT);
 pinMode(piano_ter, OUTPUT);
 digitalWrite(piano_pri, HIGH);
 digitalWrite(piano_ter, HIGH);
 digitalWrite(ledRed, LOW);
 digitalWrite(ledgial, LOW);
 digitalWrite(ledGreen, LOW);
 sta_allarme = "DISATTIVO";
 Blynk.virtualWrite(V6, "add", 0, "TEMPERATURA INTERNA", " ");
 Blynk.virtualWrite(V6, "add", 1, "UMIDITA' INTERNA", " ");
 Blynk.virtualWrite(V6, "add", 2, "TEMPERATURA ESTERNA", " ");
 Blynk.virtualWrite(V6, "add", 3, "UMIDITA' ESTERNA", " ");
 Blynk.virtualWrite(V6, "add", 4, "Punto di Rugiada", " ");
 Blynk.virtualWrite(V6, "add", 5, "LUMINOSITA'", " ");
 Blynk.virtualWrite(V6, "add", 6, "INQUINAMENTO GPL", " ");
 Blynk.virtualWrite(V6, "add", 7, "PRESENZA", "NO MOVIM.");
 Blynk.virtualWrite(V6, "add", 8, "CREPUSCOLARE", " ");
 Blynk.virtualWrite(V6, "add", 9, "STATO ANTIFURTO:", sta_allarme);
 Blynk.virtualWrite(V6, "add", 10, "CHIAVI SLAVE:", " ");
 pinMode(pir_hc_sr501, INPUT);  
 lcd.setCursor(1,0);
 Blynk.tweet("Casa domotica D'AMBROSIO è ONLINE... #arduino #IoT #blynk");
 Blynk.virtualWrite(V7, " CASA DOMOTICA  ");
 Blynk.virtualWrite(V8, "---D'AMBROSIO---");
 lcd.print("CASA DOMOTICA");
 lcd.setCursor(0,1);
 lcd.print("---D'AMBROSIO---");
 tone(buzzer, 660 ,100);  
 delay ( 150);  
 tone(buzzer, 660 ,100);  
 delay ( 300);  
 tone(buzzer, 660 ,100);  
 delay ( 300);  
 tone(buzzer, 510 ,100);  
 delay ( 100);  
 tone(buzzer, 660 ,100);  
 delay ( 300);  
 tone(buzzer, 770 ,100);  
 delay ( 550);  
 tone(buzzer, 380 ,100);  
 delay(3000);
 Blynk.virtualWrite(V7, "ORA_________TEMP");
 Blynk.virtualWrite(V8, "DATA________UMID");
//www.vincenzonet.it
 }

void loop() {
  Blynk.run();
  timer.run(); 
}

Cliccando qui potrai scaricare il circuito e lo sketch di questo progetto:


D’Ambrosio Vincenzo Classe 2006

Iscriviti alla nostra newsletter!