项目简介
本项目使用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以内
有问题欢迎在评论区留言交流!🎉

