Problema con contatto magnetico

Salve a tutti, non uccidetemi per come è scritto è il mio primo codice... Premetto che funziona tutto, ma ho un problema, funziona un solo contatto magnetico alla volta(i 2 contatti sono ReedPin e MagneticoPin) se li inverto stessa cosa si mette andare l'altro e uno no. Per esempio sul pin 13 vanno e sull'altro non funzionano, magari è una svista mia non so. Grazie in anticipo!P.S ho cancellato dei commenti e la parte che creavo il tastierino perchè era + di 9000char sennò scusate

int i = 0;
int j = 0;
int s = 0;
int x = 0;
int q = 0;
int w = 0;
int e = 0;
int r = 0;
int y = 0;
int acceso=0;

// Le variabili che seguono servono per definire i piedini digitali di arduino mega usati
int PirPin = 10;
int buzzer = 12;
int ReedPin = 49;
int MagneticoPin = 13;
int ledAcceso = 52;
int ledSpento = 53;
int ledInizio = 50;

#include <Wire.h>                 // Libreria di sistema - E' richiesta da I2CIO.cpp
#include <LiquidCrystal_I2C.h>    // Libreria LCD I2C
LiquidCrystal_I2C lcd(0x27,16,2); // pongo l'indirizzo del display a 0x27
  
    void disinserimento(){
    q=0;
    w=0;
    e=0;
    r=0;
    x=0;     
    i=0;
    j=0;
  delay(2000);                  
    lcd.clear();                 
    lcd.setCursor(0,0);         
    lcd.print("Disinseririmento");
          
while ((w<6)||(e<6)){            
  char key = keypad.getKey();    
if (q==0){                  
    lcd.setCursor(0,1);     
    lcd.print("-");            
    lcd.print(">");          
    q++;                       
  }
if (key != NO_KEY && w<6){    
    lcd.print("*");           
    keyInsert[w]=key;   
    w++;           
  }
if(key == '*') {               
    lcd.clear();                 
    lcd.print("Verifica");      
  delay(1000);                   
for(e=0; e<6;e++){            
if(keyInsert[e]==code[e]){   
    r++;                         //Incrementa
  }
else{                            //altrimenti
    lcd.clear();                 //Pulisce il display
    lcd.print("Riprova");        //Scrittura display
    disinserimento();            //Spostati nel disinserimento
  }
  }   
  } 
  }
if(r==6){                        //Se r=6
    lcd.clear();                 //Pulisce il display
    lcd.print("Disinserito");    //Scrittura display
  delay(1000);                   //Attesa in [ms]
    setup();                     //Allarme disinserito e ritorna alla condizione iniziale
  }  
  }
    void SensorePir(){            //Routine del sensore pir
  delay(1200);                    //Attesa in [ms]
    digitalWrite(ledAcceso, LOW); //Led allarme inserito spento
    digitalWrite(ledSpento, HIGH);//led allarme in allerta acceso
    lcd.clear();                  //Pulisce il display
    lcd.setCursor(0,0);           //Settaggio display
    lcd.print("Intrusione");      //Scrittura display
    lcd.setCursor(0,1);           //Settaggio display
    lcd.print("Salotto");         //Scrittura display
    tone(buzzer,1000);            //Attiva il cicalino
    y=1;                          //Incrementa
if(key == 'A'){                   //Se il tasto è = ad A svolgi quanto segue
    disinserimento();             //Passa al disinserimento dell'allarme
  }
  }
    void SensoreReed(){          //Routine del contatto magnetico
    digitalWrite(ledAcceso, LOW); //Led allarme inserito spento
    digitalWrite(ledSpento, HIGH);//led allarme in allerta acceso
    lcd.clear();                 //Pulisce il display
    lcd.setCursor(0,0);          //Settaggio display
    lcd.print("Intrusione");     //Scrittura display
    lcd.setCursor(0,1);          //Settaggio display
    lcd.print("Finestra");       //Scrittura display
    tone(buzzer,4000);           //Attiva il cicalino
    y=1;                         //Incrementa
if(key == 'A'){                  //Se il tasto è = ad A svolgi quanto segue
    disinserimento();            //Passa al disinserimento dell'allarme
  }
  }  
    void SensoreMagnetico(){          //Routine del contatto magnetico2
    digitalWrite(ledAcceso, LOW); //Led allarme inserito spento
    digitalWrite(ledSpento, HIGH);//led allarme in allerta acceso
    lcd.clear();                 //Pulisce il display
    lcd.setCursor(0,0);          //Settaggio display
    lcd.print("Intrusione");     //Scrittura display
    lcd.setCursor(0,1);          //Settaggio display
    lcd.print("Porta");       //Scrittura display
    tone(buzzer,4000);           //Attiva il cicalino
    y=1;                         //Incrementa
if(key == 'A'){                  //Se il tasto è = ad A svolgi quanto segue
    disinserimento();            //Passa al disinserimento dell'allarme
  }
  }  
    void sensori(){              //Routine dei sensori nella condizione iniziale di livello logico ancora basso
    char key = keypad.getKey();  //serve per la corretta lettura della pressione sul tastierino
    digitalRead(PirPin);         //Legge lo stato logico del pin del Pir
    digitalRead(ReedPin);        //Legge lo stato logico del pin del contatto magnetico
    digitalRead(MagneticoPin);   //Legge lo stato logico del pin del contatto magnetico2

if(digitalRead(PirPin) == HIGH){ //Se il Pir manda un segnale alto(1) svolgi quanto segue
    SensorePir();                //Passa alla routine del Pir
  }
else if(digitalRead(ReedPin) == HIGH){//Se il contatto magnetico manda un segnale alto(1) svolgi quanto segue
    SensoreReed();               //Passa alla routine del Contatto magnetico
  }  
else if(digitalRead(MagneticoPin) == HIGH){//Se il contatto magnetico manda un segnale alto(1) svolgi quanto segue
    SensoreMagnetico();               //Passa alla routine del Contatto magnetico2
  }  
if(key == 'A'){                  //Se il tasto è = ad A svolgi quanto segue
    disinserimento();            //Passa al disinserimento dell'allarme
  }  
else{                            //Altrimenti
    sensori();                   //Passa alla routine che controlla lo stato dei sensori
  } 
  } 
     
    void setup(){                //Routine del setup
    y=0;                         //Assume tale valore
    noTone(buzzer);              //Cicalino non attivo   
    pinMode(PirPin, INPUT);      //Pin del Pir come ingresso
    pinMode(ReedPin, INPUT);     //Pin del Contatto magnetico come ingresso
    pinMode(MagneticoPin, INPUT);//Pin del Contatto magnetico2 come ingresso
    pinMode(ledAcceso, OUTPUT);  //Pine del led allarme inserito come uscita
    pinMode(ledSpento, OUTPUT);  //Pine del led allarme in allerta come uscita
    pinMode(ledInizio, OUTPUT);  //Pine del led allarme in condizione iniziale come uscita    
    digitalWrite(PirPin, LOW);   //Poni il pin del Pir a livello logico basso(0)
    digitalWrite(ReedPin, LOW);  //Poni il pin del Contatto magnetico a livello logico basso(0)
    digitalWrite(ledSpento, LOW);//Poni il pin del led allarme in allerta a livello logico basso(0)
    digitalWrite(ledInizio, HIGH);//Poni il pin del led allarme in condizione iniziale a livello logico alto(1)
    lcd.init();                  //Inizializza l'Lcd
    lcd.backlight();             //Accende la retroilluminazione
    lcd.begin(16,2);             //Lcd a 16 colonne e 2 righe
    lcd.clear();                 //Pulisce il display
    lcd.setCursor(0,0);          //Settaggio display
    lcd.print("Digita Password");//Scrittura display
  }
 
    void loop(){                 //Routine di condizione iniziale
    char key = keypad.getKey();  //serve per la corretta lettura della pressione sul tastierino
if (i==0){                       
    lcd.setCursor(0,1);          //Settaggio display
    lcd.print("-");              //Scrittura display
    lcd.print(">");              //Scrittura display
    i++;                         //Incrementa
  }
if (key != NO_KEY && j<6){       //Se ci sono caratteri e w<6 allora svolgi quanto segue
    lcd.print("*");              //Scrittura display
    keyInsert[j]=key;            //Il tasto premuto è un tasto del tastierino
    j++;                         //Incrementa
  }
if(key == '*') {                 
    lcd.clear();                 //Pulisce il display
    lcd.print("Verifica");       //Scrittura display
  delay(1000);                   //Attesa in [ms]
for(s=0; s<6;s++){               //Ricontrolla N volte il codice inserito
if(keyInsert[s]==code[s]){       //Condizione di uguaglianza con il codice giusto preimpostato per eseguire quanto segue
    x++;                         //Incrementa
  }
  } 
    
if(x==6){
    lcd.setCursor(0,0); 
    lcd.print("ALLARME INSERITO");
    digitalWrite(ledAcceso, HIGH);
    digitalWrite(ledInizio, LOW);
    x=0;
    j=0;
    sensori();  
  }
else{  
    lcd.setCursor(0,0);   
    lcd.print("Accesso Negato");
    x=0;
    i=0;
    j=0;
    setup();
  } 
  }
  }

