ESP32C6读取RFID-RC522卡号完整教程
分享作者:XIUYUAN
作者昵称:XIUYUAN
评测品牌:iCEasy
评测型号:IC卡感应模块MFRC-522
发布时间:2025-10-15 11:14:26
1
视频链接
【ESP32C6读取RFID-RC522卡号-哔哩哔哩】 https://b23.tv/vhTRjKV
前言
本项目使用ESP32C6微控制器配合RFID-RC522模块实现IC卡读取功能,可以通过Arduino串口监视器实时查看卡号信息。系统支持多种格式显示卡号(十六进制、十进制、数字ID),适用于门禁系统、考勤打卡、智能储物柜等应用场景。
开源口碑分享内容

项目简介

       本项目使用ESP32C6微控制器配合RFID-RC522模块实现IC卡读取功能,可以通过Arduino串口监视器实时查看卡号信息。系统支持多种格式显示卡号(十六进制、十进制、数字ID),适用于门禁系统、考勤打卡、智能储物柜等应用场景。

核心特点:

       ✅ 快速识别MIFARE卡片

       ✅ 多格式显示卡号(HEX/DEC/数字)

       ✅ 自动检测卡片类型

       ✅ 完善的错误提示

       ✅ 中文友好界面

适用人群:

       Arduino初学者

       智能门禁开发者

       物联网爱好者

       创客教育工作者


硬件清单

所需组件

| 组件名称 | 规格说明 | 数量 | 参考价格 |
|---------|---------|------|---------|
| ESP32C6-WROOM-1 | 开发板 | 1 | ¥25-35 |
| RFID-RC522模块 | 13.56MHz读卡器 | 1 | ¥0-10 |
| IC卡/钥匙扣 | MIFARE 1K/4K | 若干 | 通常模块附赠 |
| 杜邦线 | 母对母/公对母 | 若干 | ¥2-5 |
| 面包板 | 可选 | 1 | ¥3-8 |
| USB数据线 | Type-C | 1 | - |

硬件说明

1.ESP32C6-WROOM-1:

       RISC-V 32位单核处理器

       主频160MHz

       支持Wi-Fi 6 (802.11ax)

       支持蓝牙5.3 (LE)

       丰富的GPIO和外设接口

2.RFID-RC522模块:

       工作频率:13.56MHz

       通信接口:SPI

       支持协议:ISO14443A

       读取距离:3-5cm

       工作电压:3.3V(⚠️ 不支持5V)

       支持卡片:MIFARE S50、S70、UltraLight、NTAG等

接线说明

引脚连接表

重要提示:ESP32C6的SPI引脚与传统ESP32不同,必须按以下接线!

| RC522引脚 | ESP32C6引脚 | 功能说明 |
|-----------|-------------|----------|
| **SDA** | **GPIO10** | 片选信号 (SS/CS) |
| **SCK** | **GPIO6** | SPI时钟信号 |
| **MOSI** | **GPIO7** | 主机输出从机输入 |
| **MISO** | **GPIO5** | 主机输入从机输出 |
| **IRQ** | **不连接** | 中断引脚(本项目不使用) |
| **GND** | **GND** | 地线 |
| **RST** | **GPIO9** | 复位信号 |
| **3.3V** | **3.3V** | 电源正极 |

接线图示

ESP32C6                    RC522模块
┌─────────┐              ┌─────────┐
│         │              │         │
│  GPIO10 ├──────────────┤ SDA     │
│  GPIO6  ├──────────────┤ SCK     │
│  GPIO7  ├──────────────┤ MOSI    │
│  GPIO5  ├──────────────┤ MISO    │
│  GPIO9  ├──────────────┤ RST     │
│  3.3V   ├──────────────┤ 3.3V    │
│  GND    ├──────────────┤ GND     │
│         │              │ IRQ (NC)│
└─────────┘              └─────────┘

接线注意事项

⚠️ 关键警告:

       1. 电压必须为3.3V:RC522模块不支持5V供电,接5V会永久损坏模块!

       2. GND必须共地:ESP32C6和RC522的地线必须连接在一起

       3. 接线要牢固:面包板接触不良是最常见的问题,建议多按压几次

       4. IRQ引脚不连接:本项目不使用中断功能,该引脚可以悬空

       5. SPI引脚不可随意更改:ESP32C6的硬件SPI引脚已固定


