Istruzione IF comportamento strano?

Ciao a tutti

Stò realizzando con il mega un piccolo sistema di allarme … non riesco a capire il motivo del comportamento strano di una semplice istruzione “if”… io sono alle prime armi, immagino di aver scritto qualche errore ma non riesco a venirne fuori, provo a spiegare:

Allora, l’istruzione if/ if else … si trova dentro ad una funzione che viene chiamata da uno dei 2 lettori rfid-522, la funzione “dump_byte_array” estrappola il codice letto da uno dei lettori e la salva dentro una variabile denominata “codiceletto”, poi con la semplice “if” confronto il codiceletto con le chiavi valide.

Succede che la “if” funziona solo se il codice corretto è l’ultimo della serie in questo caso il “chiave6” se passi un tag corrispondente alla chiave2 o altre, esegue sempre la prima parte di “if” dove attiva l’allarme e non lo spegne mai! (lo riattiva anche se in teoria impossibile xche dovrebbe controllare lo statoAllarmato) … se sposto la chiave2 per ultima sull’istruzione if funziona perfettamente.

l’if è scritta correttamente ma credo che esca un conflitto di qualche tipo con la funzione, qualcuno mi sa aiutare? (perdonatemi se per caso ho scritto delle cavolate) :o

void dump_byte_array(byte *buffer, byte bufferSize) {
              String uid_a1 = String(buffer[0] < 0x10 ? "0" : "");
              String uid_b1 = String(buffer[0], HEX);
              String uid_a2 = String(buffer[1] < 0x10 ? "0" : "");
              String uid_b2 = String(buffer[1], HEX);             
              String uid_a3 = String(buffer[2] < 0x10 ? "0" : "");
              String uid_b3 = String(buffer[2], HEX);             
              String uid_a4 = String(buffer[3] < 0x10 ? "0" : "");
              String uid_b4 = String(buffer[3], HEX);
              codiceletto = uid_a1+uid_b1+uid_a2+uid_b2+uid_a3+uid_b3+uid_a4+uid_b4;
              Serial.print(codiceletto);

      if ((statoAllarmato == 0)&&(chiave1 == codiceletto)||(chiave2 == codiceletto)||(chiave3 == codiceletto)||(chiave4 == codiceletto)||(chiave5 == codiceletto)||(chiave6 == codiceletto)){  
                Serial.println(" Allarme attivato da rfid");
                attivaAllarme();
      } else if ((statoAllarmato == 1)&&(chiave1 == codiceletto)||(chiave2 == codiceletto)||(chiave3 == codiceletto)||(chiave4 == codiceletto)||(chiave5 == codiceletto)||(chiave5 == codiceletto)){
                Serial.println(" Allarme disattivato da rfid");
                spegniAllarme();
      }
}
  1. sbagli la logica degli AND e OR, vengono valutati da sinistra a destra, senza altre tonde valuta statoAllarmato AND prima chiave, poi gli OR. Devi aggiungere le tonde per racchiudere TUTTI gli OR
    (statoAllarmato == 1)&& ( (chiave1 == codiceletto)||(chiave1...) ... )

Ma chiave1 etc. cosa sono ? String o vettori di char ? Se sono già vettori di char, evita di passare per gli oggetti String

Grazie nid69ita ..... hai ragione funziona perfettamente!, sono proprio un somaro!

grazie ancora Ciao

Meglio spezzarlo con 2 if e NON ripetere i vari test su OR visto che sono identici:

if ( (chiave1 == codiceletto)||(chiave2 == codiceletto)||(chiave3 == codiceletto)||(chiave4 == codiceletto)||(chiave5 == codiceletto)||(chiave6 == codiceletto) )
{ if(statoAllarmato == 0)
  { Serial.println(" Allarme attivato da rfid");
    attivaAllarme();
  } 
  else //((statoAllarmato == 1)
  { Serial.println(" Allarme disattivato da rfid");
    spegniAllarme();
  }
}

Prima ti chiedi se è una delle chiavi, poi valuti statoAllarmato

Giusto hai ragione ... cambio subito
grazie gentilissimo!