原理及准备工作请参考文档:
禾灮: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