Comment retirer un tag RFID Perdu de l'eeprom d'arduino

Bonjour à toutes et tous

si vous le permettez j'ai une question sur un problème que je n'arrive pas à résoudre

en effet, j'essai de réaliser un contrôle d'ouverture de portes par RFID, en cherchant un peu par tout et en tentant un millier de bouts de codes (vu que je suis electro-mécanicien de formation: je cherche les codes et je fait tout pour les comprendre si je peu bien sur ou de les combiner) j'arrive à commander une serrure par TAG Rfid et j'arrive aussi à enregistrer les tags dans l'eeprom d'arduino et tout est presque nickel sauf que je me suis posé la question: **Et si je perd un "tag card" qui est enregistré déjà dans l'eeprom d'arduino :sob: :sob: :sob: :sob: , comment je pourrai le supprimer ? :astonished: :astonished: :astonished: **
vraiment je galère la dessus
j'ai consulter une tonne de sites et forums mais sans succès :disappointed_relieved: :disappointed_relieved: :disappointed_relieved:
je serai très reconnaissant si quelqu'un pourrait me filer un coup de main la dessus merci :wink: :wink:

PS: j'utilse arduino uno
RC 522

ça veut dire quoi le supprimer ?
Comment savez vous que vous avez perdu un badge ?
Comment identifiez vous un badge d’un autre ?
Que stockez vous dans l’EEPROM ?

(Pour enlever un truc de l’EEPROM — par exemple en mettant des 0 à la place — Il faut savoir retrouver l’espace adéquat)

Je poste le code du quel je me suis inspiré fait par "Experimentboy" présenté sur sa chaîne Youtube

#include <SPI.h>
#include <RFID.h>
#include <EEPROM.h>

#define SS_PIN 10 //SS=SDA, 53 imposé pour Mega, puis SCK 52, MOSI 51, MISO 50
                   // Arduino Uno: RST: 9, SS (SDA): 10, MOSI: 11, MISO: 12, SCK: 13
                   // Arduino Nano: RST: D9, SS (SDA): D10, MOSI: D11, MISO: D12, SCK: D13
#define RST_PIN 9 //le pin qu'on veut pour RST

byte led_rouge = 6, led_verte = 7, bouton = 4, serrure = 8, buzz = 2;
byte cur_badge[5]; //current badge, liste des 5 octets du badge que l'on lit

RFID rfid(SS_PIN, RST_PIN); 
    
void setup()
{ 
  Serial.begin(9600); //uniquement pour debug, arrête de faire pause pour lire mes conneries
  SPI.begin(); 
  rfid.init();
  pinMode(led_rouge,OUTPUT);
  pinMode(led_verte,OUTPUT);
  pinMode(bouton, INPUT_PULLUP);
  pinMode(serrure, OUTPUT);
  pinMode(buzz, OUTPUT);
  
  if( !digitalRead(bouton))// à l'appui du bouton au moment du démarrage, effaçage de la mémoire
  {
    for (int n=0; n<1024; n++) //lancer ces deux lignes pour effacer totalement la mémoire 
        EEPROM.write(n,0);
  
  digitalWrite(led_rouge,1);
  digitalWrite(led_verte,1);
  tone(buzz,2093,1000);
  delay(1000);
  digitalWrite(led_rouge,0);
  digitalWrite(led_verte,0);
  }
  else //bip normal d'allumage
  {
    digitalWrite(led_verte,1);
    tone(buzz,2093, 150); delay(150);
    digitalWrite(led_verte,0); delay(150);
    tone(buzz, 2093, 150); digitalWrite(led_verte,1); delay(150);
    digitalWrite(led_verte,0);
  }
}

void new_badge()
{
  // Enregistre un nouveau badge dans la mémoire EEPROM
  int start_mem = EEPROM.read(0)*5+1; //dans la première case mémoire, on stock le nombre de badge déjà sauvegardés,
                                  //et on calcule la case mémoire à partir de laquelle enregistrer le nouveau badgenb_badge
    for(byte n= 0; n<5; n++)
    {
      EEPROM.write(start_mem+n, cur_badge[n]);
    }
    EEPROM.write(0, EEPROM.read(0)+1);
}

