Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Progetto allarme con app blynk

Progetti, interfacciamento, discussioni varie su questa piattaforma.

Moderatori: Foto UtenteMassimoB, Foto UtenteWALTERmwp, Foto Utentexyz

0
voti

[21] Re: Progetto allarme con app blynk

Messaggioda Foto Utentelupoalberto74it » 29 set 2021, 22:52

GioArca67 ha scritto:Riallega tutto il programma per favore, altrimenti è difficile capire.
Che significa non funziona più si blocca?

Scusate se non ho risposto prima...
Praticamente quando viene a mancare la connessione a internet da allarme acceso (quindi che visualizza le scritte sul display), se passo la tessera per abilitare e disabilitare l'antifurto non funziona rimangono le scritte iniziali e non mi da la scritta "Antifurto attivo" o "antifurto disattivo". Inoltre se l'antifurto non ha l'alimentazione e stacco il cavo ethernet collegato all'antifurto e poi con il cavo staccato, fornisco di nuovo l'alimentazione all'antifurto, non mi visualizza niente sul display.
Nell'app blynk invece si attacca e si stacca la connessione all'antifurto.
Vi riallego, giustamente, il codice al mio progetto:
Codice: Seleziona tutto
#define BLYNK_PRINT Serial

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

char auth[] = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";

#define SS_PIN 9
#define RST_PIN 8

#define W5100_CS  10
#define SDCARD_CS 4

// ***IMPORTANTE*** Inserire il codice della propria chiave master.
#define masnum0 xxx
#define masnum1 xxx
#define masnum2 xxx
#define masnum3 xxx
#define masnum4 xxx

#define sensorePir1 6 // Ingresso sensore 1
#define sensorePir2 7 // Ingresso sensore 2
#define releSirena 1 // 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 0 // Uscita relè dispositivo 1
#define pulsante 14 // Attiva e Disattiva l'allarme

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

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 statoPir2 = 0; // Variabile di stato del sensore 2
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 PinPir1 = 6;
int PinPir2 = 7;
bool StatoPir1, StatoPirPrec;
bool StatoPir2, StatoPirPrec1;
int faseIngUsc = 0; // Variabile che memorizza se si è nella fase di ingresso (1) o uscita (2)
int valPin;
int valPin1;
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;

WidgetLCD lcd_b(V1);


void setup()
{
  Serial.begin(9600);
  lcd.init();
  Blynk.begin(auth);
  SPI.begin();
  rfid.init();
  pinMode(V5, INPUT_PULLUP);
  pinMode(V6, INPUT_PULLUP);
  pinMode(PinPir1,INPUT);
  pinMode(PinPir2,INPUT);
  delay(5000);
  pinMode(pulsante,INPUT);
  pinMode(SDCARD_CS, OUTPUT);
  pinMode(ledRosso, OUTPUT);   
  pinMode(releSirena, OUTPUT);
  pinMode(ledGiallo, OUTPUT);
  pinMode(sensorePir1,INPUT);
  pinMode(sensorePir2,INPUT);       
  pinMode(resetKey, INPUT); 
  digitalWrite(SDCARD_CS, HIGH);
  digitalWrite(ledRosso, LOW);
  digitalWrite(ledGiallo, LOW); 
  digitalWrite(releSirena, HIGH);
   standby();
}
WidgetLED led1(V3);
WidgetLED led2(V4);
WidgetLED led3(V7);

