ESP8266/ESP32连接RFID RC522----简单制作门禁系统

目录

前言

材料清单

接线讲解

ESP32

ESP8266

RC522各个引脚的作用(从左到右)

模块接线

ESP8266

ESP32

代码驱动

依赖库

定义引脚

代码实现

RC522读取ic卡卡号

RC522读取卡片判断是否为授权卡(门禁系统实现原型)

结语


 

 

 

前言

不管是ESP32还是ESP8266,二者本没有太大区别,驱动代码都是一样的,只不过是接线的引脚不一样,故而代码也略有不同(定义引脚处肯定不同哈哈哈哈)。

 


材料清单

  • 单片机:ESP32/ESP8266
  •  RFID-RC522
  • 杜邦线(母对母)
  • LED(可有可无)

    接线讲解

主要讲RC522,可直接往下拉

ESP32

f2f0e42e8b7546ca95931f4a30e01e54.png

----- 这里只放引脚图-----

 

ESP8266

68352582551d43a0b430f871e59c5faf.png

----- 这里只放引脚图-----

 

RFID RC522

 

e59ce7b7448f4ca1a7602c673f5d6845.jpeg

 

RC522各个引脚的作用(从左到右)

  1. SDA:也称为SS或SEL,是SPI通信中的片选信号,用于启动和关闭与RC522的通信。
  2. SCK(Serial Clock):串行时钟线,用于SPI通信中的时钟信号,控制数据的发送和接收时机。
  3. MOSI(Master Out Slave In):主机输出从机输入,用于SPI通信中的数据传输。
  4. MISO(Master In Slave Out):主机输入从机输出,用于SPI通信中的数据传输。
  5. IRQ(Interrupt Request):中断请求引脚,用于模块事件的通知,如卡片接近或离开时产生中断信号。此引脚可以悬空不使用。
  6. GND:地线,为模块提供接地。
  7. RST(Reset):复位引脚,高电平有效,用于重置模块到初始状态。
  8. 3.3V:电源引脚,为模块提供3.3V的电源。

 

IRQ引脚无特殊要求一般不用接

这里我们主要是需要记住两个引脚:SDA和RST(这两个引脚在代码中要使用)

模块接线

ESP8266

26f59fc441524ff1a1199344f9ab3f20.png

这里我将SDA接到了D2(GPI4)引脚、RST接到了D1(GPI5)引脚(记住这两个引脚位置,代码会用到)


ESP32

465999fc59f94fafbd8e19c5ec897682.png

这里我将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、小爱同学、阿里云、微信小程序等等)

 

**********欢迎大家评论区留言交流**********

 

ESP8266门禁系统接线步骤如下: 1. **电源连接**: -ESP8266的VCC引脚连接到5V电源正极。 -ESP8266的GND引脚连接到电源负极。 2. **继电器模块连接**: - 将继电器模块的VCC引脚连接ESP8266的3.3V引脚。 - 将继电器模块的GND引脚连接ESP8266的GND引脚。 - 将继电器模块的控制引脚连接ESP8266的一个GPIO引脚(例如GPIO5)。 3. **门锁连接**: - 将门锁的正极连接到继电器模块的常开(NO)引脚。 - 将门锁的负极连接到电源负极。 4. **RFID读卡器连接**(如果使用): -RFID读卡器的VCC引脚连接ESP8266的3.3V引脚。 -RFID读卡器的GND引脚连接ESP8266的GND引脚。 -RFID读卡器的TX引脚连接ESP8266的RX引脚(例如GPIO3)。 -RFID读卡器的RX引脚连接ESP8266的TX引脚(例如GPIO1)。 5. **LED指示灯连接**(可选): - 将LED的正极通过一个限流电阻(例如220Ω)连接ESP8266的一个GPIO引脚(例如GPIO4)。 - 将LED的负极连接ESP8266的GND引脚。 6. **蜂鸣器连接**(可选): - 将蜂鸣器的正极通过一个限流电阻连接ESP8266的一个GPIO引脚(例如GPIO12)。 - 将蜂鸣器的负极连接ESP8266的GND引脚。 7. **按钮连接**(可选): - 将按钮的一端连接ESP8266的一个GPIO引脚(例如GPIO14)。 - 将按钮的另一端连接ESP8266的GND引脚。 完成以上接线后,确保所有连接稳固,然后可以通过编写相应的代码来实现门禁系统的功能。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三天不洗头

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值