arduino 读取pn532的 nfc信息代码

admin 1月前 151

#include <PN532_SWHSU.h>
#include <PN532.h>
#include <SoftwareSerial.h>
#include <EEPROM.h>  // 包含EEPROM库
SoftwareSerial uart1(PD5, PD6); // 链接nfc
PN532_SWHSU pn532swhsu(uart1);
PN532 nfc(pn532swhsu);
const int MAX_TAGS = 5;  // 最多存储5个卡号
const int TAG_SIZE = 16; // 每个卡号的最大长度(包括结束符)
const int EEPROM_START = 0; // EEPROM存储的起始地址
void setup() 
{
    Serial.begin(115200); 
    uart1.begin(115200);
    nfc.begin();
    nfc.SAMConfig();
}
void loop() 
{
    readNFC();
    delay(500);
}
void readNFC()
{
    boolean success;
    uint8_t uid[] = { 0, 0, 0, 0, 0, 0, 0 };  // Buffer to store the returned UID
    uint8_t uidLength = 7;                    // Length of the UID
    String nfcre = "";
    success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, &uid[0], &uidLength);
    if (success)
    {
        for (uint8_t i = 0; i < uidLength; i++)
        {
            nfcre += String(uid[i], HEX);
            Serial.print(uid[i], DEC);
            Serial.print(" ");
        } 
        Serial.println(" ");
        Serial.println(nfcre);
        // 检查是否与EEPROM中存储的卡号匹配
        if (checkTag(nfcre))
        {
            // 卡号匹配,点亮板载LED
            digitalWrite(LED_BUILTIN, HIGH);
            delay(500); // 亮500ms
            digitalWrite(LED_BUILTIN, LOW);
        }
        else
        {
            // 卡号不匹配,存储新的卡号
            saveTag(nfcre);
        }
    }
    else
    {
        // PN532 probably timed out waiting for a card
        // Serial.println("Timed out! Waiting for a card...");
    }
}
// 检查卡号是否匹配
bool checkTag(String tagId)
{
    for (int i = 0; i < MAX_TAGS; i++)
    {
        String storedTag = readFromEEPROM(i);
        if (storedTag == tagId)
        {
            return true; // 找到匹配的卡号
        }
    }
    return false; // 没有找到匹配的卡号
}
// 将卡号存储到EEPROM
void saveTag(String tagId)
{
    for (int i = 0; i < MAX_TAGS; i++)
    {
        if (readFromEEPROM(i) == "")
        {
            // 找到空的存储位置
            writeToEEPROM(i, tagId);
            Serial.println("Tag ID saved to EEPROM.");
            return;
        }
    }
    Serial.println("EEPROM is full. Cannot save new tag.");
}
// 写入卡号到EEPROM
void writeToEEPROM(int index, String tagId)
{
    int startAddress = EEPROM_START + index * TAG_SIZE;
    for (size_t i = 0; i < tagId.length(); i++)
    {
        EEPROM.write(startAddress + i, tagId[i]);
    }
    EEPROM.write(startAddress + tagId.length(), '\0'); // 添加字符串结束符
}
// 从EEPROM读取卡号
String readFromEEPROM(int index)
{
    int startAddress = EEPROM_START + index * TAG_SIZE;
    String storedTag = "";
    char c;
    for (int i = 0; i < TAG_SIZE; i++)
    {
        c = EEPROM.read(startAddress + i);
        if (c == '\0') break; // 遇到字符串结束符停止
        storedTag += c;
    }
    return storedTag;
}


欢迎联系本站长QQ:3216572
最新回复 (0)
返回