Affichage LCD avec module RFID

Bonjour, j'ai fais un programme permettant d'analyser une carte avec un module RFID mais le problème étant que quand je montre la carte n°1, le bon message s'affiche ("Bienvenue Paul") mais quand je montre la carte n°2 le LCD m'affiche accès refusé car elle reste bloquée à "Accès carte 1 refusée". Est-ce qu'il y a possibilité de contourner le return ? Sachant que si j'enlève le return le message "Accès carte 1 refusée" s'affiche 5 fois.

Merci pour votre aide

#include <SPI.h>      
#include <RFID.h>     
#include <Wire.h>     
#include "rgb_lcd.h"  

#define SS_PIN 10    
#define RST_PIN 9     

RFID rfid(SS_PIN,RST_PIN);  
rgb_lcd lcd;                

const int relaisPin = 8;                                 
const int colorR = 255;
const int colorG = 155;                                  
const int colorB =30;

int serNum[5];                                          

int card1[][5] = {{32,149,77,109,149}};                  
int card2[][5] = {{156,160,140,171,27}};

int access1 = false;
int access2 = false;

void setup(){
  
    Serial.begin(9600);                                  
    SPI.begin();                                         
    rfid.init();                                         
    pinMode(relaisPin, OUTPUT);                          
    lcd.begin(16, 2);                                    
    lcd.setRGB(colorR, colorG, colorB);                  
    lcd.print("Veuillez montrer");                       
    lcd.setCursor(2, 1);                                 
    lcd.print("votre  badge");

}

void loop(){
  if(rfid.isCard()){                                               
    
        if(rfid.readCardSerial()){     
            Serial.print(rfid.serNum[0]);
            Serial.print(" ");
            Serial.print(rfid.serNum[1]);
            Serial.print(" ");
            Serial.print(rfid.serNum[2]);
            Serial.print(" ");
            Serial.print(rfid.serNum[3]);
            Serial.print(" ");
            Serial.print(rfid.serNum[4]);
            Serial.println("");
              
           for(int x = 0; x < sizeof(card1); x++){
              for(int i = 0; i < sizeof(rfid.serNum); i++ ){
                  if(rfid.serNum[i] != card1[x][i]) {                
                      
                  access1 = false;
                                           
           Serial.println("Acces carte 1 invalide");
           
           lcd.clear();
           lcd.setCursor(0, 0);
           lcd.print("Acces refuse");
           delay(2000);
           lcd.clear();
           delay (2000);
           lcd.print("Veuillez montrer");           
           lcd.setCursor(2, 1);
           lcd.print("votre  badge"); 
                    
                  }                                    
                  else {
                    
                      access1 = true;
                                          
           Serial.println("Acces carte 1 valide");
           lcd.clear();
           lcd.setCursor(0, 0);                          
           lcd.print("Bienvenue Paul");
           delay(2000);
           lcd.clear();
           delay(1000);
           digitalWrite(relaisPin, HIGH);                         
           delay (2000);
           digitalWrite(relaisPin, LOW);                          
           delay(2000);
           lcd.print("Veuillez montrer");           
           lcd.setCursor(2, 1);
           lcd.print("votre  badge");    
                  
                  
                  }                
                   if(access1) break;
              }
               break;
            }
           
        }

  }

if(rfid.isCard()){                                               
    
        if(rfid.readCardSerial()){     
            Serial.print(rfid.serNum[0]);
            Serial.print(" ");
            Serial.print(rfid.serNum[1]);
            Serial.print(" ");
            Serial.print(rfid.serNum[2]);
            Serial.print(" ");
            Serial.print(rfid.serNum[3]);
            Serial.print(" ");
            Serial.print(rfid.serNum[4]);
            Serial.println("");
              
           for(int x = 0; x < sizeof(card2); x++){
              for(int i = 0; i < sizeof(rfid.serNum); i++ ){
                  if(rfid.serNum[i] != card2[x][i]) {                
                      
          access2 = false;
                                           
           Serial.println("Acces carte 2 invalide");
           
           lcd.clear();
           lcd.setCursor(0, 0);
           lcd.print("Acces refuse");
           delay(2000);
           lcd.clear();
           delay (2000);
           lcd.print("Veuillez montrer");           
           lcd.setCursor(2, 1);
           lcd.print("votre  badge"); 
                    
                  }                                    
                  else {
                    
                      access2 = true;
                                          
           Serial.println("Acces carte 2 valide");
           lcd.clear();
           lcd.setCursor(0, 0);                          
           lcd.print("Bienvenue Paul");
           delay(2000);
           lcd.clear();
           delay(1000);
           digitalWrite(relaisPin, HIGH);                          
           delay (2000);
           digitalWrite(relaisPin, LOW);                          
           delay(2000);
           lcd.print("Veuillez montrer");           
           lcd.setCursor(2, 1);
           lcd.print("votre  badge");    
                  
                  
                  }                
                   if(access2) break;
              }
               break;
            }
           
        }

       
}
 rfid.halt();
  }

