根据你提供的代码,有几个问题需要注意和修正:
请确保在程序开头正确引入PN532库,例如:
#include <PN532.h>
。确认在程序中正确初始化NFC模块,包括设置通信接口和开始模块。
在这行代码
if (uidLength == sizeof(targetUid) && (UID) == 0)
中,(UID)
部分需要修改为memcmp(uid, targetUid, uidLength) == 0
。因为(UID)
是无效的语法。在匹配成功后点亮LED之前,先将LED引脚设置为输出模式,可以在
setup()
函数中添加pinMode(LED_PIN, OUTPUT);
进行初始化。可以使用串口监视器来调试代码并查看打印信息。确保串口波特率与你的代码设置一致(如
Serial.begin(9600);
)。
修正后的代码如下所示:
#include <Wire.h>
#include <Adafruit_PN532.h>
#define SDA_PIN 4
#define SCL_PIN 5
#define LED_PIN 13
Adafruit_PN532 nfc(SDA_PIN, SCL_PIN);
void setup(void) {
Serial.begin(9600);
pinMode(LED_PIN, OUTPUT);
nfc.begin();
uint32_t versiondata = nfc.getFirmwareVersion();
if (!versiondata) {
Serial.print("Didn't find PN53x board");
while (1); // Halt on failure
}
nfc.SAMConfig();
Serial.println("Waiting for an NFC card ...");
}
void loop(void) {
uint8_t success;
uint8_t uid[] = { 0, 0, 0, 0, 0, 0, 0 ,0};
uint8_t uidLength;
success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, &uidLength);
if (success) {
Serial.println("Found an NFC card!");
Serial.print("UID Length: ");Serial.print(uidLength, DEC);Serial.println(" bytes");
Serial.print("UID Value: ");
for (uint8_t i=0; i < uidLength; i++) {
Serial.print(" 0x");Serial.print(uid[i], HEX);
}
Serial.println("");
uint8_t targetUid[] = {3 , 3, 12, 9, 15, 5, 0, 3}; // 示例UID
if (uidLength == sizeof(targetUid) && memcmp(uid, targetUid, uidLength) == 0)
{
// 匹配成功,点亮LED
digitalWrite(LED_PIN, HIGH);
Serial.println("LED is ON");
delay(2000); // 持续点亮LED一段时间
digitalWrite(LED_PIN, LOW); // 熄灭LED
} else {
Serial.println("UID does not match the target UID");
}
//无论是否匹配,都重置NFC模块以准备下一次读取
nfc.resetHardware();
delay(100);
}
delay(1000); // 等待一段时间再次检测
}
请确保你已经正确引入相关库,并将代码中的引脚设置(如SDA_PIN,SCL_PIN,LED_PIN)与实际硬件连接相匹配。另外,也可以根据需要修改串口波特率和其他参数。希望这能帮助到你解决问题!
内容由零声教学AI助手提供,问题来源于学员提问