Mi rifiuto di leggere quello sketch.
Usa delle variabili parlanti come per esempio PirPin e non lettere che nessunio capisce cosa significano. Perché lo fai per metá del codice?
Usa i commenti per spiegare le cose senó dopo poco non Ti ricordi piú come funziona il Tuo Sketch.

È molto inconsueto chiamare setup() dal loop()

dove hai definito le variabili
keyInsert[] e code[] ?

Ciao Uwe

uwefed:
Mi rifiuto di leggere quello sketch.
Usa delle variabili parlanti come per esempio PirPin e non lettere che nessunio capisce cosa significano. Perché lo fai per metá del codice?
Usa i commenti per spiegare le cose senó dopo poco non Ti ricordi piú come funziona il Tuo Sketch.

È molto inconsueto chiamare setup() dal loop()

dove hai definito le variabili
keyInsert[] e code[] ?

Ciao Uwe

il codice non lo dimentico come funziona perché l'ho fatto tutto io, la mia versione è tutta commentata e fatta bene, ho chiesto solo di controllare la parte del contatto magnetico che ho spiegato che pin riguarda e poi ho detto, se avessi letto la mia domanda che ho tolto dei commenti e la parte in cui imposto il keypad e la password perché non mi faceva creare il post per il superamento dei 9000 chars