Le plus simple est de remplacer le message "Accès invalide" par le message "Bonjour Maxime"... :stuck_out_tongue:

Plus sérieusement, ton code c'est une usine à gaz : tu recopies les tests deux fois et c'est une source d'erreurs. Tu ferais mieux de faire la vérification des deux badges en une seule fois, genre :

if(rfid.isCard()){                                               
    
        if(rfid.readCardSerial()){     
            Serial.print(rfid.serNum[0]);
            Serial.print(" ");
            Serial.print(rfid.serNum[1]);
            Serial.print(" ");
            Serial.print(rfid.serNum[2]);
            Serial.print(" ");
            Serial.print(rfid.serNum[3]);
            Serial.print(" ");
            Serial.print(rfid.serNum[4]);
            Serial.println("");
              
           for(int x = 0; x < sizeof(card2); x++){
              for(int i = 0; i < sizeof(rfid.serNum); i++ ){
                  if(rfid.serNum[i] != card1[x][i]) access1 = false;
                  if(rfid.serNum[i] != card2[x][i]) access2 = false;
                            }
                        }  // <-- Attention j'ai modifié ici (fermeture accolade)
               
           if (!access1) Serial.println("Acces carte 1 invalide");
           if (!access2) Serial.println("Acces carte 2 invalide");
           
           if (!access1 | !access2) {
           lcd.clear();
           lcd.setCursor(0, 0);
           lcd.print("Acces refuse");
           delay(2000);
                  }  

        else if (access1) {
           access1 = false; // <-- modif ici aussi -il est déjà true)
           Serial.println("Acces carte 1 valide");
           lcd.clear();
           lcd.setCursor(0, 0);                          
           lcd.print("Bienvenue Paul");
           digitalWrite(relaisPin, HIGH);                          
           delay (2000);
           digitalWrite(relaisPin, LOW);                          
           delay(2000);
                  }                                                  
        else if (access2) {
           access2 = false;  // même chose
           Serial.println("Acces carte 2 valide");
           lcd.clear();
           lcd.setCursor(0, 0);                          
           lcd.print("Bienvenue Maxime");
           digitalWrite(relaisPin, HIGH);                          
           delay (2000);
           digitalWrite(relaisPin, LOW);                          
           delay(2000); 
                }

           lcd.clear();
           delay(1000);
           lcd.print("Veuillez montrer");           
           lcd.setCursor(2, 1);
           lcd.print("votre  badge");    
           //        if(access2) break;
              }
        //       break;
            }

J'ai écris ça rapidement, il faut vérifier si c'est correct et l'optimiser, mais c'est l'idée. J'ai commenté les break car je ne sais pas à quoi ils servent.

Prend l'habitude de faire l'indentation automatique du code dans l'IDE Arduino (commande CTRL T), ça aide ) vérifier les niveaux d'accolades. Toujours dans l'IDE, si tu places le curseur (clic de souris) sur ue accolade (ouvrante ou fermante), il te montre où se trouve l'accolade associée. C'est très utile pour débuguer.

Bonjour
Même impression concernant l''organisation douteuse des tests de cartes.
Un algorigramme permettrait de tester plus facilement la logique d'identification des cartes

Je pense que la bilbiothèque utilisée est celle-ci. Dans les exemples, il ne met pas la déclaration du tableau rfid.serNum :
int serNum[5];Il faut peut-être ôter cette ligne pour éviter des conflits ?

Je viens de faire un algorigramme pour mon programme, j'essaye de faire fonctionner le programme que tu m'as passer c'est vrai que le mien était pas clair :stuck_out_tongue:

Algo1.pdf (12.8 KB)