软件环境配置

1. 安装Arduino IDE

       下载地址:https://www.arduino.cc/en/software

       推荐版本:2.0或以上

2. 添加ESP32开发板支持

步骤:

       1. 打开Arduino IDE

       2. 点击:`文件` → `首选项`

       3. 在"附加开发板管理器网址"中添加:

   https://espressif.github.io/arduino-esp32/package_esp32_index.json

       4. 点击:`工具` → `开发板` → `开发板管理器`

       5. 搜索"esp32"并安装最新版本

3. 安装MFRC522库

方法一:通过库管理器(推荐)

       1. 点击:`工具` → `管理库...`

       2. 搜索框输入:`MFRC522`

       3. 找到 "MFRC522 by GithubCommunity"

       4. 点击"安装"按钮

方法二:手动安装

       1. 访问:https://github.com/miguelbalboa/rfid

       2. 下载ZIP文件

       3. 点击:`项目` → `加载库` → `添加.ZIP库...`

       4. 选择下载的ZIP文件

4. 选择开发板

       点击:`工具` → `开发板` → `ESP32C6 Dev Module`

       选择正确的COM端口


完整代码

#include <SPI.h>
#include <MFRC522.h>

// ESP32C6的SPI引脚定义
#define SCK_PIN   6     // SPI时钟
#define MISO_PIN  5     // SPI主入从出
#define MOSI_PIN  7     // SPI主出从入
#define SS_PIN    10    // 片选引脚 (SDA)
#define RST_PIN   9     // 复位引脚

MFRC522 mfrc522(SS_PIN, RST_PIN);

void setup() {
  Serial.begin(115200);
  while (!Serial);
  
  // ⚠️ 关键:明确初始化SPI,指定引脚
  SPI.begin(SCK_PIN, MISO_PIN, MOSI_PIN, SS_PIN);
  
  delay(100);
  
  // 初始化MFRC522
  mfrc522.PCD_Init();
  
  delay(100);
  
  Serial.println("=================================");
  Serial.println("    RFID-RC522 卡片读取系统");
  Serial.println("         iCEasy开发");
  Serial.println("=================================");
  Serial.println();
  
  // 检查连接状态
  byte version = mfrc522.PCD_ReadRegister(mfrc522.VersionReg);
  Serial.print("MFRC522 固件版本: 0x");
  Serial.println(version, HEX);
  
  if (version == 0x00 || version == 0xFF) {
    Serial.println("❌ 错误: 无法检测到MFRC522模块!");
    Serial.println("请检查接线:");
    Serial.println("  SDA  -> GPIO10");
    Serial.println("  SCK  -> GPIO6");
    Serial.println("  MOSI -> GPIO7");
    Serial.println("  MISO -> GPIO5");
    Serial.println("  RST  -> GPIO9");
    Serial.println("  GND  -> GND");
    Serial.println("  3.3V -> 3.3V");
    while(1);  // 停止程序
  }
  
  Serial.println("✅ MFRC522模块初始化成功!");
  Serial.println("请将IC卡靠近读卡器...");
  Serial.println();
}

