RFID 125khz - RDM630 _ lecture intempestive [RESOLU]

Bonjour,
Je bloque sur mon projet, et j'ai besoin d'aide... Merci d'avance!

Projet:
Serrure pour une cabane à vélos par un vérin électrique commandé par un badge RFID 125khz (+ 1 BP à l’intérieur de la cabane), le tout sur un arduino UNO.

Materiel:
UNO
RFID
relais

  • quelques fin courses, led, boutons poussoirs.

Pour info:
Pour l'instant les fin de course et relais sont simulé par des boutons poussoirs et led.
Pour la partie RFID/comparaison badge je suis allé ici : ici , je ne comprends pas la ligne 69 de l'exemple RFID.flush(); // stops multiple reads
Dans le code, j'ai remplacé mes numéros de badge par des xxx pour ne pas les diffuser.

Mon cycle fonctionne sauf que:
Problème :
1- Si je suis trop lent pour retirer le badge du lecteur, il continu à être lu plusieurs fois.
Le cycle se passe bien, mais il se répète (même s'il n'y a plus de badge présent) autant de fois qu'il a eu le temps de les lire précédemment.
2- Si je présente un badge alors que la porte est ouverte (CaptPF dans le code), le cycle ne se lance pas (normal), par contre il se lance dès que la porte est fermé (ce qui n'est pas voulu)

Bon place au code, attention les yeux, c'est mon premier...

//RFID
#include <SoftwareSerial.h>
SoftwareSerial RFID(2,3); // RX and TX

int data1 = 0;
bool badgeOK = false;


int tag1[14] = {2,xxxxx,3}; 
int tag2[14] = {2,xxxxx,3}; 
int tag3[14] = {2,xxxxx,3}; 
int tag4[14] = {2,xxxxx,3}; 

int newtag[14] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0}; // used for read comparisons



//cycle
//output
const int kaF=8; //relais fermeture
const int kaO=9; //relais ouverture
const int LedDEF=10; //visu fin course HS
const int LedR=11; //visu ouverture
const int LedV=12; //visu fermeture

//input
const int FcF=4; //fin course ferme
const int FcO=5; //fin course ouvert
const int BpM=6; //BP commande manuel manuel
const int CaptPF=7; //Capteur magnetique controle porte position ferme

//variable
bool mouvF; //fermeture en cours
bool mouvO; //ouverture en cours
unsigned long secuFC; //stockage du temps pour securite si fin course HS


void setup()
{  
//RFID
RFID.begin(9600);    // start serial to RFID reader


//cycle
pinMode(kaF,OUTPUT);
pinMode(kaO,OUTPUT);
pinMode(LedDEF,OUTPUT);
pinMode(LedR,OUTPUT);
pinMode(LedV,OUTPUT);

pinMode(FcF,INPUT);
pinMode(FcO,INPUT);
pinMode(BpM,INPUT);
pinMode(CaptPF,INPUT);

digitalWrite(kaF,LOW);
digitalWrite(kaO,LOW);
digitalWrite(LedDEF,LOW);
digitalWrite(LedR,LOW);
digitalWrite(LedV,LOW);
mouvF=false;
mouvO=false;  
}
//-----------------------------------
//RFID-fonction

boolean comparetag(int aa[14], int bb[14])
{
  boolean ff = false;
  int fg = 0;
  for (int cc = 0 ; cc < 14 ; cc++)
  {
    if (aa[cc] == bb[cc])
    {
      fg++;
    }
  }
  if (fg == 14)
  {
    ff = true;
  }
  return ff;
}

void checkmytags() // compares each tag against the tag just read
{
 badgeOK=false;
  if (comparetag(newtag, tag1) == true) //eric
  {
    badgeOK=true;
  }
  if (comparetag(newtag, tag2) == true) //carole
  {
    badgeOK=true;
  }
  if (comparetag(newtag, tag3) == true) //enzo
  {
    badgeOK=true;
  }
  if (comparetag(newtag, tag4) == true) //clara
  {
    badgeOK=true;
  }
}

void readTags()
{

  if (RFID.available() > 0)
  {
    // read tag numbers
    delay(100); // needed to allow time for the data to come in from the serial buffer.

    for (int z = 0 ; z < 14 ; z++) // read the rest of the tag
    {
      data1 = RFID.read();
      newtag[z] = data1;
    }
    RFID.flush(); // stops multiple reads

    // do the tags match up?
    checkmytags();
  }  
}



//-----------------------------------
//CYCLE-fonction
void fermeture()
{
  digitalWrite(kaF,HIGH); //relais fermeture actif
  secuFC=millis(); //pour secu fin course HS
  mouvF=true; //fermeture en cours
  
  while(mouvF==true) //temps que "fermeture" est en cours
  {
    digitalWrite(LedR,millis()/250%2); //visu fermeture en cours
  
    if(digitalRead(FcF)==HIGH) //fin course OK fonctionnement normal
        {
          mouvF=false; //fin de demande fermeture
          digitalWrite(kaF,LOW); //relais inactif
          digitalWrite(LedR,HIGH); //visu fin de fermeture allume
          delay(5000);
          digitalWrite(LedR,LOW); //visu fin de fermeture eteind
        }
     else if(millis()-secuFC>=10000) //securite si fin course HS
        {
          mouvF=false; //fin de demande fermeture
          digitalWrite(kaF,LOW); //relais inactif
          digitalWrite(LedDEF,HIGH); //visu fin de course HS, ne peut etre eteind que par reset de la carte
          digitalWrite(LedR,HIGH); //visu fin de fermeture allume
          delay(5000);
          digitalWrite(LedR,LOW); //visu fin de fermeture eteind
        }
  }
  delay(100);

}

