10 Cartes, 10 RFID, Array.... help?

Bonjour

Je suis en train de créer un petit programme avec 10 cartes RFID et 10 reader, car j’aimerais les mettre tout au long d’un parcours et les faire valider un par un.
Pour faire ceci, je me suis dit qu’un joli array de cartes mélanger aux RFID serait une bonne idée.
Or j’ai un petit soucis:

Pour essayer, j’ai déjà deux RFID et une carte. Je lance mon programme réaliser à partir de l’exemple de la librairy MFRC522, et j’ai transposé ceci en fonction pour que ce soit plus pratique. Le premier RFID fonctionne, mais pas le second… Problème 1.
Problème 2, je n’arrive pas à faire valider celle-ci, qui est pourtant dans la boucle.

Vous pourriez éclairer ma lanterne, je galère pas mal là :(?

Je vous joint le code principal et la fonction RFID (j’en ai mis d’autres, que j’activerais ensuite):

Code principal :

#include <LiquidCrystal.h>
#include <MFRC522.h>
#include <Wire.h>
#include <SPI.h>
#include <LiquidCrystal.h>
#include <SD.h> // Inclure la librairie SD
#define SDPIN 10 // Chip Select du lecteur SD
#include <TMRpcm.h> 

File myFile;
TMRpcm tmrpcm;
LiquidCrystal lcd(39, 40, 41, 42, 43, 44);

int Valid1, Valid2, Valid3, Valid4, Valid5,
    Valid6, Valid7, Valid8, Valid9, Valid10;

int cardValid1[11], cardValid2[11], cardValid3[11], cardValid4[11], cardValid5[11],
    cardValid6[11], cardValid7[11], cardValid8[11], cardValid9[11], cardValid10[11];

String card1 = "F6 39 4E 39";
String card2 = " ";
String card3 = " ";
String card4 = " ";
String card5 = " ";

String card6 = " ";
String card7 = " ";
String card8 = " ";
String card9 = " ";
String card10 = " ";

#define RST_PIN         5        // Configurable, see typical pin layout above
#define SS_1_PIN        30       // Configurable, take a unused pin, only HIGH/LOW required, must be diffrent to SS 2
#define SS_2_PIN        31       // Configurable, take a unused pin, only HIGH/LOW required, must be diffrent to SS 1

#define NR_OF_READERS   2

byte ssPins[] = {SS_1_PIN, SS_2_PIN};

MFRC522 mfrc522[NR_OF_READERS];   // Create MFRC522 instance.

#define ALL 1
#define LOOP 5
//#define RFID 6

#define DEBUG RFID


void setup() {
  Serial.begin(9600);        // Initialize serial communications with the PC
  while (!Serial);    // Do nothing if no serial port is opened (added for Arduinos based on ATMEGA32U4)

  SPI.begin();        // Init SPI bus

  for (uint8_t reader = 0; reader < NR_OF_READERS; reader++) {
    mfrc522[reader].PCD_Init(ssPins[reader], RST_PIN); // Init each MFRC522 card
    Serial.print(F("Reader "));
    Serial.print(reader);
    Serial.print(F(": "));
    mfrc522[reader].PCD_DumpVersionToSerial();
  }
  speakerSetup();
  // set up the LCD's number of columns and rows:
  lcd.begin(16, 2);
  lcd.print("System online");
}
void loop() {
  //RFID(String card, int ack[],int valid);
  //validation( int ack[], int valid)

  for (int i = 0; i < 11; i++) {
    RFID(card1, cardValid1[i], Valid1);
    validation( cardValid1[i], Valid1);

    RFID(card2, cardValid2[i], Valid2);
    validation( cardValid2[i], Valid2);

    RFID(card3, cardValid3[i], Valid3);
    validation( cardValid3[i], Valid3);

    RFID(card4, cardValid4[i], Valid4);
    validation( cardValid4[i], Valid4);

    RFID(card5, cardValid5[i], Valid5);
    validation( cardValid5[i], Valid5);

    RFID(card6, cardValid6[i], Valid6);
    validation( cardValid6[i], Valid6);

    RFID(card7, cardValid7[i], Valid7);
    validation( cardValid7[i], Valid7);

    RFID(card8, cardValid8[i], Valid8);
    validation( cardValid8[i], Valid8);

    RFID(card9, cardValid9[i], Valid9);
    validation( cardValid9[i], Valid9);

    RFID(card10, cardValid10[i], Valid10);
    validation( cardValid10[i], Valid10);
  }
}

Code RFID:

void RFID(String card, int ack[], int valid) {
  for (uint8_t reader = 0; reader < NR_OF_READERS; reader++) {
    // Look for new cards
    if ( ! mfrc522[reader].PICC_IsNewCardPresent())
    {
      if (ALL == DEBUG || RFID == DEBUG) {
        //Serial.println("No card presented");
      }
      return;
    }
    // Select one of the cards
    if ( ! mfrc522[reader].PICC_ReadCardSerial())
    {
      if (ALL == DEBUG || RFID == DEBUG) {
        Serial.println("Card presented but unreadable");
      }
      return;
    }
    //Show UID on serial monitor
    if (ALL == DEBUG || RFID == DEBUG) {
      Serial.println("UID tag :");
    }
    String content = "";
    byte letter;
    for (byte i = 0; i < mfrc522[reader].uid.size; i++)
    {
      if (ALL == DEBUG || RFID == DEBUG) {
        Serial.print(mfrc522[reader].uid.uidByte[i] < 0x10 ? " 0" : " ");
        Serial.print(mfrc522[reader].uid.uidByte[i], HEX);
      }
      content.concat(String(mfrc522[reader].uid.uidByte[i] < 0x10 ? " 0" : " "));
      content.concat(String(mfrc522[reader].uid.uidByte[i], HEX));
    }
    if (ALL == DEBUG || RFID == DEBUG) {
      Serial.println();
      Serial.print("Message : ");
    }
    content.toUpperCase();
    // 8B 0A DB F5
    // 6B 84 E8 F5
    // 1E 69 71 66
    // EB 5C D9 F5
    //////////////////////////////////////////////////////////////////////////////RFID1
    if (content.substring(1) == card && reader == 1) {
      ack[1] = 1;
      valid = 0;
      Serial.println("GOOD");
    }
    //////////////////////////////////////////////////////////////////////////////RFID2
    if (content.substring(1) == card && reader == 2) {
      ack[2] = 1;
      Serial.println("GOOD");

    }
    //////////////////////////////////////////////////////////////////////////////RFID3
    if (content.substring(1) == card && reader == 3) {
      ack[3] = 1;
      Serial.println("GOOD");

    }
    //////////////////////////////////////////////////////////////////////////////RFID4
    if (content.substring(1) == card && reader == 4) {
      ack[4] = 1;
      Serial.println("GOOD");

    }
    //////////////////////////////////////////////////////////////////////////////RFID5
    if (content.substring(1) == card && reader == 5) {
      ack[5] = 1;
      Serial.println("GOOD");

    }
    //////////////////////////////////////////////////////////////////////////////RFID6
    if (content.substring(1) == card && reader == 6) {
      ack[6] = 1;
      Serial.println("GOOD");

    }
    //////////////////////////////////////////////////////////////////////////////RFID7
    if (content.substring(1) == card && reader == 7) {
      ack[7] = 1;
      Serial.println("GOOD");

    }
    //////////////////////////////////////////////////////////////////////////////RFID8
    if (content.substring(1) == card && reader == 8) {
      ack[8] = 1;
      Serial.println("GOOD");

    }
    //////////////////////////////////////////////////////////////////////////////RFID9
    if (content.substring(1) == card && reader == 9) {
      ack[9] = 1;
      Serial.println("GOOD");

    }
    //////////////////////////////////////////////////////////////////////////////RFID10
    if (content.substring(1) == card && reader == 10) {
      ack[10] = 1;
      valid = 1;
      Serial.println("DONE");

    }
    /////////////////////////////////////////////////////////////
    else {
      if (ALL == DEBUG || RFID == DEBUG) {
        Serial.println(" Access denied");

      }
    }
  }
}
void dump_byte_array(byte *buffer, byte bufferSize) {
  for (byte i = 0; i < bufferSize; i++) {
    Serial.print(buffer[i] < 0x10 ? " 0" : " ");
    Serial.print(buffer[i], HEX);
  }
}

?

Je n’ai jamais essayé de connecter 2 lecteurs au même arduino; vous avez vérifié que la librairie supporte bien plusieurs instances ? peut-être devez vous avoir aussi des pins séparées pour les reset?

(À titre de curiosité votre parcours est il si petit qu’il permet d’avoir tous les lecteurs reliés au même arduino?)

Bien sûr. Et c'est même dans la librairie (exemple multiuidreaders, quelque chose comme cela). Et ça fonctionne. Je pense juste que mon array à quelque chose qui cloche...

Dans votre fonction RFID si le premier lecteur ne voit pas de carte il fait return et rien d’autre n’est testé

Nickel, c'est parfait :slight_smile:

Bon maintenant, faudrait que les cartes soient lues et qu'il se passe ce qui est prévus mais ça fonctionne pas jusque là, je vais devoir chercher encore :slight_smile:

si vous avez des suggestions pendant que je cherche de mon coté, je suis preneur.

À mon avis vous vous compliquez la vie

La boucle devrait tester chaque lecteur à tour de rôle et si une carte est détectée alors faire ce qu'il faut pour cette carte sur ce lecteur et tout devrait être dans des tableaux pour ne pas avoir à répéter de code et juste faire de boucles

J-M-L:
À mon avis vous vous compliquez la vie

La boucle devrait tester chaque lecteur à tour de rôle et si une carte est détectée alors faire ce qu'il faut pour cette carte sur ce lecteur et tout devrait être dans des tableaux pour ne pas avoir à répéter de code et juste faire de boucles

bonjour
+1
Faire du polling de lecteur et action immédiate si événement est la moins mauvaise solution , sous reserves que les actions ne soit pas excessivement grosses consommatrices temporelle .