ESP8266+RC522实现刷卡控制LED(门禁),BlinkerAPP控制,小爱同学

文章介绍了如何在Arduino平台上利用MFRC522RFID读卡模块实现RFID门禁系统,配合Blinker库进行WiFi连接和小爱同学控制,当RFID匹配时自动开门。

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

RC522接线图

#include <EEPROM.h>
#include <SPI.h>
#include <MFRC522.h>
#include <Servo.h>

#define BLINKER_WIFI
#define BLINKER_MIOT_LIGHT//小爱同学,灯
#include <Blinker.h>

char auth[] = "秘钥";
char ssid[] = "WIFI_name";
char pswd[] = "password";

// 新建组件对象,名称与APP中一致
BlinkerButton Button1("opendoor");

#define RST_PIN 5 // 配置针脚
#define SS_PIN 4  
MFRC522 mfrc522(SS_PIN, RST_PIN); // 创建新的RFID实例

Servo Servol;//电机
int open_angle = 90;
int rst_angle = 45;

//使用union结构,合并4个byte数据,转换为1个long
union long_byte{  long long_data;  byte byte_data[4];};
long_byte lb;

//保存的RFID信息
long password[] = {111111111,-100000001};
//根据需求自己添加or改写


int len = sizeof(password)/sizeof(password[0]);
long read_RFID = -1;  //储存读取到的RFID

///////////////////////////////////////////////////////////////////// //功 能:寻卡 //参数说明: req_code[IN]:寻卡方式 // 0x52 = 寻感应区内所有符合14443A标准的卡 // 0x26 = 寻未进入休眠状态的卡 // pTagType[OUT]:卡片类型代码 // 0x4400 = Mifare_UltraLight // 0x0400 = Mifare_One(S50) // 0x0200 = Mifare_One(S70) // 0x0800 = Mifare_Pro(X) // 0x4403 = Mifare_DESFire //返 回: 成功返回MI_OK ///////////////////////////////////////////////////////////////////// signed char PcdRequest(unsigned char req_code,unsigned char *pTagType) { signed char status; unsigned int unLen; unsigned char ucComMF522Buf[MAXRLEN]; ClearBitMask(Status2Reg,0x08); WriteRawRC(BitFramingReg,0x07); SetBitMask(TxControlReg,0x03); ucComMF522Buf[0] = req_code; status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,1,ucComMF522Buf,&unLen;); if ((status == MI_OK) && (unLen == 0x10)) { *pTagType = ucComMF522Buf[0]; *(pTagType+1) = ucComMF522Buf[1]; } else { status = MI_ERR; } return status; } ///////////////////////////////////////////////////////////////////// //功 能:防冲撞 //参数说明: pSnr[OUT]:卡片序列号,4字节 //返 回: 成功返回MI_OK ///////////////////////////////////////////////////////////////////// signed char PcdAnticoll(unsigned char *pSnr) { signed char status; unsigned char i,snr_check=0; unsigned int unLen; unsigned char ucComMF522Buf[MAXRLEN]; ClearBitMask(Status2Reg,0x08); WriteRawRC(BitFramingReg,0x00); ClearBitMask(CollReg,0x80); ucComMF522Buf[0] = PICC_ANTICOLL1; ucComMF522Buf[1] = 0x20; status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,2,ucComMF522Buf,&unLen;); if (status == MI_OK) { for (i=0; i<4; i++) { *(pSnr+i) = ucComMF522Buf[i]; snr_check ^= ucComMF522Buf[i]; } if (snr_check != ucComMF522Buf[i]) { status = MI_ERR; } } SetBitMask(CollReg,0x80); return status; } ///////////////////////////////////////////////////////////////////// //功 能:选定卡片 //参数说明: pSnr[IN]:卡片序列号,4字节 //返 回: 成功返回MI_OK ///////////////////////////////////////////////////////////////////// signed char PcdSelect(unsigned char *pSnr) { signed char status; unsigned char i; unsigned int unLen; unsigned char ucComMF522Buf[MAXRLEN]; ucComMF522Buf[0] = PICC_ANTICOLL1; ucComMF522Buf[1] = 0x70; ucComMF522Buf[6] = 0; for (i=0; i<4; i++) { ucComMF522Buf[i+2] = *(pSnr+i); ucComMF522Buf[6] ^= *(pSnr+i); } CalulateCRC(ucComMF522Buf,7,&ucComMF522Buf;[7]); ClearBitMask(Status2Reg,0x08); status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,9,ucComMF522Buf,&unLen;); if ((status == MI_OK) && (unLen == 0x18)) { status = MI_OK; } else { status = MI_ERR; } return status; } ///////////////////////////////////////////////////////////////////// //功 能:验证卡片密码 //参数说明: auth_mode[IN]: 密码验证模式 // 0x60 = 验证A密钥 // 0x61 = 验证B密钥 // addr[IN]:块地址 // pKey[IN]:密码 // pSnr[IN]:卡片序列号,4字节 //返 回: 成功返回MI_OK ///////////////////////////////////////////////////////////////////// signed char PcdAuthState(unsigned char auth_mode,unsigned char addr,unsigned char *pKey,unsigned char *pSnr) { signed char status; unsigned int unLen; unsigned char i,ucComMF522Buf[MAXRLEN]; ucComMF522Buf[0] = auth_mode; ucComMF522Buf[1] = addr; for (i=0; i<6; i++) { ucComMF522Buf[i+2] = *(pKey+i); } for (i=0; i<6; i++) { ucComMF522Buf[i+8] = *(pSnr+i); } // memcpy(&ucComMF522Buf;[2], pKey, 6); // memcpy(&ucComMF522Buf;[8], pSnr, 4); status = PcdComMF522(PCD_AUTHENT,ucComMF522Buf,12,ucComMF522Buf,&unLen;); if ((status != MI_OK) || (!(ReadRawRC(Status2Reg) & 0x08))) { status = MI_ERR; } return status; }
ESP32是一款基于微控制器的开发板,它集成了Wi-Fi和蓝牙功能,并且可以方便地集成RFID模块RC522进行数据读写。RC522是一种常用的RFID模块,常用于门禁系统、库存管理等应用。 在ESP32上编写一个基于RC522控制程序,通常会包括以下几个步骤: 1. **硬件连接**:将RC522模块的SPI接口接到ESP32的对应引脚,例如MOSI、MISO、SCK、CS(Chip Select)线。 2. **库安装**:需要安装支持RC522通信的库,如`arduino-rc522`或`RFIDlib`。通过Arduino IDE或Espressif IDF环境进行安装。 3. **初始化模块**:在程序开始时,先对RC522模块进行初始化设置,配置工作模式和数据传输。 4. **读写操作**:编写函数来读取卡片信息(如果卡片靠近读卡器),或者向卡片写入数据。使用RC522提供的API进行这些操作。 5. **事件处理**:监听RC522的状态变化,比如卡片插入、刷卡成功等,然后根据需求进行相应的处理。 6. **错误处理**:考虑可能出现的各种错误情况,如模块未找到、通信失败等,做好异常处理。 示例代码片段(简化版): ```cpp #include <RFIDlib.h> RFID rfid(RFID::SPI, CS_PIN); // 设置RC522的SPI引脚和CS引脚 void setup() { Serial.begin(9600); if (!rfid.init()) { Serial.println("RFID initialization failed"); return; } } void loop() { RFID::Card card = rfid.read(); if (card) { Serial.print("Tag UID: "); for (uint8_t i = 0; i < card.uid.size(); i++) { Serial.print(card.uid[i], HEX); if (i < card.uid.size() - 1) { Serial.print(","); } } Serial.println(); } } ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值