void ouverture()
{
  digitalWrite(kaO,HIGH); //relais ouverture actif
  secuFC=millis(); //pour secu fin course HS
  mouvO=true; //ouverture en cours
  
  while(mouvO==true) //temps que "ouverture" est en cours
  {
    digitalWrite(LedV,millis()/250%2); //visu ouverture en cours
  
    if(digitalRead(FcO)==HIGH) //fin course OK fonctionnement normal
        {
          mouvO=false; //fin de demande ouverture
          digitalWrite(kaO,LOW); //relais inactif
          digitalWrite(LedV,HIGH); //visu fin de ouverture allume
          delay(5000); 
          digitalWrite(LedV,LOW); //visu fin de ouverture eteind
        }
     else if(millis()-secuFC>=10000) //securite si fin course HS
        {
          mouvO=false; //fin de demande ouverture
          digitalWrite(kaO,LOW); //relais inactif
          digitalWrite(LedDEF,HIGH); //visu fin de course HS, ne peut etre eteind que par reset de la carte
          digitalWrite(LedV,HIGH); //visu fin de ouverture allume
          delay(5000);
          digitalWrite(LedV,LOW); //visu fin de ouverture eteind
        }
  }
  delay(100);

}

void loop()
{
   if (digitalRead(CaptPF)==LOW) //si porte ferme
   {
   
      if (digitalRead(FcO)==HIGH && digitalRead(BpM)==HIGH) //demande fermeture manuel
      {
        fermeture();
      }
      
      else if (digitalRead(FcO)!=HIGH && digitalRead(BpM)==HIGH) //demande ouverture manuel
      {
        ouverture();
      }


 
    
     readTags(); //fonction readTags
  
       if (digitalRead(FcO)==HIGH && badgeOK==true) //demande fermeture badge
       {
          fermeture();
          badgeOK=false;
        }
      
       else if (digitalRead(FcO)!=HIGH && badgeOK==true) //demande ouverture badge
       {
          ouverture();
          badgeOK=false;
       }
   
  
  } 

delay(200);    
}

Merci de votre aide!

Donc je cherche
Soit à bloquer la lecture multiple , j'ai essayer de mettre un intervalle de temps, de bloquer la void readtags si une manoeuvre es active.
Soit à purger les tags lu pendant une manoeuvre.
Sans succès.

:slight_smile: RESOLU :slight_smile:

La solution est
Quand on ne veut pas des données qui arrivent sur serial alors on les lis et on en fait "rien"
Ca à pour effet de vider le buffer.

L'astuce à été trouvé ici post #1

J'ai donc mis des while(RFID.available()>0) {char t = RFID.read();} //vide memoire tampon serie en fin de cycle ouverture/fermeture et en porte position ouverte.

Code au complet :

//RFID
#include <SoftwareSerial.h>
SoftwareSerial RFID(2,3); // RX and TX

int data1 = 0;
bool badgeOK = false;


int tag1[14] = {0,0,0,0,0,0,0,0,1,0,0,0,0,0}; 
int tag2[14] = {0,0,0,0,0,0,0,0,3,0,0,0,0,0}; 
int tag3[14] = {0,0,0,0,0,0,0,0,7,0,0,0,0,0}; 
int tag4[14] = {0,0,0,0,0,0,0,0,4,0,0,0,0,0}; 

int newtag[14] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0}; // used for read comparisons



//cycle
//output
const int kaF=8; //relais fermeture
const int kaO=9; //relais ouverture
const int LedDEF=10; //visu fin course HS
const int LedR=11; //visu ouverture
const int LedV=12; //visu fermeture

//input
const int FcF=4; //fin course ferme
const int FcO=5; //fin course ouvert
const int BpM=6; //BP commande manuel manuel
const int CaptPF=7; //Capteur magnetique controle porte position ferme

//variable
bool mouvF; //fermeture en cours
bool mouvO; //ouverture en cours
unsigned long secuFC; //stockage du temps pour securite si fin course HS


void setup()
{  
//RFID
RFID.begin(9600);    // start serial to RFID reader


//cycle
pinMode(kaF,OUTPUT);
pinMode(kaO,OUTPUT);
pinMode(LedDEF,OUTPUT);
pinMode(LedR,OUTPUT);
pinMode(LedV,OUTPUT);

pinMode(FcF,INPUT);
pinMode(FcO,INPUT);
pinMode(BpM,INPUT);
pinMode(CaptPF,INPUT);

digitalWrite(kaF,LOW);
digitalWrite(kaO,LOW);
digitalWrite(LedDEF,LOW);
digitalWrite(LedR,LOW);
digitalWrite(LedV,LOW);
mouvF=false;
mouvO=false;  
}
//-----------------------------------
//RFID-fonction

