Чтение NFC-карты (PN532) с помощью Arduino Uno

Я пытаюсь обнаружить RFID-карту с помощью модуля NFC-PN532 и библиотеки Adafruit_PN532.

Код инициализации:-

#include <Adafruit_PN532.h>
#include <Wire.h> 

#define SCK  (13)
#define MISO (12)
#define MOSI (11)
#define SS   (10)
Adafruit_PN532 nfc(SCK, MISO, MOSI, SS);

void setup()
{  
  Serial.begin(9600);
  Serial.println("Initializing please wait.......");
  delay(3000);
  nfc.begin();

  uint32_t versiondata = nfc.getFirmwareVersion();
  if (! versiondata) 
  {
    Serial.print("Didn't find PN53x board");
    while (1); // остановка
  }

  Serial.print("Device Found PN5 Chip"); 
  Serial.println((versiondata>>24) & 0xFF, HEX); 
  Serial.print("Firmware version > "); 
  Serial.print((versiondata>>16) & 0xFF, DEC); 
  Serial.println((versiondata>>8) & 0xFF, DEC);
  nfc.SAMConfig(); //Устанавливаем чтение RFID-тегов
  Serial.println("Waiting for RFID Card ...");
}

Основной цикл:-

void loop() 
{
  uint8_t success = 0;
  uint8_t uid[] = { 0, 0, 0, 0, 0, 0, 0 };
  uint8_t uidLength;
  success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, &uidLength);
  if (success) 
  {
      Serial.println("Card Detected!");
  }
  else
  {
      Serial.println("Card Not Detected or Removed!");
  }
}

Каждый раз, когда я помещаю действительную карту в PN532, на последовательном мониторе печатается сообщение Карта обнаружена!.

Однако, когда я вынимаю карту, надпись Карта не обнаружена или удалена! не печатается.

Как я могу заставить программу зацикливаться таким образом, чтобы она могла определять, когда карта присутствует/удалена?

, 👍0

Обсуждение

как только вы это исправите (не знаю, почему оно так себя ведет), вы не сможете обнаружить, когда карта удалена... вы обнаружите, когда карта отсутствует... есть разница :p, @Jaromanda X

@JaromandaX да, ты прав. Но как тогда мне изменить код, чтобы обнаружить «карта вставлена» и «карта удалена»?, @Sandrocottus

вы бы достигли этого с помощью кода, который печатает удаленную карту только в том случае, если это первый цикл после присутствия карты... попробуйте добавить nfc.setPassiveActivationRetries(0x10); в вашу настройку непосредственно перед nfc.SAMConfig() ; - это должно остановить ожидание карты кодом :p, @Jaromanda X


1 ответ


Лучший ответ:

3

По умолчанию readPassiveTargetID ожидает карты «вечно», поэтому ваш код видит только тогда, когда присутствует карта

Итак, в setup() добавьте nfc.setPassiveActivationRetries(0x10); следующим образом - комментарии взяты из моего собственного кода, но я уверен, что они изначально были в каком-то примере :p< /п>

// Устанавливаем максимальное количество повторных попыток чтения с карты
// Это не позволяет нам вечно ждать карты, которая
// поведение PN532 по умолчанию.
nfc.setPassiveActivationRetries(0x10);

// настраиваем плату для чтения RFID-меток
nfc.SAMConfig();

Что касается «обнаружения» удаления

void loop() 
{
  static bool wasSuccess = false;
  uint8_t success = 0;
  uint8_t uid[] = { 0, 0, 0, 0, 0, 0, 0 };
  uint8_t uidLength;
  success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, &uidLength);
  if (success) 
  {
      wasSuccess = true;
      Serial.println("Card Detected!");
  }
  else if (wasSuccess)
  {
      wasSuccess = false;
      Serial.println("Card Removed!");
  }
  else
  {
      // вы можете удалить это, это приведет к переполнению вывода :p
      Serial.println("Card Not Detected!");
  }
}
,

@Патрик - включая обнаружение удаления? Я спрашиваю, потому что собирался написать код для своего PN532 :p, @Jaromanda X