实验6——RFID单模块实验

实验六:RFID单模块实验

一、实验目的

通过ML-RC522读取S50IC卡的用户身份证明信息使用SPI通信协议传送给ESP32,ESP32接受到信息后与自身设定的可用的用户身份证明信息进行对比,并显示是否验证通过。
##二、实验内容

1.连接ESP32和ML-RC522的引脚
2.将程序上传到ESP32
3.使用ML-RC522读取S50的用户身份证明并打印验证信息
##三、实验设备

ML-RC522 RFID模块
S50 异性IC卡
ESP32开发板
杜邦线
##四、实验步骤

1)连接引脚

RC522:

RC522的引脚:
实验6——RFID单模块实验_第1张图片
引脚依次为:SDA SCK MOSI MISO SCL GND RST 3.3V

ESP32:

ESP32的引脚图:

连接:

将RC522与ESP32上对应的引脚连接:
实验6——RFID单模块实验_第2张图片

2)上传程序

程序中需要MFRC522的库,在arduino上方工具->管理库中搜索MFRC522下载库

#include <SPI.h>
#include <MFRC522.h> 
#define SS_PIN 21  //定义RC522的SDA引脚的接线位置。
#define RST_PIN 22  //定义RC522的RST引脚的接线位置。

struct RFIDTag {  //Tag标签结构体
  uint8_t uid[4];
  char *name;
};
MFRC522 rfid(SS_PIN, RST_PIN); //实例化类 

struct RFIDTag tags[20] = {  // 初始化结构资料,请自行修改RFID识别码
  {{233, 232, 210, 126}, "Mini_Tag"},
  {{0, 0, 0, 0}, "Mini_Tag1"}, 
  {{1, 1, 1, 1}, "Mini_Tag2"}, 
};
byte totalTags = sizeof(tags) / sizeof(RFIDTag);  //计算结构资料的数量
bool foundTag; //匹配标签
void setup() { 
  Serial.begin(115200);
  SPI.begin(); // 初始化SPI总线
  rfid.PCD_Init(); // 初始化 MFRC522 
}
void loop() {
  // 找卡
  if ( ! rfid.PICC_IsNewCardPresent())
    return;
  // 验证NUID是否可读
  if ( ! rfid.PICC_ReadCardSerial())
    return;
  MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak);
  // 检查是否MIFARE卡类型
  if (piccType != MFRC522::PICC_TYPE_MIFARE_MINI &&  
    piccType != MFRC522::PICC_TYPE_MIFARE_1K &&
    piccType != MFRC522::PICC_TYPE_MIFARE_4K) {
    Serial.println("不支持读取此卡类型");
    return;
  }   
  Serial.print("十进制UID:");
  printDec(rfid.uid.uidByte, rfid.uid.size);
  Serial.println();
  byte *id = rfid.uid.uidByte;   // 取得卡片的UID
  byte idSize = rfid.uid.size;   // 取得UID的長度
  //对读取的卡号进行比较,注意数据类型。
  for (byte i = 0; i < totalTags; i++) {
    if (memcmp(tags[i].uid, id, idSize) == 0) {  // 比对阵列资料值
          Serial.println(tags[i].name);  //显示标签名字
          foundTag = true;
          break;
      }
     if(i==totalTags-1){
        Serial.println("验证失败");  
     }
   }
  
    // 使放置在读卡区的IC卡进入休眠状态,不再重复读卡
    rfid.PICC_HaltA();
    // 停止读卡模块编码
    rfid.PCD_StopCrypto1();
}
 
void printDec(byte *buffer, byte bufferSize) {
  for (byte i = 0; i < bufferSize; i++){
    //Serial.print(buffer[i] < 0x10 ? " 0" : "");
    Serial.print(buffer[i]);
    Serial.print(" ");
  }
}

3)读取S50信息并验证

将注册过的标签接近ML-RC522串口监视器打印验证结果,显示卡片名字。
若为其他卡片,则显示"验证失败"。
实验6——RFID单模块实验_第3张图片

五、其他问题

你可能感兴趣的:(实验6——RFID单模块实验)