Чтение 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, на последовательном мониторе печатается сообщение Карта обнаружена!.
Однако, когда я вынимаю карту, надпись Карта не обнаружена или удалена! не печатается.
Как я могу заставить программу зацикливаться таким образом, чтобы она могла определять, когда карта присутствует/удалена?
@Sandrocottus, 👍0
Обсуждение1 ответ
Лучший ответ:
По умолчанию 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
- Использование прерываний с RC522
- Проблема совместного использования MISO с несколькими RFID-считывателями RC522
- rfid_default_keys проверить с помощью RC522
- MFRC522: прошивка неизвестна
- MFRC522 не сканируется карта
- RFID-RC522 не работает, горит красный светодиод
- Считывание одновременно RFID-МЕТКИ с помощью нескольких RFID-считывателей [MFRC522]
- Arduino Uno - Как записать персональные данные в NTAG213 с помощью RFID-RC522
как только вы это исправите (не знаю, почему оно так себя ведет), вы не сможете обнаружить, когда карта удалена... вы обнаружите, когда карта отсутствует... есть разница :p, @Jaromanda X
@JaromandaX да, ты прав. Но как тогда мне изменить код, чтобы обнаружить «карта вставлена» и «карта удалена»?, @Sandrocottus
вы бы достигли этого с помощью кода, который печатает удаленную карту только в том случае, если это первый
цикл
после присутствия карты... попробуйте добавитьnfc.setPassiveActivationRetries(0x10);
в вашу настройку непосредственно передnfc.SAMConfig() ;
- это должно остановить ожидание карты кодом :p, @Jaromanda X