IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Arduino Discussion :

Projet RFID Compteur


Sujet :

Arduino

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Janvier 2023
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2023
    Messages : 10
    Par défaut Projet RFID Compteur
    Bonjour à tous !

    Aprés de nombreuses recherches je n'arrive pas à finalisé mon projet.

    Je vous explique :

    A l'aide du lecteur RFID : RFIO-RC522
    d'un Uno R3
    de carte et badges
    d'un écran LCD 2 lignes

    Je voudrais faire un "compte tours"

    Je ne sais pas si réellement ce que je demande sera possible..

    Il faudrait que sur l'écran LCD soit affiché A = xx B= XX C= XX et que les xx soit remplacés par le nombre de passage des badges devant le lecteur RFID.

    A ce stade j'arrive grace aux nombreux tutos sur le rfid à faire un contôle d'accés..
    Rien de plus !

    J'attend avec impatience vos retours.
    Dans l'attente je vous souhaite pleins de projets avec vos arduino !!

  2. #2
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 898
    Par défaut
    Commencez par faire un code qui affiche À B et C lorsque une valeur change

    Ensuite rajoutez du code qui écoute le RFID et compare la carte vue avec celles connues et augment de 1 à,b ou c lors de la détection. En pseudo code votre loop() ressemble à cela

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    si carte détectée 
      Alors 
        Si c’est carteA alors augmenter a
        Sinon Si c’est carteB alors augmenter b
        Sino Si c’est carteC alors augmenter c
     
    Si a ou b ou c a changé 
      alors mise à jour de l’afficheur

  3. #3
    Membre habitué
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Janvier 2023
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2023
    Messages : 10
    Par défaut
    Merci Jay M,

    Je vais voir si je peux exploiter ce que tu viens de me dire !
    N'étant pas un Expert ça va être un peu long !
    J'ai peur qu'avec un arduino Uno je sois limiter en terme de place pour brancher le LCD et le lecteur RFID...

  4. #4
    Membre habitué
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Janvier 2023
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2023
    Messages : 10
    Par défaut
    Je vous joint la partie du code qui fonctionne pour mon badge RFID, sauriez vous ce que je dois rajouter afin de faire fonctionné plusieurs badges différent ?
    Merci d'avance

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    #include <SPI.h>
    #include <MFRC522.h>
     
    #define SS_PIN 10
    #define RST_PIN 9
     
    #define AccesFlag_PIN 2
    #define Gate_PIN 3
    #define Max_Acces 3
     
    byte Count_acces=0; 
    byte CodeVerif=0; 
    byte Code_Acces[4]={0x32, 0xA7, 0x08, 0x2A};  
     
    MFRC522 rfid(SS_PIN, RST_PIN); // Instance of the class
     
    // Init array that will store new NUID 
    byte nuidPICC[4];
     
    void setup() 
    { 
      // Init RS232
      Serial.begin(9600);
     
      // Init SPI bus
      SPI.begin(); 
     
      // Init MFRC522 
      rfid.PCD_Init(); 
     
      // Init LEDs 
      pinMode(AccesFlag_PIN, OUTPUT);
      pinMode(Gate_PIN, OUTPUT);
     
      digitalWrite(AccesFlag_PIN, LOW);
      digitalWrite(Gate_PIN, LOW);
    }
     
    void loop() 
    {
      // Initialisé la boucle si aucun badge n'est présent 
      if ( !rfid.PICC_IsNewCardPresent())
        return;
     
      // Vérifier la présence d'un nouveau badge 
      if ( !rfid.PICC_ReadCardSerial())
        return;
     
      // Afffichage 
      Serial.println(F("Un badge est détecté"));
     
      // Enregistrer l’ID du badge (4 octets) 
      for (byte i = 0; i < 4; i++) {
        nuidPICC[i] = rfid.uid.uidByte[i];
      }
     
      // Vérification du code 
      CodeVerif= GetAccesState(Code_Acces,nuidPICC); 
      if (CodeVerif!=1)
      {
        Count_acces+=1;
        if(Count_acces==Max_Acces)
        {
         // Dépassement des tentatives (clignotement infinie) 
         while(1)
         {
          digitalWrite(AccesFlag_PIN, HIGH);
          delay(200); 
          digitalWrite(AccesFlag_PIN, LOW);
          delay(200); 
          // Affichage 
          Serial.println("Alarme!");
         }
        }
        else
        {
          // Affichage 
          Serial.println("Code érroné");
     
          // Un seul clignotement: Code erroné 
          digitalWrite(AccesFlag_PIN, HIGH);
          delay(1000); 
          digitalWrite(AccesFlag_PIN, LOW);
        }
      }
      else
      {
        // Affichage 
        Serial.println("Ouverture de la porte");
     
        // Ouverture de la porte & Initialisation 
        digitalWrite(Gate_PIN, HIGH);
        delay(3000); 
        digitalWrite(Gate_PIN, LOW);
        Count_acces=0; 
      }
     
      // Affichage de l'identifiant 
      Serial.println(" L'UID du tag est:");
      for (byte i = 0; i < 4; i++) 
      {
        Serial.print(nuidPICC[i], HEX);
        Serial.print(" ");
      }
      Serial.println();
     
      // Re-Init RFID
      rfid.PICC_HaltA(); // Halt PICC
      rfid.PCD_StopCrypto1(); // Stop encryption on PCD
    }
     
    byte GetAccesState(byte *CodeAcces,byte *NewCode) 
    {
      byte StateAcces=0; 
      if ((CodeAcces[0]==NewCode[0])&&(CodeAcces[1]==NewCode[1])&&
      (CodeAcces[2]==NewCode[2])&& (CodeAcces[3]==NewCode[3]))
        return StateAcces=1; 
      else
        return StateAcces=0; 
    }
    Nom : Sans titre.png
Affichages : 430
Taille : 11,4 Ko

  5. #5
    Membre habitué
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Janvier 2023
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2023
    Messages : 10
    Par défaut
    Re,

    J'évolue un peu de mon côté.

    Toujours en recherche de validation de plusieurs "badges", j'ai reussi cependant à faire fonctionné le lecteur et l'afficheur LCD.
    Voici mon code à l'heure actuelle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    #include <SPI.h>
    #include <MFRC522.h>
    #include "LiquidCrystal.h"
     
    #define SS_PIN 10
    #define RST_PIN 9
     
     
    byte Count_acces=0; 
    byte CodeVerif=0; 
    byte Code_Acces[4]={0x32, 0xA7, 0x08, 0x2A}; 
    LiquidCrystal lcd(8,7,5,4,3,2);
     
    MFRC522 rfid(SS_PIN, RST_PIN); // Instance of the class
     
    // Init array that will store new NUID 
    byte nuidPICC[4];
     
     
    void setup() 
    { 
     
      // Init RS232
      Serial.begin(9600);
     
      // Init SPI bus
      SPI.begin(); 
     
      // Init MFRC522 
      rfid.PCD_Init(); 
     
      lcd.print("A= ");
       lcd.print("B= ");
        lcd.print("C= ");
     
     
     
    }
     
    void loop() 
    {
      // Initialisé la boucle si aucun badge n'est présent 
      if ( !rfid.PICC_IsNewCardPresent())
        return;
     
      // Vérifier la présence d'un nouveau badge 
      if ( !rfid.PICC_ReadCardSerial())
        return;
     
      // Enregistrer l’ID du badge (4 octets) 
      for (byte i = 0; i < 4; i++) {
        nuidPICC[i] = rfid.uid.uidByte[i];
      }
     
      // Vérification du code 
      CodeVerif= GetAccesState(Code_Acces,nuidPICC); 
      if (CodeVerif!=1)
     
     
      {
    //A COMPLETER
        Count_acces=0; 
      }
     
      // Re-Init RFID
      rfid.PICC_HaltA(); // Halt PICC
      rfid.PCD_StopCrypto1(); // Stop encryption on PCD
    }
     
    byte GetAccesState(byte *CodeAcces,byte *NewCode) 
    {
      byte StateAcces=0; 
      if ((CodeAcces[0]==NewCode[0])&&(CodeAcces[1]==NewCode[1])&&
      (CodeAcces[2]==NewCode[2])&& (CodeAcces[3]==NewCode[3]))
        return StateAcces=1; 
      else
        return StateAcces=0; 
    }
    A ce stade, mon afficheur m'affiche A= B= C= .

    Mon but étant maintenant que mes 3 badges ont un impac direct sur A, B et C. A chaque passage je voudrais que ça rajoute +1 sur le badge correspondant.

    J'ai aussi fait un peu de nettoyage dans le code....

  6. #6
    Membre habitué
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Janvier 2023
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2023
    Messages : 10
    Par défaut
    Victoire !!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    #include <SPI.h>
    #include <MFRC522.h>
    #include "LiquidCrystal.h"
     
    #define SS_PIN 10
    #define RST_PIN 9
     
    byte rf;
    byte rf2;
    byte Count_acces=0; 
    byte CodeVerif=0;
    byte Code_Acces2[4]={0x72, 0xBF, 0x06, 0x2A};  
    byte Code_Acces[4]={0x32, 0xA7, 0x08, 0x2A}; 
    LiquidCrystal lcd(8,7,5,4,3,2);
     
    MFRC522 rfid(SS_PIN, RST_PIN); // Instance of the class
     
    // Init array that will store new NUID 
    byte nuidPICC[4];
     
     
    void setup() 
    { 
      rf=0;
      rf2=0;
    lcd.begin(16, 2);
      // Init RS232
      Serial.begin(9600);
     
      // Init SPI bus
      SPI.begin(); 
     
      // Init MFRC522 
      rfid.PCD_Init(); 
     
     lcd.print("A=");
    lcd.setCursor (0,1);
    lcd.print("B=");
     
     
     
    }
     
    void loop() 
    {
      // Initialisé la boucle si aucun badge n'est présent 
      if ( !rfid.PICC_IsNewCardPresent())
        return;
     
      // Vérifier la présence d'un nouveau badge 
      if ( !rfid.PICC_ReadCardSerial())
        return;
     
      // Enregistrer l’ID du badge (4 octets) 
      for (byte i = 0; i < 4; i++) {
        nuidPICC[i] = rfid.uid.uidByte[i];
      }
     
      // Vérification du code 
      CodeVerif= GetAccesState(Code_Acces,nuidPICC); 
      if (CodeVerif!=1)
     
     {
    rf=rf+1;
    lcd.setCursor (3,0);
      lcd.print(rf);
        Count_acces=0; 
      }
      //TEST
      CodeVerif= GetAccesState(Code_Acces2,nuidPICC); 
      if (CodeVerif!=1)
     
     {
    rf2=rf2+1;
    lcd.setCursor (3,1);
      lcd.print(rf2);
        Count_acces=0; 
      }
    //FIN DU TEST
     
     
      // Re-Init RFID
      rfid.PICC_HaltA(); // Halt PICC
      rfid.PCD_StopCrypto1(); // Stop encryption on PCD
    }
     
    byte GetAccesState(byte *CodeAcces,byte *NewCode) 
    {
      byte StateAcces=0; 
      if ((CodeAcces[0]==NewCode[0])&&(CodeAcces[1]==NewCode[1])&&
      (CodeAcces[2]==NewCode[2])&& (CodeAcces[3]==NewCode[3]))
        return StateAcces=1; 
      else
        return StateAcces=0; 
    }
    Si jamais une personne souhaite mettre du clair dans ce code je suis preneur !!!

  7. #7
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 898
    Par défaut
    ah vous avez un écran de deux lignes seulement, donc l'affichage n'est pas fait pour ça (j'avais pas regardé mais je pensais que vous aviez 4 lignes)

    en réfléchissant à un usage des 16 colonnes / 2 lignes comme cela

    Nom : lcd.jpg
Affichages : 397
Taille : 29,7 Ko

    vous pouvez calculer la position où il faut écrire (ligne colonne) avec des formules simples utilisant la division entière et le modulo

    essayez cela

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    #include <SPI.h>
    #include <MFRC522.h>
    #include <LiquidCrystal.h>
     
    #define SS_PIN 10
    #define RST_PIN 9
     
    const byte codeVoitures[][4] = {
      {0x32, 0xA7, 0x08, 0x2A}, //VOITURE 1
      {0x72, 0xBF, 0x06, 0x2A}, //VOITURE 2
      {0xAB, 0x3E, 0x49, 0x23}, //VOITURE 3
      {0x49, 0xD6, 0xA2, 0x59}, //VOITURE 4
    };
    const byte nombreDeVoitures = sizeof codeVoitures / sizeof * codeVoitures;
    byte nombreDeDetections[nombreDeVoitures];
     
    LiquidCrystal lcd(8, 7, 5, 4, 3, 2);
    MFRC522 rfid(SS_PIN, RST_PIN); // Instance of the class
     
    void raz() {
      lcd.clear();
     
      // écran d'accueil
      lcd.setCursor (0, 0);
      lcd.print("COURSE DE");
      lcd.setCursor (8, 1);
      lcd.print("VOITURES");
      delay(1000);
     
      lcd.clear();
      for (byte i = 0; i < nombreDeVoitures; i++) {
        byte col = (i % 2 == 0) ? 0 : 8; // si i est pair on se met en colonne = 0 sinon en colonne = 8
        byte ligne = i / 2 ; // division entière donc en ligne 0 pour i = 0 ou 1, puis en ligne 1 pour i = 2 et 3
     
        nombreDeDetections[i] = 0;
        lcd.setCursor (col, ligne);
        lcd.write('P'); lcd.print(i + 1); lcd.print("=0"); // on écrit "P1=0", "P2=0", ... le compte commence 3 colones après l'étiquette
      }
    }
     
    void setup() {
      lcd.begin(16, 2);
      SPI.begin();
      rfid.PCD_Init();
      raz();
    }
     
    void loop() {
      if ( ! rfid.PICC_IsNewCardPresent()) return;
      if ( ! rfid.PICC_ReadCardSerial())   return;
     
      // l’ID du badge (4 octets) est dans le tableau rfid.uid.uidByte, on le duplique pour libérérer le lecteur RFID au plus vite
      byte badgeDetecte[4];
      memcpy(badgeDetecte, rfid.uid.uidByte, 4);
     
      // Re-Init RFID
      rfid.PICC_HaltA(); // Halt PICC
      rfid.PCD_StopCrypto1(); // Stop encryption on PCD
     
      // on cherche si on a trouvé une voiture connue
      for (byte i = 0; i < nombreDeVoitures; i++) {
        if (memcmp(codeVoitures[i], badgeDetecte, 4) == 0) { // on compare les 4 octets pour voir s'il y a une correspondance
          byte col = (i % 2 == 0) ? 0 : 8; // si i est pair on se met en colonne = 0 sinon en colonne = 8
          byte ligne = i / 2 ; // division entière donc en ligne 0 pour i = 0 ou 1, puis en ligne 1 pour i = 2 et 3
          nombreDeDetections[i]++;            // on augmente le nombre de détection de cette voiture
          lcd.setCursor (col + 3, ligne);     // on se positionne sur la bonne ligne au bon endroit
          lcd.print(nombreDeDetections[i]);   // on affiche le nouveau compte. Comme il ne fait qu'augmenter on ne se soucie pas d'effacer avant
     
          // on regarde si ce joueur a gagné (le curseur sur le LCD est juste après le nombre qu'on vient de mettre à jour)
          if (nombreDeDetections[i] > 9) {
            lcd.print("WIN");
            for (byte j = 0; j < 16; j++) {
              digitalWrite(A0, HIGH);
              delay(200);
              digitalWrite(A0, LOW);
              delay(200);
            }
            raz(); // on remet ensuite à zéro
          }
        }
        break;
      }
    }
    ensuite pour la compréhension du code, c'est proche de ce que vous aviez sauf que je fais une boucle for avec i qui représente l'indice de la carte à tester dans le tableau des cartes connues. Donc au lieu de faire 4 fois la même chose, je ne le fais qu'une fois. idem pour le clignotement sur A0 je fais une boucle qui fait 16 fois allumer/eteindre au lieu d'écrire 16 fois la même chose...

  8. #8
    Membre habitué
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Janvier 2023
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2023
    Messages : 10
    Par défaut
    Merci,

    Les infos sont affichées correctement.


    Est-ce que le fait que seulement le badge "P1=" fonctionne vient obligatoirement de mon badge ?
    Lorsque j'utilise la bibliotheque en example "ReadNUID" j'ai bien les UID des 4 badges.

    Nom : Sans titre.png
Affichages : 391
Taille : 20,9 Ko

    Est-ce que ça supporte aussi bien la valeur en Hexa et en déci ? Je viens de m'aperçevoir que j'avais les 2...

  9. #9
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 898
    Par défaut
    Citation Envoyé par Teki82 Voir le message
    Est-ce que ça supporte aussi bien la valeur en Hexa et en déci ? Je viens de m'aperçevoir que j'avais les 2..
    décimal ou hexadécimal, ce n'est qu'une représentation pour des humains. si vous écrivez
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    const byte codeVoitures[][4] = {
      {0x32, 0xA7, 0x08, 0x2A}, //VOITURE 1 ==> EN HEXADECIMAL
    ...
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    const byte codeVoitures[][4] = {
      {50, 167, 8, 42}, //VOITURE 1 ==> EN DECIMAL
    ...
    pour le compilateur et l'Arduino, c'est exactement la même chose qui est mise en mémoire (en binaire car il ne connait que les 1 et 0 pour les bits)


    Citation Envoyé par Teki82 Voir le message
    Est-ce que le fait que seulement le badge "P1=" fonctionne vient obligatoirement de mon badge ?
    Non c'est mon code qui est faux... l'inconvénient de taper cela ici.

    dans la boucle for qui compare la carte lue à celles connues, je mets un "break" pour sortir de la boucle for si j'ai trouvé une carte (puisque ce n'est plus la peine de continuer à chercher) mais je l'ai mis un cran trop loin dans les accolades, ce qui fait que la boucle sortait après avoir testé la première carte... donc normal que seulement la première soit fonctionnelle

    code corrigé cf la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
          break; // <=== METTRE LE BREAK AU BON NIVEAU, DANS LA BOULCE FOR SI ON A TROUVE SEULEMENT
    que j'ai remontée d'un cran


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    #include <SPI.h>
    #include <MFRC522.h>
    #include <LiquidCrystal.h>
     
    #define SS_PIN 10
    #define RST_PIN 9
     
    const byte codeVoitures[][4] = {
      {0x32, 0xA7, 0x08, 0x2A}, //VOITURE 1
      {0x72, 0xBF, 0x06, 0x2A}, //VOITURE 2
      {0xAB, 0x3E, 0x49, 0x23}, //VOITURE 3
      {0x49, 0xD6, 0xA2, 0x59}, //VOITURE 4
    };
    const byte nombreDeVoitures = sizeof codeVoitures / sizeof * codeVoitures;
    byte nombreDeDetections[nombreDeVoitures];
     
    LiquidCrystal lcd(8, 7, 5, 4, 3, 2);
    MFRC522 rfid(SS_PIN, RST_PIN); // Instance of the class
     
    void raz() {
      lcd.clear();
     
      // écran d'accueil
      lcd.setCursor (0, 0);
      lcd.print("COURSE DE");
      lcd.setCursor (8, 1);
      lcd.print("VOITURES");
      delay(1000);
     
      lcd.clear();
      for (byte i = 0; i < nombreDeVoitures; i++) {
        byte col = (i % 2 == 0) ? 0 : 8; // si i est pair on se met en colonne = 0 sinon en colonne = 8
        byte ligne = i / 2 ; // division entière donc en ligne 0 pour i = 0 ou 1, puis en ligne 1 pour i = 2 et 3
     
        nombreDeDetections[i] = 0;
        lcd.setCursor (col, ligne);
        lcd.write('P'); lcd.print(i + 1); lcd.print("=0"); // on écrit "P1=0", "P2=0", ... le compte commence 3 colones après l'étiquette
      }
    }
     
    void setup() {
      lcd.begin(16, 2);
      SPI.begin();
      rfid.PCD_Init();
      raz();
    }
     
    void loop() {
      if ( ! rfid.PICC_IsNewCardPresent()) return;
      if ( ! rfid.PICC_ReadCardSerial())   return;
     
      // l’ID du badge (4 octets) est dans le tableau rfid.uid.uidByte, on le duplique pour libérérer le lecteur RFID au plus vite
      byte badgeDetecte[4];
      memcpy(badgeDetecte, rfid.uid.uidByte, 4);
     
      // Re-Init RFID
      rfid.PICC_HaltA(); // Halt PICC
      rfid.PCD_StopCrypto1(); // Stop encryption on PCD
     
      // on cherche si on a trouvé une voiture connue
      for (byte i = 0; i < nombreDeVoitures; i++) {
        if (memcmp(codeVoitures[i], badgeDetecte, 4) == 0) { // on compare les 4 octets pour voir s'il y a une correspondance
          byte col = (i % 2 == 0) ? 0 : 8; // si i est pair on se met en colonne = 0 sinon en colonne = 8
          byte ligne = i / 2 ; // division entière donc en ligne 0 pour i = 0 ou 1, puis en ligne 1 pour i = 2 et 3
          nombreDeDetections[i]++;            // on augmente le nombre de détection de cette voiture
          lcd.setCursor (col + 3, ligne);     // on se positionne sur la bonne ligne au bon endroit
          lcd.print(nombreDeDetections[i]);   // on affiche le nouveau compte. Comme il ne fait qu'augmenter on ne se soucie pas d'effacer avant
     
          // on regarde si ce joueur a gagné (le curseur sur le LCD est juste après le nombre qu'on vient de mettre à jour)
          if (nombreDeDetections[i] > 9) {
            lcd.print("WIN");
            for (byte j = 0; j < 16; j++) {
              digitalWrite(A0, HIGH);
              delay(200);
              digitalWrite(A0, LOW);
              delay(200);
            }
            raz(); // on remet ensuite à zéro
          }
          break; // <=== METTRE LE BREAK AU BON NIVEAU, DANS LA BOULCE FOR SI ON A TROUVE SEULEMENT
        }
      }
    }


    PS: évitez de poster des images quand vous pouvez juste poster le texte, c'est plus facile à lire sur petit écran (je lis sur mon téléphone)

  10. #10
    Membre habitué
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Janvier 2023
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2023
    Messages : 10
    Par défaut
    Impeccable !

    Merci beaucoup pour cette création.
    ça fonctionne à merveille !

    Pour ceux que ça interesse, on trouve des mini étiquette Rfid sur le net qui font la taille du bas de caisse de la voiture en modéle réduit 1/76.
    Reste plus qu'à acheté du bois et beaucoup de mousse expensive pour les décors !

  11. #11
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 898
    Par défaut
    super

    on attend des photos de la réalisation finale

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Présentation de projet: compteur de points pétanque
    Par DebProg40 dans le forum Arduino
    Réponses: 19
    Dernier message: 11/04/2021, 15h10
  2. Projet lecteur NFC\RFID sur Beagle
    Par kira249 dans le forum Débuter
    Réponses: 14
    Dernier message: 27/03/2018, 15h53
  3. Projet de compteur physique
    Par SuperTechFR dans le forum Arduino
    Réponses: 6
    Dernier message: 28/03/2017, 18h58
  4. Projet BTS Lecteur RFID programme C++
    Par jeje2211 dans le forum C++
    Réponses: 8
    Dernier message: 30/03/2016, 17h14
  5. projet supervision des compteurs énergie avec LABVIEW
    Par xmenoo7 dans le forum LabVIEW
    Réponses: 2
    Dernier message: 22/02/2010, 11h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo