RFID и мастеркарта

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

  1. one_player

    one_player Нерд

    Добрый день.
    Прошу помочь/объяснить в моей проблеме.
    Есть RC522 и UNO. Хотел бы считывать карты и выводить их к примеру в сериал. Но после считывания мастеркарты при поднесении следующей карты включать светодиод.

    Код (C++):
    #include <SPI.h>
    #include <MFRC522.h>
    // Ридер SCK 13, MOSI 11, MISO 12
    #define SS_PIN 10 //SDA RFID
    #define RST_PIN 9 //RST RFID
    MFRC522 mfrc522(SS_PIN, RST_PIN);
    unsigned long uidDec, uidDecTemp;

    void setup()
    {
      Serial.begin(9600);
      SPI.begin();          
      mfrc522.PCD_Init();
      pinMode(4, OUTPUT);
    }

    void loop()
    {
      if ( ! mfrc522.PICC_IsNewCardPresent()) {
        return;
      }
      if ( ! mfrc522.PICC_ReadCardSerial()) {
        return;
      }
      uidDec = 0;
      for (byte i = 0; i < mfrc522.uid.size; i++)
      {
        uidDecTemp = mfrc522.uid.uidByte[i];
        uidDec = uidDec * 256 + uidDecTemp;
      }
      if (uidDec!=504630971)
      {
        Serial.println(uidDec); // Просто выводим UID метки в консоль.
        }else
        {
            if ( ! mfrc522.PICC_IsNewCardPresent()) {
                return;
              }
              if ( ! mfrc522.PICC_ReadCardSerial()) {
                return;
              }
              uidDec = 0;
              for (byte i = 0; i < mfrc522.uid.size; i++)
              {
                uidDecTemp = mfrc522.uid.uidByte[i];
                uidDec = uidDec * 256 + uidDecTemp;
              }
              Serial.println(uidDec); // Выводим UID метки в консоль.
              digitalWrite(4, HIGH); //Зажигаем
              delay(2000);
              digitalWrite(4, LOW); //Тушим
          }
    }

    И вот все хорошо только после прочтения мастеркарты я возвращаюсь в начало loop. Т.е. все что после
    Serial.println(uidDec); // Просто выводим UID метки в консоль.
    }else
    {
    Не выполняется. Как заставить повторно считать карту после поднесения мастеркарты?
     
  2. Tomasina

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

    чуть переработать архитектуру скетча. После опознания мастер-метки запоминаем этот факт и при повторном чтении карты вспоминаем что перед этим была мастер-метка.
    Код (C++):
    #include <SPI.h>
    #include <MFRC522.h>
    // Ридер SCK 13, MOSI 11, MISO 12
    #define SS_PIN    10 //SDA RFID
    #define RST_PIN   9 //RST RFID
    #define ID_MASTER 504630971 // номер мастер-метки
    #define TIMEOUT   10000     // интервал перед сбросом флага мастер-метки
    MFRC522 mfrc522(SS_PIN, RST_PIN);
    unsigned long uidDec;
    boolean isMasterID = false; // флаг того, что была поднесена мастер-метка

    void setup()
    {
      Serial.begin(9600);
      SPI.begin();
      mfrc522.PCD_Init();
      pinMode(4, OUTPUT);
    }

    unsigned long readRFID() // функция чтения RFID
    {
      unsigned long id, uidDecTemp;

      if ( ! mfrc522.PICC_IsNewCardPresent()) // нет карты
      {
        return 0;
      }

      if ( ! mfrc522.PICC_ReadCardSerial()) // карта не читается
      {
        return 0;
      }

      for (byte i = 0; i < mfrc522.uid.size; i++) // карта читается, возвращаем ее ID
      {
        uidDecTemp = mfrc522.uid.uidByte[i];
        id = id * 256 + uidDecTemp;
      }
      return id;
    }

    void loop()
    {
      static unsigned long timestamp;
      uidDec = readRFID(); // запрашиваем ридер
      Serial.println(uidDec); // выводим UID метки в консоль.

      if (uidDec == ID_MASTER) // поднесли мастер-метку
      {
        isMasterID = true;
        timestamp = millis(); // запомнили текущее время
      }
      else
      {
        isMasterID = false;
      }

      if (uidDec > 0) // поднесли любую карту
      {
        if (isMasterID = true && uidDec =! ID_MASTER) // если до этого была мастер-карта, то включаем LED
        {
          digitalWrite(4, HIGH); //Зажигаем
          isMasterID = false;   // сбрасываем флаг
          delay(2000);
          digitalWrite(4, LOW); //Тушим
        }
      }

      if (millis() - timestamp > TIMEOUT) // если за 10 сек не поднесли другую метку, флаг мастер-метки аннулируется
      {
        isMasterID = false;
      }
    }

     
     
    Последнее редактирование: 15 фев 2017
  3. one_player

    one_player Нерд

    Интересно. Спасибо.
     
  4. one_player

    one_player Нерд

    Странно но не работает и ваш пример.
    На любую карту он зажигает диод.
    Почему нельзя считать повторно карту так как в моем коде написано что мешает?
     
  5. mcureenab

    mcureenab Гуру

    Это 99.99% будет та же самая карта. Никто не успеет её заменить.
    return; из функции loop() тут же запускает её снова.