bool compare_badge()
{
  //Compare le badge lu avec tous les badges enregistrés
  int nb_badge = EEPROM.read(0); //récupération du nombre de badges stockés en mémoire
  bool badgeOk = false; //0 si badge non correspondant, 1 si badge correspondant
  /*Serial.println("Badge actuel: ");
  Serial.println(cur_badge[0]);
  Serial.println(cur_badge[1]);
  Serial.println(cur_badge[2]);
  Serial.println(cur_badge[3]);
  Serial.println(cur_badge[4]);
  Serial.println("FIN BADGE ACTUEL");*/
  for(int n = 0; n<nb_badge; n++)
  {
  /*Serial.print("Badge memoire lu numero: "); Serial.println(n+1);
  Serial.println(EEPROM.read(n*5+1));
  Serial.println(EEPROM.read(n*5+2));
  Serial.println(EEPROM.read(n*5+3));
  Serial.println(EEPROM.read(n*5+4));
  Serial.println(EEPROM.read(n*5+5));
  Serial.println("FIN BADGE MEMOIRE LU");*/
    badgeOk = EEPROM.read(n*5+1)==cur_badge[0] && EEPROM.read(n*5+2)==cur_badge[1] && EEPROM.read(n*5+3)==cur_badge[2] && EEPROM.read(n*5+4)==cur_badge[3] && EEPROM.read(n*5+5)==cur_badge[4];
    if (badgeOk) return true;
  }
  return false;
}



void loop()
{
    if (rfid.isCard()) {
        if (rfid.readCardSerial())
            {
                for(byte n=0; n<5; n++)
                {
        cur_badge[n] = rfid.serNum[n]; //copie de la liste des 5 octets lus sur le badge dans la liste current badge (cur_badge))
        } 
                /*Serial.println(rfid.serNum[0],DEC);
                Serial.println(rfid.serNum[1],DEC);
                Serial.println(rfid.serNum[2],DEC);
                Serial.println(rfid.serNum[3],DEC);
                Serial.println(rfid.serNum[4],DEC);*/
             
         if(compare_badge()) //si la comparaison du badge actuel avec un des badges mémoire est ok, alors on ouvre
         {
          digitalWrite(led_verte,1);
          tone(buzz,523,50);
          delay(50);
          tone(buzz, 783, 50);
          delay(50);
          tone(buzz, 1046, 50);
          delay(50);
          tone(buzz, 1568, 50);
          delay(50);
          tone(buzz, 2093, 70);
          delay(250);
          digitalWrite(serrure, 1);
          delay(3000);
          digitalWrite(led_verte,0);
          digitalWrite(serrure, 0);
         }
         else
         {
          digitalWrite(led_rouge, 1);
          tone(buzz,370,50);
          delay(100);
          tone(buzz, 370, 300);
          delay(1000);
          digitalWrite(led_rouge, 0);
         }
       }
    }

          
    if(!digitalRead(bouton)) //lors de l'appui du bouton pour enregistrer un nouveau badge
    {
       while(!digitalRead(bouton)) {} //anti rebond sur le bouton d'enregistrement de nouveau badge
       delay(100);
       
       digitalWrite(led_rouge, 1); digitalWrite(led_verte,1); //allumage des deux leds simultanément pour signaler que c'est OOOKAAAAAYYYYY et prêt
  
       while (!rfid.isCard() && digitalRead(bouton)) {} //on attend la lecture d'un badge, ou le rappui du bouton qui va annuler, car le if suivant ne sera pas vérifié
       
       if (rfid.readCardSerial())
       {
        for(byte n=0; n<5; n++)
            {cur_badge[n] = rfid.serNum[n];} //lecture du badge que l'on passe
        if(!compare_badge()) //si le badge n'est pas déjà enregistré, on enregistre le nouveau badge
            {
              new_badge(); 
              digitalWrite(led_rouge, 0);
              digitalWrite(led_verte, 1);
              tone(buzz, 2093, 500);
              delay(200);
              digitalWrite(led_verte, 0);
              delay(200);
              digitalWrite(led_verte, 1);
              delay(200);
              digitalWrite(led_verte, 0);
              delay(200);
              digitalWrite(led_verte, 1);
              delay(200);
              digitalWrite(led_verte, 0);
            }
          else //si le badge que l'on veut ajouter est déjà enregistré, du con, ça clignote rouge
          {
              digitalWrite(led_verte, 0);
              digitalWrite(led_rouge, 1);
              tone(buzz,370,500);
              delay(200);
              digitalWrite(led_rouge, 0);
              delay(200);
              digitalWrite(led_rouge, 1);
              delay(200);
              digitalWrite(led_rouge, 0);
              delay(200);
              digitalWrite(led_rouge, 1);
              delay(200);
              digitalWrite(led_rouge, 0);
          }
        }
      else 
      {
         //si on rappuie sur le bouton, retour
        digitalWrite(led_rouge,0);
        digitalWrite(led_verte,0);
        while(!digitalRead(bouton)) {} //anti redéclenchement si on reste appuyé
        delay(500);
      }
     }
    rfid.halt();
}

