RC522读卡器DIY从Arduino到ESP32打造你的智能门禁原型附完整代码周末整理工作室时翻出一堆闲置的RFID卡片突然想到可以用它们做个智能门禁系统。这个想法让我兴奋不已——毕竟谁不想用一张卡片就潇洒地打开自己的秘密基地呢经过三天折腾终于用最常见的RC522模块搭配ESP32开发板实现了这个功能。下面就把这个既实用又有成就感的项目完整分享给大家。1. 硬件准备与连接1.1 物料清单在开始焊接前你需要准备以下硬件总成本不超过100元核心组件RC522 RFID读卡模块13.56MHzESP32开发板推荐ESP32-WROOM-325V继电器模块模拟门锁开关面包板杜邦线若干可选扩展OLED显示屏I2C接口0.96寸蜂鸣器模块用于声音反馈18650电池盒实现移动供电1.2 电路连接图解RC522与ESP32的连接方式比想象中简单得多只需要7根线SPI接口RC522引脚ESP32引脚备注SDAGPIO5片选信号(SS)SCKGPIO18SPI时钟MOSIGPIO23主设备输出从设备输入MISOGPIO19主设备输入从设备输出IRQ不接本项目未使用中断GNDGND共地3.3V3.3V电源输入注意RC522必须使用3.3V供电5V会烧毁模块如果使用Arduino Uno需要电平转换模块。继电器连接更简单VCC → 5VGND → GNDIN → GPIO4通过程序控制2. 软件开发环境搭建2.1 库安装与配置PlatformIO环境下VSCode扩展的库依赖配置[env:esp32dev] platform espressif32 board esp32dev framework arduino lib_deps miguelbalboa/MFRC522^1.4.10 adafruit/Adafruit SSD1306^2.5.7 adafruit/Adafruit GFX Library^1.11.3关键库说明MFRC522RFID操作核心库支持卡片的检测、读取和写入SSD1306OLED显示驱动用于实时展示卡片信息GFX图形显示基础库提供文字和图形绘制功能2.2 基础代码框架创建主程序文件main.cpp包含以下核心功能模块#include SPI.h #include MFRC522.h #include Wire.h #include Adafruit_GFX.h #include Adafruit_SSD1306.h #define RST_PIN 22 // 自定义复位引脚 #define SS_PIN 5 // 片选引脚 #define RELAY_PIN 4 // 继电器控制引脚 MFRC522 mfrc522(SS_PIN, RST_PIN); // 创建RFID实例 Adafruit_SSD1306 display(128, 64, Wire, -1); // OLED实例 void setup() { Serial.begin(115200); SPI.begin(); // 初始化SPI总线 mfrc522.PCD_Init(); // 初始化RFID display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // OLED初始化 pinMode(RELAY_PIN, OUTPUT); digitalWrite(RELAY_PIN, LOW); // 初始关闭继电器 display.clearDisplay(); display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(0,0); display.println(RFID门禁系统); display.display(); }3. 核心功能实现3.1 卡片读取与处理在loop()函数中添加卡片检测逻辑void loop() { // 检测新卡片 if (!mfrc522.PICC_IsNewCardPresent()) { delay(50); return; } // 读取卡片序列号 if (!mfrc522.PICC_ReadCardSerial()) { return; } // 获取卡片UID并转换为字符串 String uidStr ; for (byte i 0; i mfrc522.uid.size; i) { uidStr String(mfrc522.uid.uidByte[i], HEX); } // 在OLED上显示UID display.clearDisplay(); display.setCursor(0,0); display.print(检测到卡片:); display.setCursor(0,20); display.print(UID: ); display.print(uidStr); display.display(); // 控制继电器模拟开门 digitalWrite(RELAY_PIN, HIGH); delay(3000); // 保持开门状态3秒 digitalWrite(RELAY_PIN, LOW); // 停止卡片通信 mfrc522.PICC_HaltA(); }3.2 白名单验证系统升级版代码增加授权卡片验证功能// 在文件开头定义授权卡片UID const String authorizedCards[] { a1b2c3d4, // 替换为你的卡片UID e5f6g7h8 // 可添加多个授权UID }; bool isAuthorized(String uid) { for (int i0; isizeof(authorizedCards)/sizeof(String); i) { if (uid.equalsIgnoreCase(authorizedCards[i])) { return true; } } return false; } // 修改loop()中的处理逻辑 if (isAuthorized(uidStr)) { display.print(验证通过); digitalWrite(RELAY_PIN, HIGH); // 开门 } else { display.print(未授权卡片); // 可以添加蜂鸣器报警 }4. 功能扩展与优化4.1 网络功能集成ESP32专属利用ESP32的WiFi能力实现远程记录#include WiFi.h #include HTTPClient.h const char* ssid 你的WiFi名称; const char* password 你的WiFi密码; const char* serverURL http://你的服务器地址/log; void connectWiFi() { WiFi.begin(ssid, password); while (WiFi.status() ! WL_CONNECTED) { delay(500); Serial.print(.); } } void logAccess(String uid, bool authorized) { if (WiFi.status() WL_CONNECTED) { HTTPClient http; String payload uid uid auth String(authorized); http.begin(serverURL); http.addHeader(Content-Type, application/x-www-form-urlencoded); int httpCode http.POST(payload); http.end(); } } // 在验证后调用 logAccess(uidStr, isAuthorized(uidStr));4.2 低功耗优化技巧对于电池供电场景可以大幅降低功耗// 深度睡眠模式配置 #define uS_TO_S_FACTOR 1000000 // 转换系数 #define TIME_TO_SLEEP 5 // 睡眠时间(秒) void setup() { esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR); // ...其他初始化代码 } void loop() { // ...卡片处理逻辑 // 进入深度睡眠 esp_deep_sleep_start(); }实测电流从80mA降至10μA左右18650电池可续航数月。5. 常见问题解决Q1: 读卡距离太近怎么办检查天线线圈是否完好无损尝试调整mfrc522.PCD_SetAntennaGain(mfrc522.RxGain_max);使用质量更好的卡片如NFC标签Q2: 多卡片同时出现时混乱启用防冲突机制mfrc522.PICC_IsNewCardPresent()已包含此功能增加去抖动逻辑检测到卡片后延迟500ms再检测Q3: 如何写入数据到卡片MFRC522::MIFARE_Key key; for (byte i 0; i 6; i) key.keyByte[i] 0xFF; // 默认密钥 byte dataBlock[] {Hello RFID!}; // 要写入的数据 byte trailerBlock 7; // 控制块 if (mfrc522.PCD_Authenticate(...) MFRC522::STATUS_OK) { mfrc522.MIFARE_Write(blockAddr, dataBlock, sizeof(dataBlock)); }6. 项目外壳与安装用3D打印机制作一个简约外壳上层放置ESP32和RC522模块中间隔层安装继电器和电源模块底部预留螺丝孔位安装技巧将RC522天线朝外放置避免金属干扰在门框内侧隐藏安装只露出读卡区域使用双面胶或螺丝固定确保稳固性最后分享一个实际部署的小技巧在门内侧安装一个物理开关作为应急超控万一电子系统故障时仍可手动开门。我的工作室门禁现在既支持RFID卡解锁也保留了钥匙备份双重保障更安心。