void loop() {
  // 检查是否有新卡片
  if (!mfrc522.PICC_IsNewCardPresent()) {
    return;
  }
  
  // 选择一张卡片
  if (!mfrc522.PICC_ReadCardSerial()) {
    return;
  }
  
  // 显示分隔线
  Serial.println("=================================");
  Serial.println("📇 检测到新卡片!");
  Serial.println("---------------------------------");
  
  // 显示卡片类型
  Serial.print("卡片类型: ");
  MFRC522::PICC_Type piccType = mfrc522.PICC_GetType(mfrc522.uid.sak);
  Serial.println(mfrc522.PICC_GetTypeName(piccType));
  
  // 显示卡片UID (十六进制格式)
  Serial.print("卡号 (HEX): ");
  for (byte i = 0; i < mfrc522.uid.size; i++) {
    Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
    Serial.print(mfrc522.uid.uidByte[i], HEX);
  }
  Serial.println();
  
  // 显示卡片UID (十进制格式)
  Serial.print("卡号 (DEC): ");
  for (byte i = 0; i < mfrc522.uid.size; i++) {
    Serial.print(mfrc522.uid.uidByte[i] < 10 ? " 00" : (mfrc522.uid.uidByte[i] < 100 ? " 0" : " "));
    Serial.print(mfrc522.uid.uidByte[i], DEC);
  }
  Serial.println();
  
  // 显示UID长度
  Serial.print("UID长度: ");
  Serial.print(mfrc522.uid.size);
  Serial.println(" 字节");
  
  // 将UID转换为单个数字(仅适用于4字节UID)
  if (mfrc522.uid.size == 4) {
    unsigned long cardID = 0;
    for (byte i = 0; i < 4; i++) {
      cardID = cardID * 256 + mfrc522.uid.uidByte[i];
    }
    Serial.print("卡号 (数字): ");
    Serial.println(cardID);
  }
  
  Serial.println("=================================");
  Serial.println();
  
  // 停止读卡
  mfrc522.PICC_HaltA();
  mfrc522.PCD_StopCrypto1();
  
  delay(1000);  // 延迟1秒,避免重复读取
}

代码详解

关键代码说明

1. ESP32C6 SPI初始化(重点!)

```cpp
// ❌ 错误的写法(会导致Communication failure)
SPI.begin();

// ✅ 正确的写法(ESP32C6必须明确指定引脚)
SPI.begin(SCK_PIN, MISO_PIN, MOSI_PIN, SS_PIN);
```

为什么必须指定引脚?

       ESP32C6的SPI引脚与传统ESP32不同,如果不明确指定,库会使用错误的默认引脚,导致通信失败。

2. 固件版本检测

```cpp
byte version = mfrc522.PCD_ReadRegister(mfrc522.VersionReg);
if (version == 0x00 || version == 0xFF) {
    // 通信失败,模块未连接
}

       正常的RC522模块固件版本应该是:

- `0x91` (v1.0)
- `0x92` (v2.0)

       如果读取到 `0x00` 或 `0xFF`,说明SPI通信失败。

3. 卡片检测流程

```cpp
// 第一步:检查是否有新卡片靠近
if (!mfrc522.PICC_IsNewCardPresent()) {
    return;
}

// 第二步:读取卡片序列号
if (!mfrc522.PICC_ReadCardSerial()) {
    return;
}

// 第三步:处理卡片数据
// ... 读取UID等信息

// 第四步:停止读卡,准备下次读取
mfrc522.PICC_HaltA();
mfrc522.PCD_StopCrypto1();

4. 多格式卡号显示

  • 十六进制格式(最常用):
```cpp
for (byte i = 0; i < mfrc522.uid.size; i++) {
    Serial.print(mfrc522.uid.uidByte[i], HEX);
}
// 输出示例: A3 B2 C1 D0
  • 十进制格式:
```cpp
for (byte i = 0; i < mfrc522.uid.size; i++) {
    Serial.print(mfrc522.uid.uidByte[i], DEC);
}
// 输出示例: 163 178 193 208
  • 单个数字ID(4字节UID):