Kind3rin:
.... perché non mi faceva creare il post per il superamento dei 9000 chars

Il codice si mette tutto per INTERO, scritto in modo decente e ben commentato; se è troppo grande, si usa l'apposito bottone per ALLEGARE invece che metterlo nel post.

E usa la funzione dell'IDE Tools -> Auto Format ... perché così come è, a parte le incomprensibili variabili, è inguardabile con le indentature tutte sbagliate !

Guglielmo

gpb01:
Il codice si mette tutto per INTERO, scritto in modo decente e ben commentato; se è troppo grande, si usa l'apposito bottone per ALLEGARE invece che metterlo nel post.

E usa la funzione dell'IDE Tools -> Auto Format ... perché così come è, a parte le incomprensibili variabili, è inguardabile con le indentature tutte sbagliate !

Guglielmo

ok allora fra poco provvedo a farlo, ma se non è un problema grosso le variabili vorrei lascialé così, perché in realtà non c'è da correggere tutto il codice, ma il pronlema sta solo su quei due contatti

Scusa, ma perché i vari sensori sono letti in una serie di if ... else ? ? ?

In questo modo, se si verifica il primo ... non vengono più verificati gli altri ::slight_smile:

Non dovrebbero essere ciascuno indipendente dall'altro ?

Guglielmo

