Partage
  • Partager sur Facebook
  • Partager sur Twitter

Pointeuse arduino avec carte RFID

    2 mai 2022 à 21:54:03

    Bonjour à tous,

    Mon but est de confectionner une pointeuse dans le but de connaitre l'heure d'arriver et la température des employer dans une société tout cela seras enregistrer sur une carte SD.

    Voici la liste des composant que j'utilise :

    -Une carte Arduino

    -Un lecteur RFID MFRC522

    -Un module de carte SD

    -Un module RTC SD 1307

    Pour le moment  j’arrive à lire mes badges et à la fois à affiché les IUD dans le serial , a allumer les LED si l'employer est  a l'heure ou non et aussi a prendre la température.

    Mon problème est que je n'arrive pas a pouvoir associer le Code RFID a un nom pour que lorsque l'utilisateur passe son badge que sa soit plutôt son nom qui s'affiche au lieu de l'IUD de sa carte

    Merci pour votre aide

    voici le code que j’utilise pour l’instant :

    #include <MFRC522.h> // Pour la carte RFID
    #include <SPI.h> // Pour la carte RFID et la carte SD
    #include <SD.h> // Pour la carte SD
    #include <RTClib.h> // Pour la carte RTC
    #include <Wire.h> // Pour les communication I2C
    
    // Adresse par défaut du capteur IR
    #define I2C_ADDR 0x5A
    
    // Définition des broches de la carte RFID
    #define CS_RFID 10
    #define RST_RFID 9
    
    // Définition des broches de la carte SD
    #define CS_SD 4
    
    // Creation du fichier d'enregistrement des données
    File myFile;
    
    // Instance de la classe pour la carte RFID
    MFRC522 rfid(CS_RFID, RST_RFID);
    
    // Variable to hold the tag's UID
    String uidString;
    
    // Instance de la classe pour la carte RTC
    RTC_DS1307 rtc;
    
    // Definition de l'heure normal d'arriver
    const int checkInHour = 9;
    const int checkInMinute = 5;
    
    //Variable to hold user check in
    int userCheckInHour;
    int userCheckInMinute;
    
    // Broches des LED et du Buzer
    const int redLED = 6;
    const int greenLED = 7;
    const int buzzer = 5;
    
    void setup() {
    
      // Inititialisation de la sortie des LED et du buzer
      pinMode(redLED, OUTPUT);
      pinMode(greenLED, OUTPUT);
      pinMode(buzzer, OUTPUT);
    
      // Initialisation du port série
      Serial.begin(9600);
      while (!Serial);
    
      // Initialisation du bus I2C
      Wire.begin();
    
      // Init SPI bus
      SPI.begin();
      // Init MFRC522
      rfid.PCD_Init();
    
      // Setup for the SD card
      Serial.print("Initializing SD card...");
      if (!SD.begin(CS_SD)) {
        Serial.println("initialization failed!");
        return;
      }
      Serial.println("initialization done.");
    
      // Setup for the RTC
      if (!rtc.begin()) {
        Serial.println("Couldn't find RTC");
        while (1);
      }
      else {
        // following line sets the RTC to the date & time this sketch was compiled
        rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
      }
      if (!rtc.isrunning()) {
        Serial.println("RTC is NOT running!");
      }
    }
    
    void loop() {
      //look for new cards
      if (rfid.PICC_IsNewCardPresent()) {
        readRFID();
        logCard();
        verifyCheckIn();
      }
      delay(10);
    }
    
    void readRFID() {
      rfid.PICC_ReadCardSerial();
      Serial.print("Tag UID: ");
      uidString = String(rfid.uid.uidByte[0]) + " " + String(rfid.uid.uidByte[1]) + " " +
                  String(rfid.uid.uidByte[2]) + " " + String(rfid.uid.uidByte[3]);
      Serial.println(uidString);
    
      // Sound the buzzer when a card is read
      tone(buzzer, 2000);
      delay(100);
      noTone(buzzer);
    
      delay(100);
    }
    
    void logCard() {
    
      /////////////////////////////////////////////////////////////////////
    
      /* Données brute de température */
      uint16_t data;
    
      /* Commande de lecture de la RAM à l'adresse 0x07 */
      Wire.beginTransmission(I2C_ADDR);
      Wire.write(0x07);
      Wire.endTransmission(false);
    
      /* Lecture des données : 1 mot sur 16 bits + octet de contrôle (PEC) */
      Wire.requestFrom(I2C_ADDR, 3, false);
      while (Wire.available() < 3);
      data = Wire.read();
      data |= (Wire.read() & 0x7F) << 8;  // Le MSB est ignoré (bit de contrôle d'erreur)
      Wire.read(); // PEC
      Wire.endTransmission();
    
      /* Calcul de la température */
      const float tempFactor = 0.02; // 0.02°C par LSB -> résolution du MLX90614
      float tempData = (tempFactor * data) - 0.01;
      float celsius = tempData - 273.15; // Conversion des degrés Kelvin en degrés Celsius
    
      /* Affichage de la température */
     // Serial.print("Celsius: ");
     // Serial.println(celsius);
    
      /* Temps d'attente */
     // delay(1000);
    
      ///////////////////////////////////////////////////////////////////////////////////////////////
    
     
      // Enables SD card chip select pin
      digitalWrite(CS_SD, LOW);
    
      if ((userCheckInHour < checkInHour) || ((userCheckInHour == checkInHour) && (userCheckInMinute <= checkInMinute)))
      {
        // Open file
        myFile = SD.open("bonne.txt", FILE_WRITE);
        // If the file opened ok, write to it
        if (myFile) {
          Serial.println("File opened ok");
          myFile.print(uidString);
          myFile.print(", ");
    
          myFile.print("est venu le  ");
    
          // Save time on SD card
          DateTime now = rtc.now();
          myFile.print(now.year(), DEC);
          myFile.print('/');
          myFile.print(now.month(), DEC);
          myFile.print('/');
          myFile.print(now.day(), DEC);
          myFile.print("a");
          myFile.print(now.hour(), DEC);
          myFile.print(':');
          myFile.println(now.minute(), DEC);
    
          myFile.print("avec une température de ");
    
          myFile.print(celsius);
    
          // Print time on Serial monitor
          Serial.print(now.year(), DEC);
          Serial.print('/');
          Serial.print(now.month(), DEC);
          Serial.print('/');
          Serial.print(now.day(), DEC);
          Serial.print(' ');
          Serial.print(now.hour(), DEC);
          Serial.print(':');
          Serial.println(now.minute(), DEC);
          Serial.println("sucessfully written on SD card");
          myFile.close();
    
          // Save check in time;
          userCheckInHour = now.hour();
          userCheckInMinute = now.minute();
        }
        else {
          Serial.println("error opening data.txt");
        }
      }
      else {
        // Open file
        myFile = SD.open("retard.txt", FILE_WRITE);
        // If the file opened ok, write to it
        if (myFile) {
          Serial.println("File opened ok");
          myFile.print(uidString);
          myFile.print(", ");
    
          myFile.print("est venu le  ");
    
          // Save time on SD card
          DateTime now = rtc.now();
          myFile.print(now.year(), DEC);
          myFile.print('/');
          myFile.print(now.month(), DEC);
          myFile.print('/');
          myFile.print(now.day(), DEC);
          myFile.print('a');
          myFile.print(now.hour(), DEC);
          myFile.print(':');
          myFile.println(now.minute(), DEC);
    
    
          myFile.print("avec une température de");
    
          myFile.print(celsius);
    
          // Print time on Serial monitor
          Serial.print(now.year(), DEC);
          Serial.print('/');
          Serial.print(now.month(), DEC);
          Serial.print('/');
          Serial.print(now.day(), DEC);
          Serial.print(' ');
          Serial.print(now.hour(), DEC);
          Serial.print(':');
          Serial.println(now.minute(), DEC);
          Serial.println("sucessfully written on SD card");
          myFile.close();
    
          // Save check in time;
          userCheckInHour = now.hour();
          userCheckInMinute = now.minute();
        }
        else {
          Serial.println("error opening data.txt");
        }
      }
      // Disables SD card chip select pin
      digitalWrite(CS_SD, HIGH);
    }
    
    void verifyCheckIn() {
      if ((userCheckInHour < checkInHour) || ((userCheckInHour == checkInHour) && (userCheckInMinute <= checkInMinute))) {
        digitalWrite(greenLED, HIGH);
        delay(2000);
        digitalWrite(greenLED, LOW);
        Serial.println("Bonne arriver!");
      }
      else {
        tone(buzzer, 2000);
        delay(100);
        noTone(buzzer);
        digitalWrite(redLED, HIGH);
        delay(2000);
        digitalWrite(redLED, LOW);
        Serial.println("Vous êtes en retard");
      }
    }



    -
    Edité par dibangoa 8 juillet 2022 à 20:19:33

    • Partager sur Facebook
    • Partager sur Twitter
      3 mai 2022 à 14:11:53

      Bonjour, Merci de retirer toutes les lettres en capitales de votre titre.

      Majuscules abusives

      L'écriture en majuscules est considérée comme une parole criée et diminue autant la lisibilité du texte que sa compréhension. Les majuscules abusives sont donc interdites aussi bien dans les titres que dans les messages.

      Liens conseillés

      • Partager sur Facebook
      • Partager sur Twitter
        3 mai 2022 à 14:26:46

        Pour afficher le nom plutôt que l'identifiant du badge, il faut savoir où se trouve la base de données (ou fichier) qui associe les 2, pas de miracle.
        • Partager sur Facebook
        • Partager sur Twitter
          5 juillet 2022 à 12:52:51

          oui effectivement j'ai penser a créer un tableau a double entrer dans lequel je vais enregistrer le nom des utilisateurs et en même temps leur associer un identifiant. je le fais et je reposte le code
          • Partager sur Facebook
          • Partager sur Twitter
            5 juillet 2022 à 14:00:13

            @dibangoa Bonjour, merci de modifier votre titre de sujet comme demandé.
            • Partager sur Facebook
            • Partager sur Twitter
              5 juillet 2022 à 16:55:47

              Avant de décider de mettre dans un tableau ou ailleurs, il faut regarder la taille prévisible des données. Combien d'employés ?

              Ensuite, pour des raisons de souplesse  - on ne va pas recompiler le code à chaque nouveau badge -  ça serait bien de prendre les données sur un ficher de la carte sd, pas dans le code.

              • Partager sur Facebook
              • Partager sur Twitter
                5 juillet 2022 à 21:28:49

                Les badges RFID ont aussi une mémoire, chaque badge RFID pourrait très bien contenir le nom et prénom de l'employé qu'ils représentent.

                Mais il te faudra faire un petit programme Arduino permettant d'écrire dans la mémoire de ces badge pour paramétrer le nom.

                Ou bien comme le propose Michelbillaud, enregistrer ces informations dans la carte SD.

                Soit au travers d'un fichier unique contenant tous les utilisateurs avec une séparation par caractères spéciaux et saut de ligne, du genre :

                78AB41HD,Noel,Jean
                8741CDA2,Pikabu,Christophe

                Donc ce cas de figure, il faudra que ton programme ouvre ce fichier et le lise ligne par ligne jusqu'à trouver la ligne de l'UID correspondante.

                Soit au travers d'un dossier contenant pleins de fichiers, chaque fichier ayant pour nom l'UID (du genre 78AB41HD.txt, 8741CDA2.txt, etc...) et pour contenu les informations de l'employé.

                Donc ce cas de figure, ton programme n'aura qu'à ouvrir le bon fichier et afficher son contenu.

                -
                Edité par lorrio 5 juillet 2022 à 21:29:55

                • Partager sur Facebook
                • Partager sur Twitter
                  6 juillet 2022 à 10:37:29

                  Tous les tags RFID ne sont pas programmables, et n'ont pas de mémoire; la plupart du temps dans le contrôle d'accès, il y a juste un identifiant lisible uniquement.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    6 juillet 2022 à 12:56:55

                    pendant qu'on y est, ça serait bien de revoir le découpage du programme pour mettre d'un côté les actions de bas niveau, et les autres.
                    void loop() 
                    {
                       if (card_is_present()) {
                           String uuid = get_uuid_from_reader();
                           String identifier = get_identifier_from_file();
                           if (identifier == "") {
                               display_unknown_user();
                           } else {
                               display_user_ok(identifier);
                               ...
                           }
                     
                    Ps il y a une erreur ligne 192. Et puis 241.

                    -
                    Edité par michelbillaud 11 juillet 2022 à 9:19:40

                    • Partager sur Facebook
                    • Partager sur Twitter
                      14 juillet 2022 à 18:27:32

                      Pendant qu'on y est, au lieu de remplir le fichier laborieusement à la petite cuiller par de trucs interminables comme

                            myFile.print(now.year(), DEC);
                            myFile.print('/');
                            myFile.print(now.month(), DEC);
                            myFile.print('/');
                            myFile.print(now.day(), DEC);
                            myFile.print("a");
                            myFile.print(now.hour(), DEC);
                            myFile.print(':');
                            myFile.println(now.minute(), DEC);
                            ...
                      

                      il est en général préférable de construire la ligne dans un tampon

                      char ligne[80];
                      sprintf(ligne, "%4d/%02d/%02d a %02d:%02d, temp %d C",
                                         now.year(), now.month(), now.day(),
                                         now.hour(), now.minute(),
                                         celsius);

                      et de la faire écrire ensuite dans le fichier

                      myFile.println(ligne);
                      

                      Raisons

                      • parce que c'est plus simple, et moins fatigant à écrire
                      • parce qu'on maitrise mieux la présentation du texte
                      • parce que le même tampon peut être envoyé sur le port série et sur le fichier.




                      • Partager sur Facebook
                      • Partager sur Twitter

                      Pointeuse arduino avec carte RFID

                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                      • Editeur
                      • Markdown