RFID

bonjour a tous

je suis actuellement sur un nouveau projet mais biensur il y a toujours un truc qui ne fonctionne pas dont je ne trouve pas la solution du coup je vous sollicite afin de m aiguiller.

en fait mon projet se résume simplement je cherche à faire une machine à état avec des lecteurs RFID.

j ai deux lecteurs (ou plus ) et deux tag. Chaque tag a son lecteur et doivent être lu dans le bon ordre.
en gros le lecteur n°1 doit lire le tag n°1, une fois cela fait la machine état passe a l’étape suivante c'est à dire lire avec le lecteur n°2 le tag n° 2 etc....

j'ai donc fouiné sur le net afin de trouver quelque idées et de m en inspirer.
voici le code que j ai taper:

/*
 

#include <SPI.h>
#include <MFRC522.h>

#define SS_PIN1 8
#define RST_PIN 9
#define SS_PIN2 10
#define nombre_de_lecteurs  2

byte ssPins[]={SS_PIN1, SS_PIN2};

MFRC522 rfid[nombre_de_lecteurs]; 

#define PIN_LED_VERTE 4
#define PIN_LED_ROUGE 3

// liste clés valides
String motdepass[]={"35 ee e2 bb","f1 1f 35 83"};

enum code{etape1,etape2,etape3};
int etatCode=etape1;

void setup() { 
  Serial.begin(57600);
  SPI.begin(); // Init SPI bus
   // Init MFRC522 
   for (uint8_t y = 0; y < nombre_de_lecteurs; y++) {
    rfid[y].PCD_Init(ssPins[y], RST_PIN); 
    Serial.print(F("Lecteur "));
    Serial.print(y);
    Serial.print(F(": "));
    rfid[y].PCD_DumpVersionToSerial();
    
  pinMode(PIN_LED_VERTE,OUTPUT);
  pinMode(PIN_LED_ROUGE,OUTPUT);
  
  // led eteintes a l'init
  digitalWrite(PIN_LED_VERTE,LOW);
  digitalWrite(PIN_LED_ROUGE,LOW);
}
} 
void loop() {

switch (etatCode){

case etape1:  

  // Si on ne detecte pas une carte on reboucle au debut
  if ( ! rfid[0].PICC_IsNewCardPresent())
    return;

  // as t'on lu la carte
  if ( ! rfid[0].PICC_ReadCardSerial())
    return;

// recuperation de l'UID et concaténation de sa valeur en hex dans un string

String lecture=String(rfid.uid.uidByte[0],HEX) + " " + String(rfid.uid.uidByte[1],HEX) + " " + String(rfid.uid.uidByte[2],HEX) + " " + String(rfid.uid.uidByte[3],HEX);

// j'affiche la valeur de la carte sur le serial
Serial.println(myKey);
 // Halt PICC, fin de lecture de carte
  rfid.PICC_HaltA();
  // Stop encryption on PCD
  rfid.PCD_StopCrypto1();
  if(motdepass[0] == lecture){
    Serial.println("passage etape2");
    etatCode=etape2;
  }
  else{etatCode=etape1;}
  delay(100);
  break;
case etape2:

  // Si on ne detecte pas une carte on reboucle au debut
  if ( ! rfid[1].PICC_IsNewCardPresent())
    return;

  // as t'on lu la carte
  if ( ! rfid[1].PICC_ReadCardSerial())
    return;

// recuperation de l'UID et concaténation de sa valeur en hex dans un string

String lecture=String(rfid.uid.uidByte[0],HEX) + " " + String(rfid.uid.uidByte[1],HEX) + " " + String(rfid.uid.uidByte[2],HEX) + " " + String(rfid.uid.uidByte[3],HEX);

// j'affiche la valeur de la carte sur le serial
Serial.println(myKey);
 // Halt PICC, fin de lecture de carte
  rfid.PICC_HaltA();
  // Stop encryption on PCD
  rfid.PCD_StopCrypto1();
  
  if(motdepass[1] == lecture){
    Serial.println("passage etape3");
    etatCode=etape3;
  }
  else{etatCode=etape2;}
  delay(100);
  break;

 case etape3:

    digitalWrite(PIN_LED_VERTE,HIGH);
    Serial.println("accesok");
  
  delay(100);
  etatCode=etape1;
  break;
}
}

le souci est le suivant,une erreur de compilation se produit et je suis incapable de trouver la solution alors que j ai bien vérifié ma syntaxe à plusieurs reprise par rapport a l exemple du net qui lui fonctionne et ne me fait pas cette erreur.
l'erreur est la suivante :
"exit status 1
request for member 'uid' in 'rfid', which is of non-class type 'MFRC522 [2]"

si une ame charitable voudrait bien me mettre sur la voie j'en serais ravie :smiley:

merci d'avance amis "arduinologue" :smiley:

Je pense que tu ne peux pas faire une déclaration de deux instances de cette manière :

MFRC522 rfid[nombre_de_lecteurs];

A mon avis, tu dois déclarer deux instances différentes avec deux noms différents :

MFRC522 rfid1;
MFRC522 rfid2;

Tu crées donc deux lecteurs qui ont des noms différents et tu utilises chaque lecture avec son propre nom.

Mais je ne suis pas sûr que ce soit la cause de ton erreur. Le compilo ne trouve pas le membre 'uid' dans les instances 'rfid', peut-être que ça vient de ces lignes là :

String lecture=String(rfid.uid.uidByte[0],HEX) + " " + String(rfid.uid.uidByte[1],HEX) + " " + String(rfid.uid.uidByte[2],HEX) + " " + String(rfid.uid.uidByte[3],HEX);

(ça serait plus simple si tu copiais l'ensemble du message d’erreur, qui indique le numéro de ligne fautive). Dans ce cas, tu devrais avoir un truc plutôt comme ça :
String lecture=String(rfid[0].uid.uidByte[0],HEX) + " " + String(rfid[0].uid.uidByte[1],HEX) + " " + String(rfid[0].uid.uidByte[2],HEX) + " " + String(rfid[0].uid.uidByte[3],HEX);et similaire pour l'autre ligne.

/*
 * --------------------------------------------------------------------------------------------------------------------
 * Example sketch/program showing how to read new NUID from a PICC to serial.
 * --------------------------------------------------------------------------------------------------------------------
 * This is a MFRC522 library example; for further details and other examples see: https://github.com/miguelbalboa/rfid
 * 
 * Example sketch/program showing how to the read data from a PICC (that is: a RFID Tag or Card) using a MFRC522 based RFID
 * Reader on the Arduino SPI interface.
 * 
 * When the Arduino and the MFRC522 module are connected (see the pin layout below), load this sketch into Arduino IDE
 * then verify/compile and upload it. To see the output: use Tools, Serial Monitor of the IDE (hit Ctrl+Shft+M). When
 * you present a PICC (that is: a RFID Tag or Card) at reading distance of the MFRC522 Reader/PCD, the serial output
 * will show the type, and the NUID if a new card has been detected. Note: you may see "Timeout in communication" messages
 * when removing the PICC from reading distance too early.
 * 
 * @license Released into the public domain.
 * 
 * Typical pin layout used:
 * -----------------------------------------------------------------------------------------
 *             MFRC522      Arduino       Arduino   Arduino    Arduino          Arduino
 *             Reader/PCD   Uno/101       Mega      Nano v3    Leonardo/Micro   Pro Micro
 * Signal      Pin          Pin           Pin       Pin        Pin              Pin
 * -----------------------------------------------------------------------------------------
 * RST/Reset   RST          9             5         D9         RESET/ICSP-5     RST
 * SPI SS      SDA(SS)      10            53        D10        10               10
 * SPI MOSI    MOSI         11 / ICSP-4   51        D11        ICSP-4           16
 * SPI MISO    MISO         12 / ICSP-1   50        D12        ICSP-1           14
 * SPI SCK     SCK          13 / ICSP-3   52        D13        ICSP-3           15
 */

