Vai al contenuto
PLC Forum


Progetto Allarme, Arduino uno, Shield w5100, app Blynk


Messaggi consigliati

lupoalberto74it
Inserito:

Salve, sono alle prese con uno sketch recuperato in rete, per un antifurto costruito con Arduino uno, shield ethernet w5100, lettore scrittore RFID. Ora il mio problema è poter associare 3 funzioni all'app blynk, in modo specifico le seguenti:

1 LCD: vorrei che tutto quello che viene stampato sul display fisico 16x2 con ic2 venisse in tempo reale anche trasmesso sull'app blynk

2 LED: anche questo che si visualizzasse in entrambi i modi

3 ANTIFURTO: anche questo poterlo comandare in entrambi i modi per quanto riguarda attivarlo e disattivarlo

Grazie in anticipo per un vostro eventuale aiuto. Lo sketch è il seguente:

#include <SPI.h>
#include <RFID.h>
#include <EEPROM.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Ethernet.h>

#define SS_PIN 9
#define RST_PIN 8

// ***IMPORTANTE*** Inserire il codice della propria chiave master.
#define masnum0 170
#define masnum1 222
#define masnum2 159
#define masnum3 26
#define masnum4 241

#define sensorePir1 6 // Ingresso sensore 1
#define releSirena 7 // Contatto pulito a cui collegare una sirena esterna autoalimentata
#define ledRosso 3 // E' il led che indica lo stato della centrale
#define ledGiallo 4 // E' il led che indica lo stato del sensore 1
#define resetKey 5 // pulsante di reset e visualizzazione memoria di allarme
#define dispositivo1 14 // Uscita relè dispositivo 1

RFID rfid(SS_PIN, RST_PIN);
LiquidCrystal_I2C lcd(0x27,16,2);

byte mac[] = { 0x90, 0xA2, 0xDA, 0x0D, 0xAD, 0x54 }; // mac address della ethernet shield
byte ip[] = { 192 ,168 ,1 ,100 }; // indirizzo ip statico locale da assegnare ad arduino
byte gateway[] = { 192 ,168 ,1 ,1 }; // indirizzo ip del router
byte subnet[] = { 255 ,255 ,255 ,0 }; // subnet di default
EthernetServer server(80); // porta da aprire sul router per la comunicazione remota
String readString = String(30);

boolean statoAntifurto = 0; // Variabile antifurto attivo
boolean statoAllarme = 0; // Variabile centrale in allarme
boolean statoSirena = 0; // Variabile di stato del relè sirena
boolean statoPir1 = 0; // Variabile di stato del sensore 1
boolean statoDispositivo1 = 0; // Variabile di stato on/off del relè dispositivo 1
boolean cardMaster = 0; // Variabile modalità chiave master
boolean memoriaAllarme = 0; // Variabile per gestire la memoria di allarme
boolean tastoPremuto = 0; // Variabile che controlla la pressione prolungata del tasto reset
int slave; // Contatore di chiavi salvate
int zona = 0; // Variabile che memorizza la zona che ha innescato l'allarme
int timerIngUsc = 0; // Variabile utilizzata per scandire i secondi trascorsi durante i tempi di ingresso o uscita
int faseIngUsc = 0; // Variabile che memorizza se si è nella fase di ingresso (1) o uscita (2)
unsigned long previousMillisSirena = 0; // Variabile utilizzata per gestire i millisecondi del tempo di suono della sirena.
unsigned long currentMillisSirena;
unsigned long previousMillisTempi = 0; // Variabile utilizzata per gestire i millisecondi del tempo di ingresso/uscita.
unsigned long currentMillisTempi;

int sernum0;
int sernum1;
int sernum2;
int sernum3;
int sernum4;

void setup()
{
  lcd.init();
  SPI.begin();
  rfid.init();Ethernet.begin(mac, ip, gateway, subnet);
  Serial.begin(9600);
  pinMode(ledRosso, OUTPUT);
  pinMode(releSirena, OUTPUT);
  pinMode(ledGiallo, OUTPUT);
  pinMode(sensorePir1,INPUT);
  pinMode(resetKey, INPUT);
  pinMode(dispositivo1, OUTPUT);
  digitalWrite(ledRosso, LOW);
  digitalWrite(ledGiallo, LOW);
  digitalWrite(releSirena, HIGH);
  digitalWrite(dispositivo1, HIGH);
  standby();
}