Mi puoi spiegare cosa intendi per uno indipendente dall'altro? :slight_smile:

Questo il pezzo di codice che mi salta agli occhi ...

if (digitalRead(PirPin) == HIGH) { //Se il Pir manda un segnale alto(1) svolgi quanto segue
  SensorePir();                //Passa alla routine del Pir
}
else if (digitalRead(ReedPin) == HIGH) { //Se il contatto magnetico manda un segnale alto(1) svolgi quanto segue
  SensoreReed();               //Passa alla routine del Contatto magnetico
}
else if (digitalRead(MagneticoPin) == HIGH) { //Se il contatto magnetico manda un segnale alto(1) svolgi quanto segue
  SensoreMagnetico();               //Passa alla routine del Contatto magnetico2
}
if (key == 'A') {                //Se il tasto è = ad A svolgi quanto segue
  disinserimento();            //Passa al disinserimento dell'allarme
}
else {                           //Altrimenti
  sensori();                   //Passa alla routine che controlla lo stato dei sensori
}

... per come lo hai scritto, se si attiva sia il Pir che il Reed ... tu entri nel IF del Pir ed automaticamente, avendoli messi sotto ELSE escludi tutti gli altri.

Mi chiedevo ... è quello che vuoi o, se scatta sia il Pir che il Reed, occorre gestire entrambi ? Perché, in tal caso, il codice deve diventare :

if (digitalRead(PirPin) == HIGH) { //Se il Pir manda un segnale alto(1) svolgi quanto segue
  SensorePir();                //Passa alla routine del Pir
}
if (digitalRead(ReedPin) == HIGH) { //Se il contatto magnetico manda un segnale alto(1) svolgi quanto segue
  SensoreReed();               //Passa alla routine del Contatto magnetico
}
if (digitalRead(MagneticoPin) == HIGH) { //Se il contatto magnetico manda un segnale alto(1) svolgi quanto segue
  SensoreMagnetico();               //Passa alla routine del Contatto magnetico2
}
if (key == 'A') {                //Se il tasto è = ad A svolgi quanto segue
  disinserimento();            //Passa al disinserimento dell'allarme
}
else {                           //Altrimenti
  sensori();                   //Passa alla routine che controlla lo stato dei sensori
}

... ovvero senza gli ELSE ... ma devi vedere tu il comportamento che vuoi.

Guglielmo

Inoltre, comunque, in questo modo, secondo me, rischi di perdere degli "eventi" ... ::slight_smile:

Immagina che scatta il sensore Reed ... tu entri nella routine SensoreReed() e ... mentre sei dentro scatta il sensore Pir che, passato un tempo X si richiude. Se tu sei ancora nella routine del sensore Reed, perdi l'evento.

La cosa è valida per tutti i sensori che hai messo in funzione della durata delle varie routines di gestione.

Ti suggerisco di rivedere completamente la tecnica di rilevazione di "eventi asincroni" così da non perderli.

Guglielmo

gpb01:
Inoltre, comunque, in questo modo, secondo me, rischi di perdere degli "eventi" ... ::slight_smile:

Immagina che scatta il sensore Reed ... tu entri nella routine SensoreReed() e ... mentre sei dentro scatta il sensore Pir che, passato un tempo X si richiude. Se tu sei ancora nella routine del sensore Reed, perdi l'evento.

La cosa è valida per tutti i sensori che hai messo in funzione della durata delle varie routines di gestione.

Ti suggerisco di rivedere completamente la tecnica di rilevazione di "eventi asincroni" così da non perderli.

Guglielmo

Ho risolto tutto mettendo una resistenza di pull-up e il codice a me funziona non è piu con gli else , volevo solo capire che problemi potevo avere con i reed, grazie lo stesso per il tempo perso :wink: