测量 NFC 标签在 RC522 上停留的时间

问题描述 投票:0回答:1

我正在尝试通过 ESP32 测量特定 NFC 标签在 RC522 读取器上停留的时间。我正在使用 MFRC522.h 库来使用 RFID 模块,但我不知道某些函数的作用,因为它没有很好的文档记录...... 我尝试过不同的方法,但总是得到相同的结果。电线连接正确,转储信息显示正确的信息。

代码:

#include <SPI.h>
#include <MFRC522.h>

#define SS_PIN 5    // ESP32 pin GPIO5
#define RST_PIN 27  // ESP32 pin GPIO27

MFRC522 rfid(SS_PIN, RST_PIN);

unsigned long timeStart = 0;
unsigned long timeEnd = 0;
bool tagPresent = false;


void setup() {
  Serial.begin(9600);
  SPI.begin();      // init SPI bus
  rfid.PCD_Init();  // init MFRC522
  Serial.println("Use an RFID tag");
}

void loop() {
  if (rfid.PICC_IsNewCardPresent() && rfid.PICC_ReadCardSerial()) {
    if (!tagPresent) {  // if tagPresent = false, then the tag has just "arrived"
      tagPresent = true;
      timeStart = millis();
    }

    // Removing the next 2 function calls doesn't solve the problem but 
    // it seems to halve the time read in the duration variable

    rfid.PICC_HaltA();  
    rfid.PCD_StopCrypto1();

  } else {
    if (tagPresent) {  //at some point there was a tag, but it's gone now
      Serial.print("\n");
      timeEnd = millis();
      unsigned long duration = timeEnd - timeStart;
      Serial.print("Tag NFC stayed for ");
      Serial.print(duration);
      Serial.println(" ms");
      // noted the last tag's time, reset
      tagPresent = false;
    }
  }
}

输出

    Tag NFC stayed for 51 ms
    Tag NFC stayed for 51 ms    
    Tag NFC stayed for 51 ms    
    Tag NFC stayed for 51 ms    
    ...

如果我将标签放在阅读器上,它会立即弹出一行输出,只要我将标签留在那里,就不会出现任何其他内容。如果我反复向阅读器抬起和降低标签,我会得到多个打印结果,如上面的输出所示。

相反,如果我将标签放置 10 秒,然后将其移除,则需要打印“标签 NFC 停留了 10000 毫秒”。

arduino nfc esp32 rfid mfrc522
1个回答
0
投票

您的逻辑似乎错误,这可能是问题的原因。

在循环中,您检查

PICC_IsNewCardPresent
,顾名思义,这会发出 ISO 14443-3 命令并更改标签的状态。

在循环的第一次迭代中,它将返回

true
,然后当您在循环的第二次迭代中再次调用它时,它将返回
false
。这是因为仍然存在的标签不是新标签并且不处于新标签的状态。

因此,在给你时间之前,你的循环只会迭代一次。

我不使用 RC522 进行编程,但对于 NFC 交互,以下代码逻辑重写可能会起作用

void loop() {
  if (!tagPresent) {
    // Check if a new Tag is presented
    if (rfid.PICC_IsNewCardPresent()) {
      tagPresent == true;
      timeStart = millis();
    }
  } else {
    // Check the Tag is still present
    if (!rfid.PICC_ReadCardSerial()) {
      // A ready Tag is longer present as UID read has failed
      Serial.print("\n");
      timeEnd = millis();
      unsigned long duration = timeEnd - timeStart;
      Serial.print("Tag NFC stayed for ");
      Serial.print(duration);
      Serial.println(" ms");
      // noted the last tag's time, reset
      tagPresent = false;
    }
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.