void loop() {
 
  // Inizio blocco per la gestione locale della centrale
  // 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];
        slave = EEPROM.read(0);
                // Se il seriale letto corrisponde con il seriale Master
                // attiva o disattiva la modalita Memorizzazione chiavi
                // e in più visualizza il numero di chiavi salvate...
                if (sernum0 == masnum0
                && sernum1 == masnum1
                && sernum2 == masnum2
                && sernum3 == masnum3
                && sernum4 == masnum4) {
                  if (statoAntifurto == 0) {
                         lcd.backlight();
                         if (cardMaster==0) {
                                  lcd.clear();
                                  lcd.print("CARD MASTER");
                                  delay(2000);
                                  lcd.clear();
                                  lcd.print("GESTIONE CHIAVI");
                                  cardMaster = 1;
                                  lcd.setCursor(0, 1);
                                  lcd.print("Chiavi slave: ");
                                  lcd.setCursor(15, 1);
                                  lcd.print(slave);
                                  delay(3000);
                         } 
                        else {
                           cardMaster = 0;
                           lcd.setCursor(0, 1);
                           lcd.print("Annullata       ");
                           delay(3000);
                           standby();
                        }
                  }
                }
                // Se invece il seriale letto corrisponde con uno dei tre gruppi
                // di chiavi memorizzate allora attiva o disattiva l'antifurto.
                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))) {
                        lcd.backlight();
                        if (cardMaster==0) {
                             // Se l'antifurto non è inserito, lo attiva ed aggiorna a 2 la variabile "faseIngUsc",
                             // indicando che si è nella fase di uscita. 
                             if (statoAntifurto == 0) { 
                                      statoAntifurto = 1;
                                      faseIngUsc = 2;
                                      lcd.clear();
                                      lcd.print("CHIAVE VALIDA");
                                      delay(2000);
                                      lcd.clear();
                                      lcd.print("     TEMPO      ");
                                      lcd.setCursor(0, 1);
                                      lcd.print("     USCITA     ");
                             }
                             else {
                                   if (faseIngUsc != 0) {
                                      timerIngUsc = 0;
                                      faseIngUsc = 0;
                                   }
                                   lcd.clear();
                                   lcd.print("CHIAVE VALIDA"); 
                                   delay(2000);
                                   disattiva();
                            }
                        }
                }
                // Se il seriale letto è diverso dal master e nemmeno presente in memoria,
                // e se è attiva la modalita Memorizzazione chiavi, salva il seriale in memoria
                // come slave1, slave2 o slave3.
                else if (cardMaster == 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);
                              cardMaster = 0;
                              delay(1000);
                              lcd.setCursor(0, 1);
                              lcd.print("Slave 1 salvata!");
                              delay(3000);
                              standby();
                }
                else if (cardMaster == 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);
                              cardMaster = 0;
                              delay(1000);
                              lcd.setCursor(0, 1);
                              lcd.print("Slave 2 salvata!");
                              delay(3000);
                              standby();
                 }
                 else if (cardMaster == 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);
                              cardMaster = 0;
                              lcd.setCursor(0, 1);
                              lcd.print("Slave 3 salvata!");
                              delay(3000);
                              standby();
                 }
        }
}
rfid.halt();

