Problème badge RFID

Bonjour à tous/toutes,

me voilà coincé depuis quelques temps déjà sur mon programme Arduino.

Dans celui-ci, j’ai à disposition 2 badges (un badge “professeur” et un badge “élève” : le badge professeur est censé ouvrir la porte et pas l’autre. Lorsque la porte est ouverte, Le badge élève est censé pouvoir être passé afin de confirmer la présence de la personne (avec présent ou en retard) ou bien la mettre absente si le badge n’est toujours pas passé au-delà d’un certain temps.

Seulement voilà, je n’arrive pas à faire en sorte que le programme marche comme je le veux. Soit le badge élève n’est carrément pas reconnu, soit il affiche “présent” ou “en retard” même lorsque la porte est fermée. De plus, il affiche “absent” lorsque j’ai déjà badgé celui-ci.

L’erreur doit provenir de la fonction millis ou bien des crochets, mais comme je suis plutôt inexpérimenté, je ne parviens pas à trouver l’erreur.

Merci d’avance pour votre aide.

   #include <RFID.h>
    #include <SPI.h>
    
    #define SS_PIN 10
    #define RST_PIN 9
    
    RFID monModuleRFID(10,9);
    
    
    int UID[5];
    int MASTERKEY[5] = {98,146,141,185,196,};
    int pinRelais = 8;
    

    long temps;
    int ELEVE[5];
    int carte_eleve[5] = {57,87,234,64,196,};
   
   
    char st[20];
    void setup() 
    {
      
      pinMode(pinRelais,OUTPUT);
     
      Serial.begin(9600);
      SPI.begin();
      monModuleRFID.init(); 
      
      Serial.println("Test acces via TAG RFID");
      Serial.println();
      temps = millis();
     
    }
    void loop() // le corp de notre programme
    {


      
      if (monModuleRFID.isCard()) {
        if (monModuleRFID.readCardSerial())  {
          Serial.print("L'UID est :");
          for(int i=0;i<=4;i++)
          {
            UID[i]=monModuleRFID.serNum[i];
             Serial.print(UID[i],DEC);
               Serial.print(".");
          }
         Serial.println("");
        }
          
    
      if (UID[0] == MASTERKEY[0]
       && UID[1] == MASTERKEY[1]
       && UID[2] == MASTERKEY[2]
       && UID[3] == MASTERKEY[3]
       && UID[4] == MASTERKEY[4])  
      {
      
     
        digitalWrite(pinRelais, LOW);
        Serial.print("porte ouverte");
        Serial.println(); 
        temps = millis();
        
       }
     
           if ((((millis() - temps) < 2500)) &&  (UID[0] == carte_eleve[0]
       && UID[1] == carte_eleve[1]
       && UID[2] == carte_eleve[2]
       && UID[3] == carte_eleve[3]
       && UID[4] == carte_eleve[4]))
       {
        Serial.print("present");
        Serial.println();
       
        delay(1000);
       }
       else if (((millis() - temps) > 2500)  &&  (UID[0] == carte_eleve[0]
       && UID[1] == carte_eleve[1]
       && UID[2] == carte_eleve[2]
       && UID[3] == carte_eleve[3]
       && UID[4] == carte_eleve[4]))
       {
        Serial.print("en retard");
        Serial.println();
        
        delay(1000);
       }
      
   
       if (((millis() - temps) >= 5000) && (UID[0] != carte_eleve[0]
       && UID[1] != carte_eleve[1]
       && UID[2] != carte_eleve[2]
       && UID[3] != carte_eleve[3]
       && UID[4] != carte_eleve[4]))
       {
        Serial.print("absent");
        Serial.println();
        
        delay(1000);
       }
      
      
        if ((millis()- temps)> 5000)
        {
        digitalWrite(pinRelais, HIGH);
        Serial.print("porte fermée");
        Serial.println();
        temps=millis();
        }
        }
 }

Visiblement, tu as une machine à états (cherche un peu ce terme sur le Net...), et ton état n'est mémorisé nulle part.
Tu as 2 états :

  • PORTE_FERMEE
  • PORTE_OUVERTE

Tu as 3 événements à gérer :

  • passage badge professeur
  • passage badge élève
  • temps écoulé depuis ouverture porte > limite autorisée.