我正在尝试通过 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 毫秒”。
您的逻辑似乎错误,这可能是问题的原因。
在循环中,您检查
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;
}
}
}