```cpp
unsigned long cardID = 0;
for (byte i = 0; i < 4; i++) {
    cardID = cardID * 256 + mfrc522.uid.uidByte[i];
}
// 输出示例: 2746229200

使用说明

上传代码

       1. 连接ESP32C6到电脑USB口

       2. 选择正确的COM端口(`工具` → `端口`)

       3. 点击"上传"按钮(→图标)

       4. 等待编译和上传完成

打开串口监视器

       1. 点击:`工具` → `串口监视器`

       2. 设置波特率为 115200(右下角下拉菜单)

       3. 观察初始化信息

测试读卡

       1. 将IC卡或钥匙扣靠近RC522模块天线(距离3-5cm)

       2. 串口监视器会显示卡片信息

       3. 移开卡片,再次靠近可重复读取

正常输出示例

=================================
    RFID-RC522 卡片读取系统
         iCEasy开发
=================================

MFRC522 固件版本: 0x92
✅ MFRC522模块初始化成功!
请将IC卡靠近读卡器...

=================================
📇 检测到新卡片!
---------------------------------
卡片类型: MIFARE 1KB
卡号 (HEX):  A3 B2 C1 D0
卡号 (DEC):  163 178 193 208
UID长度: 4 字节
卡号 (数字): 2746229200
=================================

常见问题与解决方案

❌ 问题1:编译错误 "MFRC522.h: No such file or directory"

原因: 未安装MFRC522库

解决方案:

       1. 打开库管理器:`工具` → `管理库...`

       2. 搜索 "MFRC522"

       3. 安装 "MFRC522 by GithubCommunity"

       4. 重启Arduino IDE

❌ 问题2:串口显示 "Communication failure"

完整错误信息:

WARNING: Communication failure, is the MFRC522 properly connected?
Firmware Version: 0x0 = (unknown)

原因: SPI通信失败,这是最常见的问题!

解决方案:

✅ 检查代码中的SPI初始化(最重要!

// 确保setup()中有这一行
SPI.begin(SCK_PIN, MISO_PIN, MOSI_PIN, SS_PIN);

✅ 检查接线是否正确

       SDA → GPIO10

       SCK → GPIO6

        MOSI → GPIO7

       MISO → GPIO5

       RST → GPIO9

✅ 检查供电

用万用表测量RC522的3.3V引脚,应该是3.2-3.4V

       确认没有误接到5V引脚

✅ 检查杜邦线和面包板

       更换杜邦线(可能内部断线)

       重新插拔面包板连接

       建议直接焊接或使用质量好的连接器

✅ 检查模块是否损坏

       模块上的LED应该亮起

       尝试更换一个新的RC522模块

❌ 问题3:串口输出乱码

解决方案:

       检查串口监视器右下角波特率设置为 115200

       尝试关闭并重新打开串口监视器

❌ 问题4:无法检测到卡片

现象: 串口显示初始化成功,但靠近卡片无反应

解决方案:

       1. 缩短距离:将卡片紧贴RC522天线(<3cm)

       2. 检查卡片类型:确认是13.56MHz的MIFARE卡

       3. 尝试不同卡片:使用模块附赠的测试卡

       4. 检查天线:观察RC522模块天线是否完好

       5. 检查IRQ引脚:确保IRQ引脚没有误接

❌ 问题5:读取到的卡号全是0或全是F

解决方案:

       卡片靠近时间过短,保持卡片静止1-2秒

       SPI通信不稳定,检查接线

       卡片可能已损坏,更换卡片测试

❌ 问题6:重复读取同一张卡

解决方案:

代码中已包含延迟和停止读卡:
mfrc522.PICC_HaltA();  // 停止卡片
mfrc522.PCD_StopCrypto1();  // 停止加密
delay(1000);  // 延迟1秒

       如果仍然重复,增加延迟时间:

delay(2000);  // 改为2秒

故障排查流程图

┌─────────────────┐
│  上传代码并运行  │
└────────┬────────┘
         │
         ▼
┌─────────────────┐
│ 是否显示固件版本? │
└────┬───────┬────┘
     │是     │否
     │       ▼
     │  ┌─────────────────┐
     │  │ 1. 检查SPI初始化 │
     │  │ 2. 检查接线      │
     │  │ 3. 检查供电      │
     │  │ 4. 更换模块      │
     │  └─────────────────┘
     ▼
┌─────────────────┐
│  靠近IC卡测试    │
└────────┬────────┘
         │
         ▼
┌─────────────────┐
│ 是否检测到卡片?  │
└────┬───────┬────┘
     │是     │否
     │       ▼
     │  ┌─────────────────┐
     │  │ 1. 缩短距离      │
     │  │ 2. 更换卡片      │
     │  │ 3. 检查天线      │
     │  └─────────────────┘
     ▼
┌─────────────────┐
│   读取成功! ✅  │
└─────────────────┘

项目扩展建议

1. 添加蜂鸣器提示

       读卡成功时发出"滴"声:

```cpp
#define BUZZER_PIN 8

void setup() {
    pinMode(BUZZER_PIN, OUTPUT);
    // ... 其他初始化代码
}

void loop() {
    // 读卡成功后
    if (mfrc522.PICC_ReadCardSerial()) {
        digitalWrite(BUZZER_PIN, HIGH);
        delay(100);
        digitalWrite(BUZZER_PIN, LOW);
        // ... 显示卡号
    }
}

