1.设备材料:
2.连接说明:
ESP32 | RC522 |
---|---|
GPIO15 | SDA |
GPIO18 | SCK |
GPIO23 | MOSI |
GPIO19 | MISO |
无 | IRQ |
GND | GND |
GPIO4 | RST |
VCC | 3.3V |
注意:我看了很多教程,SDA连接GPIO21和RST连接22发现都不行,改成连接GPIO15和GPIO4就可以。
3.代码:
先安装MFRC522库
#include <SPI.h>
#include <MFRC522.h>
#define RST_PIN 4 // D1
#define SS_PIN 15 // D2
MFRC522 mfrc522(SS_PIN, RST_PIN); // 创建新的RFID实例
MFRC522::MIFARE_Key key;
void setup() {
Serial.begin(115200); // 设置串口波特率为9600
SPI.begin(); // SPI开始
mfrc522.PCD_Init(); // 初始化MFRC522卡
Serial.println("初始化完成...");
// 初始化密钥
for (byte i = 0; i < 6; i++) {
key.keyByte[i] = 0xFF;
}
}
void loop() {
// 寻找新卡
if (!mfrc522.PICC_IsNewCardPresent()) {
//Serial.println("没有找到卡");
return;
}
// 选择一张卡
if (!mfrc522.PICC_ReadCardSerial()) {
Serial.println("没有卡可选");
return;
}
// 显示卡片的详细信息
Serial.print(F("卡片 UID(十六进制):"));
dump_byte_array(mfrc522.uid.uidByte, mfrc522.uid.size);
String uidStr = "";
Serial.println();
for (int i = 0; i < sizeof(mfrc522.uid.uidByte); i++) {
// 将每个16进制数转换为两位数的字符串
char hexStr[3];
sprintf(hexStr, "%02X", mfrc522.uid.uidByte[i]);
uidStr += hexStr;
}
Serial.print(F("卡片字符串:"));
Serial.println(uidStr);
Serial.print(F("卡片 UID(十进制):"));
// dump_byte_array_dec(mfrc522.uid.uidByte, mfrc522.uid.size);
Serial.println();
Serial.print(F("卡片类型: "));
MFRC522::PICC_Type piccType = mfrc522.PICC_GetType(mfrc522.uid.sak);
// Serial.println(mfrc522.PICC_GetTypeName(piccType));
// 检查兼容性
if (piccType != MFRC522::PICC_TYPE_MIFARE_MINI
&& piccType != MFRC522::PICC_TYPE_MIFARE_1K
&& piccType != MFRC522::PICC_TYPE_MIFARE_4K) {
Serial.println(F("仅仅适合Mifare Classic卡的读写"));
return;
}
// 进行身份验证
byte blockAddr = 1; // 选择要读取的块地址
MFRC522::StatusCode status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, blockAddr, &key, &(mfrc522.uid));
if (status != MFRC522::STATUS_OK) {
Serial.print(F("身份验证失败?或者是卡链接失败: "));
Serial.println(mfrc522.GetStatusCodeName(status));
return;
}
// 读取数据
byte buffer[18];
byte size = sizeof(buffer);
status = mfrc522.MIFARE_Read(blockAddr, buffer, &size);
if (status != MFRC522::STATUS_OK) {
Serial.print(F("读取失败: "));
Serial.println(mfrc522.GetStatusCodeName(status));
return;
}
// 停止 PICC
mfrc522.PICC_HaltA();
// 停止加密 PCD
mfrc522.PCD_StopCrypto1();
}
/**
将字节数组转储为串行的十六进制值
*/
void dump_byte_array(byte *buffer, byte bufferSize) {
for (byte i = 0; i < bufferSize; i++) {
Serial.print(buffer[i] < 0x10 ? " 0" : " ");
Serial.print(buffer[i], HEX);
}
}
/**
将字节数组转储为串行的十进制值
*/
void dump_byte_array_dec(byte *buffer, byte bufferSize) {
for (byte i = 0; i < bufferSize; i++) {
Serial.print(buffer[i] < 10 ? " 0" : " ");
Serial.print(buffer[i], DEC);
}
}