void loop() {
  Blynk.run();

  if(valPin==1) {
    digitalWrite(pulsante,HIGH);
    attiva();
  }
  else {
    digitalWrite(pulsante,LOW);
      }
  if(valPin1==1) {
    digitalWrite(pulsante,HIGH);
    disattiva();
  }
  else {
    digitalWrite(pulsante,LOW);
      }
  StatoPirPrec = StatoPir1;
  StatoPir1 = digitalRead (PinPir1);
  if ((StatoPirPrec != StatoPir1) && (StatoPir1 == 1))
  {
    Serial.println ("Rilevato Movimento!");
    Blynk.notify("Rilevato Movimento!");
  }
  if (StatoPir1)
  {
    Serial.println ("1");
  }
  else
  {
    Serial.println ("0");
  }
  StatoPirPrec1 = StatoPir2;
  StatoPir2 = digitalRead (PinPir2);
  if ((StatoPirPrec1 != StatoPir2) && (StatoPir2 == 1))
  {
    Serial.println ("Rilevato Movimento!");
    Blynk.notify("Rilevato Movimento!");
  }
  if (StatoPir2)
  {
    Serial.println ("1");
  }
  else
  {
    Serial.println ("0");
  }
  int statusPin1 = digitalRead(ledRosso);
  if(statusPin1 == HIGH) {
    led1.on();
  } else if(statusPin1 == LOW) {
    led1.off();
  }
  int statusPin2 = digitalRead(ledGiallo);
  if(statusPin2 == HIGH) {
    led2.on();
  } else if(statusPin2 == LOW) {
    led2.off();
  }
  int statusPin3 = digitalRead(sensorePir2);
  if(statusPin3 == HIGH) {
    led3.on();
  } else if(statusPin3 == LOW) {
    led3.off();
  }
  // 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_b.clear();
                                  lcd.print("CARD MASTER");
                                  lcd_b.print(0, 0, "CARD MASTER");
                                  delay(2000);
                                  lcd.clear();
                                  lcd_b.clear();
                                  lcd.print("GESTIONE CHIAVI");
                                  lcd_b.print(0, 0, "GESTIONE CHIAVI");
                                  cardMaster = 1;
                                  lcd.setCursor(0, 1);
                                  lcd.print("Chiavi slave: ");
                                  lcd_b.print(0, 1, "Chiavi slave: ");
                                  lcd.setCursor(15, 1);
                                  lcd.print(slave);
                                  lcd_b.print(15, 1, slave);
                                  delay(3000);
                         } 
                        else {
                           cardMaster = 0;
                           lcd.setCursor(0, 1);
                           lcd.print("Annullata       ");
                           lcd_b.print(0, 1, "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     ");
                                      lcd_b.clear();
                                      lcd_b.print(0, 0, "CHIAVE VALIDA");
                                      delay(2000);
                                      lcd_b.clear();
                                      lcd_b.print(0, 0, "     TEMPO      ");                                   
                                      lcd_b.print(0, 1, "     USCITA     ");
                                     
                             }
                             else {
                                   if (faseIngUsc != 0) {
                                      timerIngUsc = 0;
                                      faseIngUsc = 0;
                                   }
                                   lcd.clear();
                                   lcd_b.clear();
                                   lcd.print("CHIAVE VALIDA");
                                   lcd_b.print(0, 0, "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!");
                              lcd_b.clear();
                              lcd_b.print(0, 0, "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!");                       
                              lcd_b.print(0, 1, "Slave 1 salvata!");
                              delay(3000);
                              standby();
                }
                else if (cardMaster == 1 && slave == 1) {
                              lcd.clear();
                              lcd.print("Chiave rilevata!");
                              lcd_b.clear();
                              lcd_b.print(0, 0, "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!");                     
                              lcd_b.print(0, 1, "Slave 2 salvata!");
                              delay(3000);
                              standby();
                 }
                 else if (cardMaster == 1 && slave == 2) {
                              lcd.clear();
                              lcd_b.clear();
                              lcd.print("Chiave rilevata!");
                              lcd_b.print(0, 0, "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!");                     
                              lcd_b.print(0, 1, "Slave 3 salvata!");
                              delay(3000);
                              standby();
                 }
        }
}
rfid.halt();

// 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    ");
          lcd_b.clear();
          lcd_b.print(0, 0, "     TEMPO      ");       
          lcd_b.print(0, 1, "    INGRESSO    ");
          zona = 1;
}
if (digitalRead(sensorePir2) == HIGH && statoAntifurto == 1 && statoAllarme == 0 && faseIngUsc == 0){
          faseIngUsc = 1;
          lcd.clear();
          lcd.print("     TEMPO      ");
          lcd.setCursor(0, 1);       
          lcd.print("    INGRESSO    ");
          lcd_b.clear();
          lcd_b.print(0, 0, "     TEMPO      ");       
          lcd_b.print(0, 1, "    INGRESSO    ");
          zona = 2;
}

