分享免费的编程资源和教程

网站首页 > 技术教程 正文

如何使用ESP32和RC522模块进行Mifare卡的读写操作?

goqiw 2024-11-07 11:06:36 技术教程 29 ℃ 0 评论

通过以下步骤连接ESP32和RC522模块:

  • 准备好ESP32开发板,RC522读写器模块,以及一些杜邦线。
  • 将ESP32和RC522模块的引脚按照下表进行连接:


Signal

SCK

MOSI

MISO

RST

CS (SDA)

ESP32

P0

P2

P4

P5

P14

  • 在Arduino IDE中安装MFRC522库,
  • 将程序上传到ESP32,并打开串口监视器。
  • 将Mifare卡靠近RC522模块,观察串口监视器中显示的卡片信息,如UID,类型,数据等。
  • 根据需要修改程序中的读写指令,实现自定义的功能。

以下的示例代码,实现使用ESP32和RC522模块对Mifare卡的读写操作。该代码使用了Arduino IDE和MFRC522库,可以在ESP32上运行。代码的功能是:

  • 读取Mifare卡的UID和类型,并在串口监视器上显示。
  • 如果Mifare卡是Mifare Classic类型,尝试使用默认密码(0xFFFFFFFFFFFF)对第一个扇区进行鉴权。
  • 如果鉴权成功,读取第一个扇区的第一个数据块,并在串口监视器上显示。
  • 如果鉴权成功,尝试向第一个扇区的第一个数据块写入一些数据,并在串口监视器上显示写入结果。

示例代码如下:

// 引入MFRC522库
#include <MFRC522.h>

// 定义ESP32和RC522模块的引脚
#define SS_PIN 5 // ESP32 pin GIOP5
#define RST_PIN 27 // ESP32 pin GIOP27

// 创建MFRC522对象
MFRC522 rfid (SS_PIN, RST_PIN);

// 定义Mifare Classic卡的默认密码
byte key[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};

void setup() {
  // 初始化串口通信
  Serial.begin(115200);
  
  // 初始化SPI通信
  SPI.begin();
  
  // 初始化RFID模块
  rfid.PCD_Init();
  
  // 打印提示信息
  Serial.println("RFID Reader Ready");
}

void loop() {
  // 检测是否有新卡片靠近
  if (rfid.PICC_IsNewCardPresent()) {
    // 读取卡片的UID和类型
    if (rfid.PICC_ReadCardSerial()) {
      // 打印卡片的UID
      Serial.print("Card UID: ");
      for (byte i = 0; i < rfid.uid.size; i++) {
        Serial.print(rfid.uid.uidByte[i], HEX);
        Serial.print(" ");
      }
      Serial.println();
      
      // 打印卡片的类型
      byte piccType = rfid.PICC_GetType(rfid.uid.sak);
      Serial.print("Card Type: ");
      Serial.println(rfid.PICC_GetTypeName(piccType));
      
      // 如果卡片是Mifare Classic类型,尝试进行读写操作
      if (piccType == MFRC522::PICC_TYPE_MIFARE_1K || piccType == MFRC522::PICC_TYPE_MIFARE_4K) {
        // 定义要访问的扇区和数据块
        byte sector = 1;
        byte block = sector * 4;
        
        // 尝试使用默认密码对扇区进行鉴权
        MFRC522::StatusCode status = rfid.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, block, &key[0], &(rfid.uid));
        
        // 如果鉴权成功,打印提示信息
        if (status == MFRC522::STATUS_OK) {
          Serial.println("Authentication success");
          
          // 定义一个缓冲区用于存储读取或写入的数据
          byte buffer[18];
          byte size = sizeof(buffer);
          
          // 尝试读取数据块,并打印结果
          status = rfid.MIFARE_Read(block, buffer, &size);
          if (status == MFRC522::STATUS_OK) {
            Serial.print("Read data: ");
            for (byte i = 0; i < size; i++) {
              Serial.print(buffer[i], HEX);
              Serial.print(" ");
            }
            Serial.println();
          } else {
            Serial.println("Read failed");
          }
          
          // 定义一些要写入的数据
          byte data[16] = {0x01, 0x02, 0x03, 0x04, 
                           0x05, 0x06, 0x07, 0x08,
                           0x09, 0x0A, 0x0B, 0x0C,
                           0x0D, 0x0E, 0x0F, 0x10};
          
          // 尝试写入数据块,并打印结果
          status = rfid.MIFARE_Write(block, data, 16);
          if (status == MFRC522::STATUS_OK) {
            Serial.println("Write success");
          } else {
            Serial.println("Write failed");
          }
        } else {
          // 如果鉴权失败,打印提示信息
          Serial.println("Authentication failed");
        }
      }
      
      // 停止对卡片的加密通信
      rfid.PICC_HaltA();
      
      // 停止对卡片的读写操作
      rfid.PCD_StopCrypto1();
    }
  }
}

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表