#include <SPI.h>
#include <MFRC522.h>

#define SS_PIN 53
#define RST_PIN 5
 
MFRC522 rfid(SS_PIN, RST_PIN); // appel de la classe

#define PIN_LED_VERTE 8
#define PIN_LED_ROUGE 9

// liste clés valides
String keyOk[]={"15 c4 2d 5","15 c4 2d 6"};


void setup() { 
  Serial.begin(57600);
  SPI.begin(); // Init SPI bus
  rfid.PCD_Init(); // Init MFRC522 

  pinMode(PIN_LED_VERTE,OUTPUT);
  pinMode(PIN_LED_ROUGE,OUTPUT);
  
  // led eteintes a l'init
  digitalWrite(PIN_LED_VERTE,LOW);
  digitalWrite(PIN_LED_ROUGE,LOW);
}
 
void loop() {

  // Si on ne detecte pas une carte on reboucle au debut
  if ( ! rfid.PICC_IsNewCardPresent())
    return;

  // as t'on lu la carte
  if ( ! rfid.PICC_ReadCardSerial())
    return;

// recuperation de l'UID et concaténation de sa valeur en hex dans un string
String myKey=String(rfid.uid.uidByte[0],HEX) + " " + String(rfid.uid.uidByte[1],HEX) + " " + String(rfid.uid.uidByte[2],HEX) + " " + String(rfid.uid.uidByte[3],HEX);

// j'affiche la valeur de la carte sur le serial
Serial.println(myKey);

bool accessOk = 0;
// je boucle sur toutes les valeurs des clés autorisés et si je la trouve accesOK => 1
for(int y = 0; y < (sizeof(keyOk)/sizeof(String)) ; y++){

  if(keyOk[y] == myKey){
    accessOk = 1;
  }
  
}

  // Halt PICC, fin de lecture de carte
  rfid.PICC_HaltA();

  // Stop encryption on PCD
  rfid.PCD_StopCrypto1();


// La carte as t'elle acces , si oui led verte , si non led rouge
  if(accessOk == 1){
    digitalWrite(PIN_LED_VERTE,HIGH);
  }
  else{
    digitalWrite(PIN_LED_ROUGE,HIGH);
  }

// on eteind les led apres un delais
delay(2000);
digitalWrite(PIN_LED_VERTE,LOW);
digitalWrite(PIN_LED_ROUGE,LOW);
  
}

