零知开源小项目-NFC门禁系统(RC522)

我们时常因为忘带钥匙开不了门而懊恼不已,因此诞生了密码锁,指纹锁,NFC锁等锁具。NFC近场通信技术是我们生活中比较常见的技术,现在我们就利用NFC的身份识别功能结合舵机来制作一个NFC门禁系统。该门禁系统具备以下功能:

身份识别

信息显示

1、材料

零知标准板(点击购买)
MFRC-RC522模块+NFC卡片(点击购买)
SG90舵机(点击购买)
LCD1602液晶显示屏+扩展板(点击购买)
绿色LED灯(点击购买)
220Ω电阻(点击购买)
面包板+若干杜邦线(点击购买)

NFC门禁系统是整合利用我们之前学习过的模块来进行制作的,各个模块的应用请参考:

NFC门禁系统1-LCD1602扩展板的使用(点击跳转)

NFC门禁系统2-RC522模块读NFC卡片(点击跳转)

2、硬件连接

各模块的接线如下图所示:


2、程序

NFC门禁系统主要是依靠NFC模块读取卡片序列号和系统中存储的信息进行比对来完成身份识别的,识别成功后再控制舵机开门以及信息的显示。 定义及初始化代码如下:


											
	#include <SPI.h>
	#include <RFID.h>
	#include <Servo.h>
	#include <LiquidCrystal_I2C.h>
	 
	#define led_pin 0
	#define servo_pin 1
	#define cardNum 2  
	 
	RFID rfid(10,9);  //10 - 读卡器CS引脚、9 - 读卡器RST引脚
	Servo myservo;
	LiquidCrystal_I2C lcd(0x3f,16,2);
	 
	unsigned char card[cardNum][5]={  //存储NFC卡片序列号
	        {0xA6,0xE7,0x28,0xF9,0x90},
	        {0x0E,0xBE,0x45,0x83,0x76},
	};
	 
	void setup()
	{
	        Serial.begin(9600);
	        SPI.begin();
	        lcd.init();
	        rfid.init(); //初始化
	        lcd.backlight();  //打开背光
	        myservo.attach(servo_pin);
	        pinMode(led_pin,OUTPUT);
	        digitalWrite(led_pin,LOW);
	        Serial.println("Ready");
	}
						

MFRC-522模块读取卡片信息:


											
	void readCard()
	{
	        if (rfid.isCard()) {
	                Serial.println("Find the card!");
	                //防冲突检测,读取卡序列号
	                if (rfid.readCardSerial()) {
	                        Serial.print("The card's number is  : ");
	                        //显示卡序列号
	                        for(int i = 0; i < 5; i++){
	                                Serial.print(rfid.serNum[i]);
	                                Serial.print(" ");
	                        }
	                        Serial.println("");
	                }
	                //选卡(锁定卡片,防止多数读取,去掉本行将连续读卡)
	                rfid.selectTag(rfid.serNum);
	        }
	        rfid.halt();  //命令卡片进入休眠状态
	}											
												
					

卡片信息比对:


											
				
	bool isTrue()  //核对信息
	{
	        for(int i=0;i<cardNum;i++)
	        {
	                if(card[i][0]==rfid.serNum[0] && card[i][1]==rfid.serNum[1] && card[i][2]==rfid.serNum[2]
	                        && card[i][3]==rfid.serNum[3] && card[i][4]==rfid.serNum[4])
	                {
	                        return true;
	                }
	        }
	        return false;
	}								
		

loop主函数:


							
	void loop()
	{
	        lcd.setCursor(0,0);
	        lcd.print("Put your card");  //LCD显示信息
	        lcd.setCursor(9,1);
	        lcd.print("on here");
	        readCard();
	         
	        if(isTrue())
	        {
	                Serial.println("True");
	                lcd.clear();
	                lcd.setCursor(0,0);
	                lcd.print("Welcome back");
	                digitalWrite(led_pin,HIGH);
	                myservo.write(180);  //控制舵机开锁
	                delay(5000);
	                lcd.clear();
	                myservo.write(0);  //关锁
	                digitalWrite(led_pin,LOW);
	        }
	         
	        if(rfid.serNum[0]!=NULL && !isTrue())
	        {
	                Serial.println("False");
	                lcd.clear();
	                lcd.setCursor(0,0);
	                lcd.print("Please replace");
	                lcd.setCursor(6,1);
	                lcd.print("your card");
	                delay(2000);
	                lcd.clear();
	        }
	         
	        clearCard();  //清空serNum数组中的数据
	}									
						
		

完整代码:NFC门禁系统.zip(点击下载)