// Inizio blocco per la gestione remota della centrale e dei dispositivi               
EthernetClient client = server.available();
if (client) {
      while (client.connected()) {
                    if (client.available()) {
                               char c = client.read();
                               if (readString.length() < 30) {
                                            readString = readString + c;
                               }
                               if (c == '\n') {
                                         Serial.print(readString); 
                                         client.println("HTTP/1.1 200 OK");
                                         client.println("Content-Type: text/html");
                                         client.println();
                                         // Con il seguente comando la centrale spegne il relè del dispositivo 1.
                                         if(readString.startsWith("GET /?disp1&stato=0")) {
                                                       Serial.print("\n DISP1 OFF \n");
                                                       client.print("DISP1OFF");
                                                       digitalWrite(dispositivo1, HIGH);
                                                       statoDispositivo1=0;
                                         }
                                         // Con il seguente comando la centrale accende il relè del dispositivo 1.
                                         if(readString.startsWith("GET /?disp1&stato=1")) {
                                                       Serial.print("\n DISP1 ON \n");
                                                       client.print("DISP1ON");
                                                       digitalWrite(dispositivo1, LOW);
                                                       statoDispositivo1=1;
                                         }
                                         // Con il seguente comando la centrale disattiva l'antifurto.
                                         if(readString.startsWith("GET /?antifurto&stato=0")) {
                                                       Serial.print("\n ANTIFURTO OFF \n");
                                                       client.print("ANTIOFF");
                                                       disattiva();
                                         }
                                         // Con il seguente comando la centrale attiva l'antifurto.
                                         if(readString.startsWith("GET /?antifurto&stato=1")) {
                                                       Serial.print("\n ANTIFURTO ON \n");
                                                       client.print("ANTION");
                                                       attiva();
                                         }
                                         // Con il seguente comando la centrale risponde con lo stato generale dell'antifurto, quindi anche lo stato delle zone.
                                         if(readString.startsWith("GET /?stato=antifurto")) {
                                                       Serial.print("\n STATO ANTIFURTO \n");
                                                       client.print("Cameretta, ");
                                                       client.print(statoPir1);
                                                       client.print(", ");
                                                       client.print(statoAllarme);
                                                       client.print(", ");
                                                       client.print(statoAntifurto);
                                         }
                                         // Con il seguente comando la centrale risponde solo con lo stato dei sensori
                                         if(readString.startsWith("GET /?stato=sensori")) {
                                                       Serial.print("\n STATO SENSORI \n");
                                                       client.print("Cameretta, ");
                                                       client.print(statoPir1);
                                         }             
                                         // Con il seguente comando la centrale risponde con lo stato generale della centrale e quindi dei dispositivi.
                                         if(readString.startsWith("GET /?stato=centrale")) {
                                                       Serial.print("\n STATO CENTRALE \n");
                                                       client.print("Luce camera, ");
                                                       client.print(statoDispositivo1);
                                                       client.print(", ");
                                                       client.print("Cameretta, ");
                                                       client.print(statoPir1);
                                                       client.print(", ");
                                                       client.print("Stato Antifurto, ");
                                                       client.print(statoAntifurto);
                                                       client.print(", ");
                                                       client.print("Stato Allarme, ");
                                                       client.print(statoAllarme);
                                          }
readString="";
client.stop();
}
}
}
}

// Questa istruzione serve a far capire alla funzione "tempoIngressoUscita" in quale fase ci troviamo.
if ((faseIngUsc == 1) || (faseIngUsc == 2)) {
    tempoIngressoUscita(faseIngUsc);
}
         
  // Quando la centrale va in allarme si attiverà il relè della sirena per X secondi, 60 di default.
if (statoSirena == 1) {
          attivaSirena();
}
// Se l'infrarosso rileva un movimento accende il led giallo
if (digitalRead(sensorePir1) == HIGH) {
          digitalWrite(ledGiallo, HIGH);
          statoPir1=1;
}
else {
           digitalWrite(ledGiallo, LOW);
           statoPir1=0;
     }
         
  // Se l'infrarosso rileva un movimento e l'antifurto e attivo
  // e quindi non in allarme, attiva l'allarme, memorizza la zona corrispondente ed aggiorna a 1 la variabile "faseIngUsc",
  // indicando che si è nella fase di ingresso.   
if (digitalRead(sensorePir1) == HIGH && statoAntifurto == 1 && statoAllarme == 0 && faseIngUsc == 0){
          faseIngUsc = 1;
          lcd.clear();
          lcd.print("     TEMPO      ");
          lcd.setCursor(0, 1);
          lcd.print("    INGRESSO    ");
          zona = 1;
}
     