// 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...");
         lcd_b.clear();
         lcd_b.print(0, 0, "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");
                  lcd_b.clear(); 
                  lcd_b.print(0, 0, "Memoria Allarme:");             
                  lcd_b.print(0, 1, "Reset");
                  delay(3000);
                  standby();
         }
         else {
              tastoPremuto=0;
              lcd.backlight();       
              lcd.clear(); 
              lcd.print("Memoria Allarme:");
              lcd_b.clear(); 
             lcd_b.print(0, 0, "Memoria Allarme:");           
              if (EEPROM.read(16) > 0) {
                  lcd.setCursor(0, 1);
                  lcd.print("Zona ");
                  lcd.setCursor(5, 1);
                  lcd.print(EEPROM.read(16));               
                  lcd_b.print(0, 1, "Zona ");                                 
                  lcd_b.print(5, 1, EEPROM.read(16));
               
                 }
              else {
                  lcd.setCursor(0, 1);
                  lcd.print("Nessuna Memoria");
                  lcd_b.print(0, 1, "Nessuna Memoria");
              }   
              delay(3000);
              standby();
         }       
}

BLYNK_WRITE(V5)
  {
    valPin = param.asInt();
  }
  BLYNK_WRITE(V6)
  {
    valPin1 = param.asInt();
  }
 
void standby() {
  lcd.clear();
  lcd.print("Antifurto TEC.");
  lcd.setCursor(0, 1);
  lcd.print("Progetto Casa");
  lcd_b.clear();
   lcd_b.print(0, 0, "Antifurto TEC.");
   lcd_b.print(0, 1, "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("    INTRUSO!    ");
  lcd_b.clear();
  lcd_b.print(0, 0, "    INTRUSO!    ");
  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      ");
  lcd_b.clear();
  lcd_b.print(0, 0, "   ANTIFURTO    ");
  lcd_b.print(0, 1, "    ATTIVO      ");
  digitalWrite(ledRosso, LOW);
  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    ");
  lcd_b.clear();
  lcd_b.print(0, 0, "   ANTIFURTO    ");
  lcd_b.print(0, 1, "   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();
       }
         
  }
}

Grazie come sempre.
Avatar utente
Foto Utentelupoalberto74it
0 2
 
Messaggi: 16
Iscritto il: 4 ago 2021, 14:39

0
voti

[22] Re: Progetto allarme con app blynk

Messaggioda Foto Utentelupoalberto74it » 9 ott 2021, 18:19

Nessuno può aiutarmi?... :cry:
Avatar utente
Foto Utentelupoalberto74it
0 2
 
Messaggi: 16
Iscritto il: 4 ago 2021, 14:39

0
voti

[23] Re: Progetto allarme con app blynk

Messaggioda Foto Utentelelerelele » 9 ott 2021, 18:44

mi pare che entrambi i casi possano essere ricondotti alla mancanza di ethernet.

non riesci a debuggare per trovare il punto in cui il software si pianta?
hai dato un'occhiata alla trasmissione/ricezione ethernet per verificare che non possa piantarsi su un loop oppure su un interrupt?

saluti.
Avatar utente
Foto Utentelelerelele
2.997 3 7 9
Master
Master
 
Messaggi: 3397
Iscritto il: 8 giu 2011, 8:57
Località: Reggio Emilia

0
voti

[24] Re: Progetto allarme con app blynk

Messaggioda Foto UtenteGioArca67 » 9 ott 2021, 20:02

Blynk.begin() è bloccante senza rete, quindi lì si pianta.
Prova a verificare mettendo una Serial.println prima ed una dopo alla Blynk.begin nel setup.
Non ci sono soluzioni che io sappia se non usare altre librerie
Avatar utente
Foto UtenteGioArca67
1.146 3 7
Expert
Expert
 
Messaggi: 953
Iscritto il: 12 mar 2021, 9:36

Precedente

Torna a Arduino

Chi c’è in linea

Visitano il forum: Nessuno e 4 ospiti