voila le programme original qui fonctionne très bien.
mais tu as peut être raison il faudrait que je crée 2 String différent , un pour chaque lecteur.
voici un lien en vidéo qui inclut plusieurs lecteurs RFID un peu dans la même idée de ce que je veux faire:

"Escape Room Object Placement Puzzle using Arduino/RFID "

je vais essayer ta méthode en créant deux lecteurs aussi se sera plus simple qu 'avec des tableaux peut être.
mais comme je débute le "STRING" je ne maîtrise pas encore cette variable , je comprend pas tout, je suis donc dépendant des exemple que je trouve sur le net.
en tout cs merci des potentiel piste évoquées.

NB :l erreur du compilo vient effectivement de la ligne que tu mentionne.

bonjour,

après plusieurs test et en suivant les conseil de lesept, j'ai réussi à faire ce que je voulais.
voici le code:

/*
 

#include <SPI.h>
#include <MFRC522.h>

#define SS_PIN1 8
#define RST_PIN 9
#define SS_PIN2 10

String lecture ;
String lecture2 ;
MFRC522 rfid1(SS_PIN1, RST_PIN); // appel de la classe
MFRC522 rfid2(SS_PIN2, RST_PIN);

#define PIN_LED_VERTE 4
#define PIN_LED_ROUGE 3

// liste clés valides
String motdepass[]={"35 ee e2 bb","f1 1f 35 83"};

enum code{etape1,etape2,etape3};
int etatCode=etape1;

void setup() { 
  Serial.begin(57600);
  SPI.begin(); // Init SPI bus
 
    rfid1.PCD_Init(SS_PIN1, RST_PIN); 
    rfid2.PCD_Init(SS_PIN2, RST_PIN);

    
  pinMode(PIN_LED_VERTE,OUTPUT);
  pinMode(PIN_LED_ROUGE,OUTPUT);
  
  // led eteintes a l'init
  digitalWrite(PIN_LED_VERTE,LOW);
  digitalWrite(PIN_LED_ROUGE,LOW);

} 
void loop() {

switch (etatCode){

case etape1:  

  // Si on ne detecte pas une carte on reboucle au debut
  if ( ! rfid1.PICC_IsNewCardPresent())
    return;

  // as t'on lu la carte
  if ( ! rfid1.PICC_ReadCardSerial())
    return;

// recuperation de l'UID et concaténation de sa valeur en hex dans un string

lecture=String(rfid1.uid.uidByte[0],HEX) + " " + String(rfid1.uid.uidByte[1],HEX) + " " + String(rfid1.uid.uidByte[2],HEX) + " " + String(rfid1.uid.uidByte[3],HEX);

// j'affiche la valeur de la carte sur le serial
Serial.println(lecture);
 // Halt PICC, fin de lecture de carte
  rfid1.PICC_HaltA();
  // Stop encryption on PCD
  rfid1.PCD_StopCrypto1();
  if(motdepass[0] == lecture){
    Serial.println("passage etape2");
    etatCode=etape2;
  }
  else{etatCode=etape1;}
  delay(100);
  break;
case etape2:
 
  // Si on ne detecte pas une carte on reboucle au debut
  if ( ! rfid2.PICC_IsNewCardPresent())
    return;

  // as t'on lu la carte
  if ( ! rfid2.PICC_ReadCardSerial())
    return;

// recuperation de l'UID et concaténation de sa valeur en hex dans un string

 lecture2=String(rfid2.uid.uidByte[0],HEX) + " " + String(rfid2.uid.uidByte[1],HEX) + " " + String(rfid2.uid.uidByte[2],HEX) + " " + String(rfid2.uid.uidByte[3],HEX);

// j'affiche la valeur de la carte sur le serial
Serial.println(lecture2);
 // Halt PICC, fin de lecture de carte
  rfid2.PICC_HaltA();
  // Stop encryption on PCD
  rfid2.PCD_StopCrypto1();
  
  if(motdepass[1] == lecture2){
    Serial.println("passage etape3");
    etatCode=etape3;
  }
  else{etatCode=etape2;}
  delay(100);
  break;

 case etape3:

    digitalWrite(PIN_LED_VERTE,HIGH);
    Serial.println("accesok");
  
  delay(100);
  etatCode=etape1;
  break;
}
}

merci pour l'aide :smiley:
a bientôt

Bravo !