boolean comparetag(int aa[14], int bb[14])
{
  boolean ff = false;
  int fg = 0;
  for (int cc = 0 ; cc < 14 ; cc++)
  {
    if (aa[cc] == bb[cc])
    {
      fg++;
    }
  }
  if (fg == 14)
  {
    ff = true;
  }
  return ff;
}

void checkmytags() // compares each tag against the tag just read
{
 badgeOK=false;
  if (comparetag(newtag, tag1) == true) 
  {
    badgeOK=true;
  }
  if (comparetag(newtag, tag2) == true) 
  {
    badgeOK=true;
  }
  if (comparetag(newtag, tag3) == true) 
  {
    badgeOK=true;
  }
  if (comparetag(newtag, tag4) == true) 
  {
    badgeOK=true;
  }
}

void readTags()
{

  if (RFID.available() > 0)
  {
    // read tag numbers
    delay(100); // needed to allow time for the data to come in from the serial buffer.

    for (int z = 0 ; z < 14 ; z++) // read the rest of the tag
    {
      data1 = RFID.read();
      newtag[z] = data1;
    }
    RFID.flush(); // stops multiple reads

    // do the tags match up?
    checkmytags();
  }  
}



//-----------------------------------
//CYCLE-fonction
void fermeture()
{
  digitalWrite(kaF,HIGH); //relais fermeture actif
  secuFC=millis(); //pour secu fin course HS
  mouvF=true; //fermeture en cours
  
  while(mouvF==true) //temps que "fermeture" est en cours
  {
    digitalWrite(LedR,millis()/250%2); //visu fermeture en cours
  
    if(digitalRead(FcF)==HIGH) //fin course OK fonctionnement normal
        {
          mouvF=false; //fin de demande fermeture
          digitalWrite(kaF,LOW); //relais inactif
          digitalWrite(LedR,HIGH); //visu fin de fermeture allume
          delay(5000);
          digitalWrite(LedR,LOW); //visu fin de fermeture eteind
        }
     else if(millis()-secuFC>=10000) //securite si fin course HS
        {
          mouvF=false; //fin de demande fermeture
          digitalWrite(kaF,LOW); //relais inactif
          digitalWrite(LedDEF,HIGH); //visu fin de course HS, ne peut etre eteind que par reset de la carte
          digitalWrite(LedR,HIGH); //visu fin de fermeture allume
          delay(5000);
          digitalWrite(LedR,LOW); //visu fin de fermeture eteind
        }
  }
  while(RFID.available()>0) {char t = RFID.read();} //vide memoire tampon serie
  delay(100);

}

void ouverture()
{
  digitalWrite(kaO,HIGH); //relais ouverture actif
  secuFC=millis(); //pour secu fin course HS
  mouvO=true; //ouverture en cours
  
  while(mouvO==true) //temps que "ouverture" est en cours
  {
    digitalWrite(LedV,millis()/250%2); //visu ouverture en cours
  
    if(digitalRead(FcO)==HIGH) //fin course OK fonctionnement normal
        {
          mouvO=false; //fin de demande ouverture
          digitalWrite(kaO,LOW); //relais inactif
          digitalWrite(LedV,HIGH); //visu fin de ouverture allume
          delay(5000); 
          digitalWrite(LedV,LOW); //visu fin de ouverture eteind
        }
     else if(millis()-secuFC>=10000) //securite si fin course HS
        {
          mouvO=false; //fin de demande ouverture
          digitalWrite(kaO,LOW); //relais inactif
          digitalWrite(LedDEF,HIGH); //visu fin de course HS, ne peut etre eteind que par reset de la carte
          digitalWrite(LedV,HIGH); //visu fin de ouverture allume
          delay(5000);
          digitalWrite(LedV,LOW); //visu fin de ouverture eteind
        }
  }
  while(RFID.available()>0) {char t = RFID.read();} //vide memoire tampon serie
  delay(100);

}

void loop()
{
   if (digitalRead(CaptPF)==LOW) //si porte ferme
   {
   
      if (digitalRead(FcO)==HIGH && digitalRead(BpM)==HIGH) //demande fermeture manuel
      {
        fermeture();
      }
      
      else if (digitalRead(FcO)!=HIGH && digitalRead(BpM)==HIGH) //demande ouverture manuel
      {
        ouverture();
      }


 
    
     readTags(); //fonction readTags
  
       if (digitalRead(FcO)==HIGH && badgeOK==true) //demande fermeture badge
       {
          fermeture();
          badgeOK=false;
        }
      
       else if (digitalRead(FcO)!=HIGH && badgeOK==true) //demande ouverture badge
       {
          ouverture();
          badgeOK=false;
       }
   }

   while (digitalRead(CaptPF)==HIGH)
    {
      while(RFID.available()>0) {char t = RFID.read();} //vide memoire tampon serie
    }

delay(200);    
}