J-M-L:
ça veut dire quoi le supprimer ?
Comment savez vous que vous avez perdu un badge ?
Comment identifiez vous un badge d’un autre ?
Que stockez vous dans l’EEPROM ?

(Pour enlever un truc de l’EEPROM — par exemple en mettant des 0 à la place — Il faut savoir retrouver l’espace adéquat)

merci pour votre réponse

je ne sais pas si j'ai bien exposé mon problème

par exemple j'ai 10 badges RFID enregistrés dans l'arduino, je vien de perdre l'un d'entre eux (Volé, égaré ou pour tout autres raison)il peut être un risque de lel laisser dans la mémoire comme valide et qui peut ouvrir la porte, donc je doit trouver une solution pour le supprimer sans avoir à effacer toute l'eeprom et rescanner de nouveau les badges pour les enregistrer.
j'espère que j'ai bien exposé le problème
merci encore une fois pour votre réponse

Bonsoir

Effacer un badge de L’eeprom c’est facile... remplacez le par des 0 par exemple
Mais faut savoir lequel, donc je reviens à ma question, si le badge de Paul est perdu, comment le retrouvez vous en EEPROM si tout ce que vous avez noté c’est le N° du badge... ?

=> tout dépend de votre code et de comment vous avez organisé les badges, dans ce qu’il y a plus haut, à moins de connaître le code ou l’adresse en eeprom du badge à effacer vous êtes coincé

J-M-L
Merci pour votre réponse
auriez vous une idée à me proposé si vous permettez que je le demande car vraiment çà deviens du chinois pour moi :smiley: :smiley: :smiley:
je ne sais plus quoi faire
comme est ce que je pourrai rendre les badges identifiables ?
est ce que l'utilisation d'une SDcard pourra aider (excusez moi peut être que je suis en train de dire dire du n'importe quoi)
je veut dire y a t'il un moyen de sauvegarder le cartes acceptées, tout en les identifiants bien sur lors du scan, sur une sdCard connectée en permanence à l'arduino et dans mon cas une consultation de l'SDcard et la suppression résoudra le problème. est ce que c'est envisageable d'après vous?
Merci

bonjour.

le rajout de la carte sd ne va que reporter le probléme sur un autre support..

(faire un journal des entrées c'est autre chose)

dans la mesure ou la place laissée pour un badge dans le tableau le permét

il faudrai soit ajouter un caractère type numéro d' ordre en fin de chaque badge.

soit a chaque badge rentrai dans l’EPROM retourner dans un autre tableau
un numéro d' ordre et l 'ADRESSE M2MOIRE de l' EPROM correspondante.

souvent le numéro rfid est écrit sur le badge , la le programme enregistre
les code rfid en EPROM dans l'ordre ou ils ont été rentrés , un programme type "EPROM read"
permet de tous les visualiser... a la suite.

ps le nombre d' écriture en eprom est limitée .

moi ce que je ferai : j’attribuerai un numéro à chaque badge, et ensuite il est facile de dire si par exemple le numéro 3 est perdu d'effacer ou remplacer le troisième enregistrement.

Oui - il faut garder ailleurs une référence « Paul à le badge N°3 » (3 serait alors l’index dans la base EEPROM).

Si Paul vient vous voir et vous dit « je démissionne », vous regardez dans de livre des références, trouvez le 3 et allez mettre des FF ou 00 dans ces cases mémoires, puis effacez le nom de Paul du livre de référence et récupérez le badge.

Si Pierre, un nouvel employé, arrive, vous prenez un nouveau badge, vous regardez le premier N° de référence dispo dans la table de référence et notez que Pierre a ce N° et vous stockez son ID dans la base EEPROM

Si le badge de Paul est perdu, principe un peu similaire mais au lieu de mettre des FF ou 00 en position N° 3 vous mettez le nouvel ID de la nouvelle carte donnée à Paul, ce qui a pour effet d’invalider l’ancienne. Paul aura toujours donc le badge N° 3

Pour valider ces process vous pouvez avoir à passer un badge admin par exemple et taper un code de transaction sur un petit clavier et un lcd vous affiche les menus et vous guide

La base de référence Employé <—> N° pourrait aussi être dans une base en EEPROM (mais vaudrait mieux avoir un backup papier ou ailleurs en cas de perte)

On pourrait aussi se passer du N°, et tout avoir au même endroit - nom de l’employé et ID. Dans ce cas on fait une recherche du nom de l’employé s’il a perdu son badge