ESP8266/ESP32连接RFID RC522----简单制作门禁系统
创作时间:
作者:
@小白创作中心
ESP8266/ESP32连接RFID RC522----简单制作门禁系统
引用
CSDN
1.
https://m.blog.csdn.net/weixin_63175817/article/details/143608903
目录
前言
材料清单
接线讲解
ESP32
ESP8266
RC522各个引脚的作用(从左到右)
模块接线
ESP8266
ESP32
代码驱动
依赖库
定义引脚
代码实现
RC522读取ic卡卡号
RC522读取卡片判断是否为授权卡(门禁系统实现原型)
结语
前言
不管是ESP32还是ESP8266,二者本没有太大区别,驱动代码都是一样的,只不过是接线的引脚不一样,故而代码也略有不同(定义引脚处肯定不同哈哈哈哈)。
材料清单
- 单片机:ESP32/ESP8266
- RFID-RC522
- 杜邦线(母对母)
- LED(可有可无)
接线讲解
主要讲RC522,可直接往下拉
ESP32
----- 这里只放引脚图-----
ESP8266
----- 这里只放引脚图-----
RFID RC522
RC522各个引脚的作用(从左到右)
- SDA:也称为SS或SEL,是SPI通信中的片选信号,用于启动和关闭与RC522的通信。
- SCK(Serial Clock):串行时钟线,用于SPI通信中的时钟信号,控制数据的发送和接收时机。
- MOSI(Master Out Slave In):主机输出从机输入,用于SPI通信中的数据传输。
- MISO(Master In Slave Out):主机输入从机输出,用于SPI通信中的数据传输。
- IRQ(Interrupt Request):中断请求引脚,用于模块事件的通知,如卡片接近或离开时产生中断信号。此引脚可以悬空不使用。
- GND:地线,为模块提供接地。
- RST(Reset):复位引脚,高电平有效,用于重置模块到初始状态。
- 3.3V:电源引脚,为模块提供3.3V的电源。
IRQ引脚无特殊要求一般不用接
这里我们主要是需要记住两个引脚:SDA和RST(这两个引脚在代码中要使用)
模块接线
ESP8266
这里我将SDA接到了D2(GPI4)引脚、RST接到了D1(GPI5)引脚(记住这两个引脚位置,代码会用到)
ESP32
这里我将SDA接到了15引脚、RST接到了22引脚(记住这两个引脚位置,代码会用到)
代码驱动
ESP8266和ESP32都是一样的,这里我就统一来讲
依赖库
#include <SPI.h>
#include <MFRC522.h>
SPI库是驱动串行通信协议内置库
MFRC522库是驱动库
需要使用RC522必须有这两个依赖库,我相信大家都会下载安装的,这里就不教学了,想要依赖库包可以给我留言,我看到会发的
定义引脚
这里示例是ESP8266:
#define RST_PIN 5 // D1引脚
#define SS_PIN 4 // D2引脚
//RST_PIN对应着RST SS_PIN对应SDA
代码实现
RC522读取ic卡卡号
#include <SPI.h>
#include <MFRC522.h>
#define RST_PIN 5 // D1
#define SS_PIN 4 // 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);
Serial.println();
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);
}
}
代码中都有注释,就不过多讲解’
RC522读取卡片判断是否为授权卡(门禁系统实现原型)
#include <SPI.h>
#include <MFRC522.h>
#define SS_PIN 4 // 片选引脚,对应D2 (GPIO4)
#define RST_PIN 5 // 复位引脚,对应D1 (GPIO5)
#define LED_PIN 2 // LED引脚,对应D4 (GPIO2)
MFRC522 mfrc522(SS_PIN, RST_PIN); // 创建MFRC522实例
// 存储3张授权卡的UID
byte authorizedCards[3][4] = {
{0xD3, 0x03, 0xE6, 0x2A},
{0x55, 0x68, 0x77, 0x88},
{0x0F, 0x1E, 0x2D, 0x3C}
};
void setup() {
Serial.begin(115200);
SPI.begin();
mfrc522.PCD_Init(); // 初始化MFRC522
pinMode(LED_PIN, OUTPUT); // 设置LED引脚为输出模式
digitalWrite(LED_PIN, LOW); // 初始状态关闭LED
Serial.println("MFRC522初始化完成...");
}
void loop() {
// 检查是否有新卡
if (!mfrc522.PICC_IsNewCardPresent() || !mfrc522.PICC_ReadCardSerial()) {
return;
}
// 检查读取到的卡号是否与任意一张授权卡号匹配
bool cardAuthorized = false;
for (int i = 0; i < 5; i++) {
if (mfrc522.uid.size == 4 && memcmp(mfrc522.uid.uidByte, authorizedCards[i], 4) == 0) {
cardAuthorized = true;
break;
}
}
// 如果卡片被授权,点亮LED并打印“授权卡”
if (cardAuthorized) {
digitalWrite(LED_PIN, HIGH);
Serial.println("授权卡");
} else {
// 如果卡片未被授权,打印“非授权卡”
Serial.println("非授权卡");
}
// 打印卡号
Serial.print("Card UID:");
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();
// 停止卡片
mfrc522.PICC_HaltA();
delay(1000); // 等待一段时间再次检测
}
结语
本教程只是简单讲解RFID-RC522各引脚之间简单原理,该如何与单片机接线
代码实现共提供两个示例,相信大家解读示例后会做出更多功能的小玩意(可连blink、小爱同学、阿里云、微信小程序等等)
热门推荐
把茴香苗放鸡蛋里搅一搅,出锅就是招牌菜,滑嫩鲜香又解馋,收藏
41岁的“华女”黄晓华正式做回自己,他与老作的故事走向了终点
花胶百科:从顶级金钱胶到日常选购指南
台湾每10人就有1人高血脂,专家详解防治要点
坚果食用指南:三种心血管疾病患者这样吃最安全
日本五大城市赏樱全攻略:景点、花期、住宿一文掌握
轩辕剑五攻略
氨基酸洗面奶适合敏感肌:温和清洁不刺激
涠洲岛旅游热:交通攻略大揭秘
攀枝花秋冬旅游打卡:红叶温泉与湖景尽收眼底
《长河落日》:张鲁一、张钧甯、张晨光、张颂文二战谍战传奇巨制
朱元璋改小写为大写,一制度沿用600年
郭桓案后朱元璋创新记账法,大写数字沿用至今
双十一前夕,掌握大写数字规范,防范财务风险
从Ice Cream到Sherbet:带你了解九种冰淇淋的英文表达
今日小寒|明日冷空气造访,降温来需添衣
小七孔景区的绝美瀑布,你去过几个?
保靖黄金茶:氨基酸含量翻倍,护心功效获科学认证
拉布拉多游泳训练指南:从入门到精通
泰国宠物游:狗狗水上运动大集合
阿雄带你了解狗狗游泳安全
揭秘拉布拉多犬:天生游泳健将的三大秘密
数字化、智能化赋能,实现市政工程档案管理安全高效
档案定义的多样性:五类视角与三大要素
告别冰箱异味:从食材收纳到深度清洁的完整指南
演绎推理:从一般到特殊的逻辑思维利器
基础模型推理能力全解析:从常识到多模态的最新进展
巴氏消毒奶冷藏保存的秘密
驾考倒车入库全攻略:离合器控制与后视镜观察技巧详解
孤独养老,如何优雅老去?