Сохранять UID разных RFID

Тема в разделе "Arduino & Shields", создана пользователем Mgal, 11 апр 2017.

  1. Mgal

    Mgal Нуб

    Добрый вечер. Пробую при поочередном поднесении разных меток к RFID сохранить их UID в разные переменные. Хотя бы при подносе 2 меток, но только так, чтобы переменные не привязывать к конкретным UID, т.к. хочется чтобы они автоматически сохранялись в переменные по очереди вне зависимости от их очередности. Может как то можно сохранять в массивы эти данные? Буду очень благодарен помощи. В общем мне нужно сохранить каждый UID номер, как вытащить этот UID код и преобразовать его в десятичный код есть:

    for (byte i = 0; i < mfrc522.uid.size; i++)
    {
    uidDec0Temp = mfrc522.uid.uidByte;
    uid0Dec = uid0Dec * 256 + uidDec0Temp;
    }
    а вот как сохранить каждый UID в отдельную переменную не знаю.
    вот пример кода, как можно его изменить?Просто я хочу эти UID потом передавать по I2C к другому Arduino и он сравнивал, были ли у него такие же метки.

    void loop()
    {
    for (int a=0; a<2;a++){

    // Look for new cards
    if ( ! mfrc522.PICC_IsNewCardPresent()) {
    return;
    }

    // Select one of the cards
    if ( ! mfrc522.PICC_ReadCardSerial()) {
    return;
    }

    uid0Dec = 0;
    uid1Dec = 0;
    // Выдача серийного номера метки.
    if (a==0)
    {

    for (byte i = 0; i < mfrc522.uid.size; i++)
    {
    uidDec0Temp = mfrc522.uid.uidByte;
    uid0Dec = uid0Dec * 256 + uidDec0Temp;
    }
    Serial.println("Card UID1: ");
    Serial.println(uid0Dec); // Выводим UID метки в консоль.
    return;
    }
    else

    {
    for (byte i = 0; i < mfrc522.uid.size; i++)
    {
    uidDec1Temp = mfrc522.uid.uidByte;
    uid1Dec = uid1Dec * 256 + uidDec1Temp;
    }
    Serial.println("Card UID2: ");
    Serial.println(uid1Dec); // Выводим UID метки в консоль
    }
    }

    Что в итоге получается [​IMG]
     
  2. Mgal

    Mgal Нуб

    Сохранять UID разных меток*
     
  3. Tomasina

    Tomasina Сушитель лампочек Модератор

    он уже выводится в десятичном виде.

    Оформляйте код правильно, в этой каше нет желания разбираться.
    Сколько всего должно быть таких переменных?
    Пример сохранения для 5 меток, с отбрасыванием повторных:
    Код (C++):
    #include <SPI.h>
    #include <MFRC522.h>

    /* Соединение контроллера и ридера,
        Uno/Mini         Mega              MFRC522
        -------------------------------------------------
        10               53                1 SDA         // уникальный для каждого ридера
        13               52                2 SCK         // общий для нескольких ридеров
        11               51                3 MOSI        // общий для нескольких ридеров
        12               50                4 MISO        // общий для нескольких ридеров
        GND              GND               6 GND
        9 (можно любой)  5 (можно любой)   7 RST         // общий для нескольких ридеров
        3V3              3V3               8 3V3
    */


    #define RFID_SDA            10         // пин от SS (он же SDA на плате ридера)
    #define RFID_SCK            52         // 13 для Uno
    #define RFID_MOSI           51         // 11 для Uno
    #define RFID_MISO           50         // 12 для Uno
    #define RFID_RST            8          // пин от RST (можно любой)

    const byte numIDs = 5;                // количество переменных для хранения ID
    unsigned long RFIDcards[numIDs];      // массив для хранения ID
    MFRC522 mfrc522(RFID_SDA, RFID_RST);

    // Объявляем прототипы функций, чтобы компилятор не ругался
    void printIDs(void);
    unsigned long readRFID(void);
    boolean verifyID(unsigned long currentID);


    void setup(void)
    {
      Serial.begin(9600);
      SPI.begin();
      mfrc522.PCD_Init();
      Serial.println(F("Ready. Waiting cards..."));
    }


    void loop(void)
    {
      unsigned long currentID;                             // временная переменная для хранения ID текущей карты
      static unsigned long lastID;
      static byte numSavedCards = 0;

      currentID = readRFID();                              // опрашиваем ридер
      if (currentID > 0)                                   // если карта прочитана
      {
        if (currentID != lastID)                           // если карта отличается от предыдущей
        {
          Serial.print(F("currentID = "));
          Serial.println(currentID);
          lastID = currentID;

          if (numSavedCards < numIDs)                     // если массив еще не заполнен
          {
            Serial.print(F("Check IDs "));
            if (verifyID(currentID) == false)             // если такого ID еще нет в массиве
            {
              Serial.print(F(" not found. "));
              RFIDcards[numSavedCards] = currentID;       // сохраняем ID в массив
              numSavedCards++;                            // увеличиваем счетчик
              Serial.println(F("Saved."));
            }
            else Serial.println(F(" this ID always saved."));
          }
          else
          {
            Serial.println(F("Array is full!"));
            printIDs();                                  // выводим все сохраненные ID
          }
        }
      }
    }


    unsigned long readRFID(void)
    { // Чтение RFID-меток. Возвращает ID метки (в виде хеша), либо код ошибки
      unsigned long uidDec;                   // десятичное представление ID текущей карты

      if (!mfrc522.PICC_IsNewCardPresent())   // метки нет
      {
        return 0;
      }
      else if (mfrc522.PICC_ReadCardSerial()) // метка есть и удалось прочитать
      {
        for (byte i = 0; i < mfrc522.uid.size; i++) uidDec = uidDec * 256 + mfrc522.uid.uidByte[i];
        mfrc522.PICC_ReadCardSerial();
        return uidDec;                        // возвращает ID метки
      }
      else                                    // метка есть, но прочитать не удалось
      {
        //Serial.println(F("Error reading ID."));
        return 0;
      }
    }


    boolean verifyID(unsigned long currentID)
    { // Проверка RFID-метки с известными ID.
      // Входной параметр - ID метки/
      // Возвращает true если такой ID уже есть в массиве RFIDcards
      for (byte n = 0; n < numIDs; n++)
      {
        Serial.print(F(".."));
        delay(100);
        if (RFIDcards[n] == currentID) return true;
      }
      return false; // если совпадений не найдено
    }


    void printIDs(void)
    { // выводит все сохраненные ID
      Serial.println(F("= = = = = = = = = = = = = = = = = = ="));
      for (byte n = 0; n < numIDs; n++)
      {
        Serial.print(n);
        Serial.print(F(" : "));
        Serial.println(RFIDcards[n]);
      }
      Serial.println(F("= = = = = = = = = = = = = = = = = = ="));
    }
     
    Последнее редактирование: 11 апр 2017