// 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 && cardMaster == 1) {
         delay(100);
         cardMaster = 0;
         for (int i=0; i<16; i++){
           EEPROM.write(i, 0);
         }
         lcd.backlight();
         lcd.clear();
         lcd.print("Reset chiavi...");
         delay(3000);
         standby();
}
// Se si preme il tasto reset mentre la centrale e in standby si potrà visualizzare l'ultima memoria di allarme
// se si mantiene premuto invece si effettua un reset
if (digitalRead(resetKey) == HIGH && statoAntifurto == 0) {
         tastoPremuto=1; 
         delay(1000);
         if (digitalRead(resetKey) == HIGH && statoAntifurto == 0 && tastoPremuto == 1) {
                  tastoPremuto=0;
                  EEPROM.write(16, 0);
                  lcd.backlight();
                  lcd.clear(); 
                  lcd.print("Memoria Allarme:");
                  lcd.setCursor(0, 1);
                  lcd.print("Reset");
                  delay(3000);
                  standby();
         }
         else {
              tastoPremuto=0;
              lcd.backlight();
              lcd.clear(); 
              lcd.print("Memoria Allarme:");
              lcd.setCursor(0, 1);
              if (EEPROM.read(16) > 0) {
                  lcd.print("Zona ");
                  lcd.setCursor(5, 1);
                  lcd.print(EEPROM.read(16));
              }
              else {
                  lcd.print("Nessuna Memoria");
              }   
              delay(3000);
              standby();
         }       
}
}

void standby() {
  lcd.clear();
  lcd.print("Antifurto TEC.");
  lcd.setCursor(0, 1);
  lcd.print("Progetto Casa");
  delay(1000);
  lcd.backlight();
}
void allarme() {
  statoAllarme = 1;
  statoSirena = 1;
  if (memoriaAllarme == 0) {
      memoriaAllarme = 1;
      EEPROM.write(16, zona);
  } 
  lcd.backlight();
  lcd.clear();
  lcd.print("    ALLARME!    ");
  delay(1000);
  lcd.backlight();
}
void attiva() {
  statoAntifurto = 1;
  digitalWrite(ledRosso, HIGH);
  lcd.backlight();
  lcd.clear();
  lcd.print("   ANTIFURTO    ");
  lcd.setCursor(0, 1);
  lcd.print("    ATTIVO      ");
  delay(1000);
  lcd.backlight();
}

void disattiva() {
  statoAntifurto = 0;
  statoAllarme = 0;
  memoriaAllarme = 0;
  statoSirena = 0;
  zona = 0;
  digitalWrite(releSirena, HIGH);
  digitalWrite(ledRosso, LOW);
  lcd.backlight();
  lcd.clear();
  lcd.print("   ANTIFURTO    ");
  lcd.setCursor(0, 1);
  lcd.print("   DISATTIVO    ");
  delay(2000);
  standby();
}

void attivaSirena() {
  currentMillisSirena = millis();
  if(currentMillisSirena - previousMillisSirena >= 60000) { // Di default la sirena suonerà per 60 secondi (60 x 1000). Modifica con il numero di secondi che desideri.
       previousMillisSirena = currentMillisSirena;   
       if (digitalRead(releSirena) == HIGH){
            digitalWrite(releSirena, LOW);
       }
       else {
            digitalWrite(releSirena, HIGH);
            statoSirena = 0;
       }
  }   
}

void tempoIngressoUscita(int fase) {
  if (timerIngUsc < 10) {  // Di default i tempi di ingresso/uscita sono impostati a 10 secondi. Modifica con il numero di secondi che desideri.
      currentMillisTempi = millis();
      if(currentMillisTempi - previousMillisTempi >= 500) {
           previousMillisTempi = currentMillisTempi;
           if (digitalRead(ledRosso) == HIGH){
                digitalWrite(ledRosso, LOW);
           }
           else {
                timerIngUsc++;
                // Se desideri avere un beep sonoro che scandisse i secondi, collega al pin 2 un buzzer
                // e de-commenta la riga seguente.
                // tone(2, 1047, 500);
                digitalWrite(ledRosso, HIGH);
           }
       }
  }
  else {
    // Una volta trascorsi i secondi impostati, se si è nella fase di ingresso fa scattare l'allarme,
    // mentre se si è nella fase di uscita attiva l'antifurto.
       faseIngUsc = 0;
       timerIngUsc = 0;
       if (fase == 1) {
         allarme();
       }
       else if (fase == 2) {
         attiva();
       }
         
  }
}

 


Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...