2. 添加OLED显示屏

       在屏幕上显示卡号:

```cpp
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

void setup() {
    Wire.begin(6, 7);  // SDA, SCL
    display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
    // ... 其他初始化
}

void loop() {
    // 读卡成功后
    display.clearDisplay();
    display.setTextSize(1);
    display.setCursor(0, 0);
    display.println("Card ID:");
    // 显示卡号
    display.display();
}

3. Wi-Fi上传卡号到服务器

```cpp
#include <WiFi.h>
#include <HTTPClient.h>

const char* ssid = "你的WiFi名称";
const char* password = "你的WiFi密码";

void uploadCardID(unsigned long cardID) {
    HTTPClient http;
    String url = "http://yourserver.com/api/card?id=" + String(cardID);
    http.begin(url);
    int httpCode = http.GET();
    http.end();
}

4. 存储授权卡号列表

```cpp
unsigned long authorizedCards[] = {
    2746229200,
    1234567890,
    9876543210
};

bool isAuthorized(unsigned long cardID) {
    for (int i = 0; i < sizeof(authorizedCards) / sizeof(authorizedCards[0]); i++) {
        if (authorizedCards[i] == cardID) {
            return true;
        }
    }
    return false;
}

void loop() {
    // 读卡后
    if (isAuthorized(cardID)) {
        Serial.println("✅ 授权卡片");
        // 开门或其他操作
    } else {
        Serial.println("❌ 未授权卡片");
    }
}

5. 控制继电器实现门禁

```cpp
#define RELAY_PIN 11

void setup() {
    pinMode(RELAY_PIN, OUTPUT);
    digitalWrite(RELAY_PIN, LOW);
}

void openDoor() {
    Serial.println("开门中...");
    digitalWrite(RELAY_PIN, HIGH);
    delay(3000);  // 开门3秒
    digitalWrite(RELAY_PIN, LOW);
    Serial.println("门已关闭");
}

项目应用场景

1. 智能门禁系统

       刷卡开门

       记录进出时间

       多用户管理

2. 考勤打卡系统

       员工刷卡签到

       自动记录时间

       数据上传云端

3. 智能储物柜

       刷卡存取物品

       防止误开他人柜子

       租赁计时计费

4. 图书借阅管理

       图书RFID标签

       自助借还书

       库存盘点

5. 停车场管理

       车辆进出记录

       自动计费

       月卡识别


性能参数

| 参数 | 数值 |
|------|------|
| 读取距离 | 3-5cm |
| 读取速度 | <100ms |
| 工作频率 | 13.56MHz |
| 功耗 | <50mA |
| 支持卡片数 | 理论无限 |
| UID长度 | 4/7/10字节 |

学到的经验教训

🎯 重要发现

1. ESP32C6的SPI必须显式初始化

SPI.begin(SCK, MISO, MOSI, SS);  // 必须指定引脚!

2. 固件版本检测是诊断连接问题的最佳方法

       `0x92` = 正常

       `0x00` 或 `0xFF` = 连接失败

3. 面包板接触不良是最常见的硬件问题

       建议使用质量好的杜邦线

       重要项目建议焊接

4. RC522必须使用3.3V供电

       5V会损坏模块

       内部无稳压电路


参考资料

[ESP32C6官方文档](https://docs.espressif.com/projects/esp-idf/en/latest/esp32c6/)

[MFRC522数据手册](https://www.nxp.com/docs/en/data-sheet/MFRC522.pdf)

[MFRC522 Arduino库](https://github.com/miguelbalboa/rfid)

[MIFARE卡片协议](https://www.nxp.com/products/rfid-nfc/mifare-hf/mifare-classic:MC_41863)


总结

本项目从零开始,完整演示了ESP32C6与RFID-RC522的连接和使用。特别记录了Communication failure这个最常见的坑,希望帮助后来者少走弯路。

关键要点回顾:

       1. ✅ ESP32C6必须明确指定SPI引脚

       2. ✅ RC522只能用3.3V供电

       3. ✅ 通过固件版本检测诊断连接问题

       4. ✅ 接线要牢固,面包板容易接触不良

       5. ✅ 读卡距离控制在5cm以内


有问题欢迎在评论区留言交流!🎉

全部评论
暂无评论
0/144