DIY智能门控——应用篇02:RFID门禁

本文介绍了一种基于MFRC522模块的RFID识别技术实现的智能门禁系统。该系统能够通过读取特定的RFID标签来控制门锁的开启,实现了基本的安全准入功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


原理及准备工作请参考文档:
禾灮:DIY智能门控—入门篇02-基于MFRC522的RFID识别

下面直接贴视频:


源代码:

// Visual Micro is in vMicro>General>Tutorial Mode
// 
/*
Name:       RFID_MenJin.ino
Created:    2018/8/14 8:40:39
Author:     禾灮\HeGuang
*/

// Define User Types below here or use a .h file
//
#include <SPI.h>
#include <MFRC522.h>

// Define Function Prototypes that use User Types below here or use a .h file
//
/* Typical pin layout used:
* -----------------------------------------------------------------------------------------
*             MFRC522      Arduino       Arduino   Arduino    Arduino          Arduino
*             Reader/PCD   Uno/101       Mega      Nano v3    Leonardo/Micro   Pro Micro
* Signal      Pin          Pin           Pin       Pin        Pin              Pin
* -----------------------------------------------------------------------------------------
* RST/Reset   RST          9             5         D9         RESET/ICSP-5     RST
* SPI SS      SDA(SS)      10            53        D10        10               10
* SPI MOSI    MOSI         11 / ICSP-4   51        D11        ICSP-4           16
* SPI MISO    MISO         12 / ICSP-1   50        D12        ICSP-1           14
* SPI SCK     SCK          13 / ICSP-3   52        D13        ICSP-3           15
*/
const int SS_PIN = 10;
const int RST_PIN = 9;
const int Lock = 8;

MFRC522 rfid(SS_PIN, RST_PIN); //实例化类

// 初始化数组用于存储读取到的NUID 
byte nuidPICC[4];
//  存储“钥匙” 
byte ID[3][4] = {{0xAC,0x5F,0x63,0xAD},{0x9C,0x72,0xB,0xA1},{0x32,0xC1,0x56,0xD3}};

void printHex(byte *buffer, byte bufferSize) {
    for (byte i = 0; i < bufferSize; i++) {
        Serial.print(buffer[i] < 0x10 ? " 0" : "");
        Serial.print(buffer[i], HEX);
    }
}

// void printDec(byte *buffer, byte bufferSize) {
    // for (byte i = 0; i < bufferSize; i++) {
        // Serial.print(buffer[i] < 0x10 ? " 0" : "");
        // Serial.print(buffer[i], DEC);
    // }
// }

void OpenLock(byte *buffer, byte bufferSize){
    unsigned int temp = 0;
    for (byte j = 0;j < 4; j++){
        if(buffer[0] == ID[j][0]){
            for (byte i = 1; i < bufferSize; i++) {
                if(buffer[i] == ID[j][i]){
                    temp++;
                }else{
                    temp+=0;
                }
            }
        }
    }
    if(temp == 3){
        Serial.print("识别通过,开锁!");         
        delay(1000);
        digitalWrite(Lock,LOW);
        delay(150);
        digitalWrite(Lock,HIGH);
    }else{
        Serial.print("请换卡!!!");
    }     
}

// The setup() function runs once each time the micro-controller starts
void setup(){
    Serial.begin(9600);
    SPI.begin();      // 初始化SPI总线
    rfid.PCD_Init();  // 初始化 MFRC522 
    pinMode(Lock,OUTPUT);
    digitalWrite(Lock,HIGH);
}

// Add the main program code into the continuous loop() function
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;
    }

    // 将NUID保存到nuidPICC数组
    for (byte i = 0; i < 4; i++) {
        nuidPICC[i] = rfid.uid.uidByte[i];
    }   
    Serial.print("十六进制UID:");
    printHex(rfid.uid.uidByte, rfid.uid.size);
    Serial.println();

    Serial.print("设备状态:");
    OpenLock(rfid.uid.uidByte, rfid.uid.size);
    Serial.println();

    // 使放置在读卡区的IC卡进入休眠状态,不再重复读卡
    rfid.PICC_HaltA();

    // 停止读卡模块编码
    rfid.PCD_StopCrypto1();
}

感谢一直关注着禾灮成长进步的朋友们。你们的信任、支持和鼓励,鞭策着我们一路走到了今天。

感谢所有的合作伙伴,我们相互促进,共同见证了彼此的成长。

感谢所有曾经在禾灮彼此倚靠、相互鼓励、携手同心、砥砺同行的兄弟姐妹。这里承载了我们的青春与热血。

            禾灮,感谢有你。

未来,我们将一如既往,砥砺前行。

                                    禾灮·小楊
                                   2018.08.14
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值