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.

Elettrotecnica e non solo (admin)
Un gatto tra gli elettroni (IsidoroKZ)
Esperienza e simulazioni (g.schgor)
Moleskine di un idraulico (RenzoDF)
Il Blog di ElectroYou (webmaster)
Idee microcontrollate (TardoFreak)
PICcoli grandi PICMicro (Paolino)
Il blog elettrico di carloc (carloc)
DirtEYblooog (dirtydeeds)
Di tutto... un po' (jordan20)
AK47 (lillo)
Esperienze elettroniche (marco438)
Telecomunicazioni musicali (clavicordo)
Automazione ed Elettronica (gustavo)
Direttive per la sicurezza (ErnestoCappelletti)
EYnfo dall'Alaska (mir)
Apriamo il quadro! (attilio)
H7-25 (asdf)
Passione Elettrica (massimob)
Elettroni a spasso (guidob)
Bloguerra (guerra)



