基于Arduino RFID门禁系统
介绍
射频识别或RFID(Radio-Frequency Identification)是一种通过无线电信号进行自动识别,通过RFID标签检索和存储数据的方法。
这些 RFID 标签可以贴在动物、物体上。因此,这些标签具有许多应用,例如贴在车辆上的不停车标签、动物识别。有 3 种类型的 RFID 标签:无源标签是对发射器发送的信号做出响应的标签、半无源标签和本身发射信号的有源标签。目前有几种方法可以控制对某个位置的访问:使用指纹、带密码的键盘以及使用 RFID 系统。
在本文中,我们将学习如何使用 RFID 技术开发门禁系统。该系统将包括 MFRC522 RFID 模块、用于开门的伺服电机、作为系统 HMI 的显示器以及信号 LED。因此在本文中,我们将学习如何使用 RFID 模块开发访问控制。
因此,通过本文您将了解到:
在面包板板上进行电路组装;
了解RFID模块的功能;
伺服电机启动;
在液晶显示屏上显示字符。
现在,我们将开始使用RFID模块开发停车场门禁系统项目的完整介绍。使用带 Arduino 的 RFID 模块开发停车场门禁系统
该项目的核心是 RFID 模块,它由带有 MFRC522 集成电路的印刷电路板和电路板上的天线组成。当电路板通电时,模块会发出射频信号,当标签接近模块时,标签就会被读取,每个标签都有不同的代码。该模块由 3.3 V 供电,它使用 SPI(串行外设接口)通信与所使用的微控制器进行通信。
开发这个项目的第一步是组装图 1 中的电路。
路的操作非常简单!伺服电机用作打开和关闭门的机制。每次标签被 RFID 模块识别时,Arduino 都会发送信息以激活或关闭门。LCD用作与用户的通信接口。接下来,我们将了解该项目的编程逻辑是如何工作的。
Arduino停车系统控制的代码逻辑
要对 Arduino Nano 进行编程,我们需要以下库:
SPI -包含执行 SPI 通信所需功能的库。
MFRC522 -包含与 RFID 模块通信的必要函数的库。
Servo -包含启动伺服电机的必要函数的库。
Wire -包含与 LCD 显示器进行 I2C 通信所需功能的库。
Arduino IDE 中未安装 liquidCrystal_I2C 和 MFRC522 库,因此我们必须安装它们。安装库后,关闭 Arduino IDE 并再次打开它。完整代码如下所示。
/* * Teste Leitor RFID * tag 1 F1 B103 1F 241 17703 31
F1 B1 03 1F
tag 2 14 45 29 57 20 69 41 87
14 45 29 57
*/
#include <SPI.h>
#include <MFRC522.h>
#include <Servo.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
Servo myservo ;
LiquidCrystal_I2C lcd (0x27,2,1,0,4,5,6,7,3,POSITIVE);
#define vermelho 4
#define verde 5
#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522 (SS_PIN, RST_PIN);
void setup() { Wire.begin();
lcd.begin(16,2); lcd.setBacklight(HIGH); lcd.setCursor(0,0); lcd.print("Aproxime a sua "); lcd.setCursor(0,1); lcd.print("tag do leitor "); pinMode(verde,OUTPUT); pinMode(vermelho,OUTPUT); Serial.begin(9600); SPI.begin(); Serial.println("Aproxime a tag do leitor "); mfrc522.PCD_Init(); digitalWrite(verde,0); digitalWrite(vermelho,0); myservo.attach(6); }
void loop() { if(!mfrc522.PICC_IsNewCardPresent()) { return; } if(!mfrc522.PICC_ReadCardSerial()) { return; }
Serial.print(" UID da tag : "); String conteudo = ""; byte letra; for (byte i = 0; i< mfrc522.uid.size; i++) { Serial.print(mfrc522.uid.uidByte[i] <0x10 ? "0":" "); Serial.print(mfrc522.uid.uidByte[i], HEX); conteudo.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ")); conteudo.concat(String(mfrc522.uid.uidByte[i], HEX)); } Serial.println(); Serial.print("Mensagem : "); conteudo.toUpperCase(); if(conteudo.substring(1) == "14 45 29 57") { lcd.clear(); Serial.println("Acesso liberado "); lcd.setBacklight(HIGH); lcd.setCursor(0,0); lcd.print("Ola !"); lcd.setCursor(0,1); lcd.print("Acesso liberado"); digitalWrite(verde,1); digitalWrite(vermelho,0); myservo.write(95); delay(800); myservo.write(10); digitalWrite(verde,0); digitalWrite(vermelho,1); } if(conteudo.substring(1) == "F1 B1 03 1F") { lcd.clear(); Serial.println("Acesso negado "); digitalWrite(verde,0); digitalWrite(vermelho,1); lcd.setBacklight(HIGH); lcd.setCursor(0,0); lcd.print("Erro ! Tag nao "); lcd.setCursor(0,1); lcd.print("autorizada "); } delay(1000); lcd.clear(); lcd.setBacklight(HIGH); lcd.setCursor(0,0); lcd.print("Aproxime a sua "); lcd.setCursor(0,1); lcd.print("tag do leitor ");
}
下面,我们将解释这个项目的完整逻辑。您需要做的第一件事是声明项目中使用的组件的所有库。
#include <SPI.h>
#include <MFRC522.h>
#include <Servo.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
之后,我们声明伺服电机和LCD的对象。对象的创建如下所示。
Servo myservo;
LiquidCrystal_I2C lcd (0x27,2,1,0,4,5,6,7,3,POSITIVE);
MFRC522 mfrc522 (SS_PIN, RST_PIN);
现在,我们有了 Arduino 上连接引脚的映射。
#define vermelho 4
#define verde 5
#define SS_PIN 10
#define RST_PIN 9
下面是 void 设置函数。它初始化I2C串行通信,串行通信,将引脚配置为输出,以及连接伺服电机的引脚。
void setup() {
Wire.begin();
lcd.begin(16,2); lcd.setBacklight(HIGH); lcd.setCursor(0,0); lcd.print("Aproxime a sua "); lcd.setCursor(0,1); lcd.print("tag do leitor "); pinMode(verde,OUTPUT); pinMode(vermelho,OUTPUT); Serial.begin(9600); SPI.begin(); Serial.println("Aproxime a tag do leitor "); mfrc522.PCD_Init(); digitalWrite(verde,0); digitalWrite(vermelho,0); myservo.attach(6); }
现在让我们了解完整的编程逻辑是如何工作的,它是在 void 循环函数中实现的。请参阅下面的无效循环代码。
void loop() { if(!mfrc522.PICC_IsNewCardPresent()) { return; } if(!mfrc522.PICC_ReadCardSerial()) { return; }
Serial.print(" UID da tag : "); String conteudo = ""; byte letra; for (byte i = 0; i< mfrc522.uid.size; i++) { Serial.print(mfrc522.uid.uidByte[i] <0x10 ? "0":" "); Serial.print(mfrc522.uid.uidByte[i], HEX); conteudo.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ")); conteudo.concat(String(mfrc522.uid.uidByte[i], HEX)); } Serial.println(); Serial.print("Mensagem : "); conteudo.toUpperCase(); if(conteudo.substring(1) == "14 45 29 57") { lcd.clear(); Serial.println("Acesso liberado "); lcd.setBacklight(HIGH); lcd.setCursor(0,0); lcd.print("Ola !"); lcd.setCursor(0,1); lcd.print("Acesso liberado"); digitalWrite(verde,1); digitalWrite(vermelho,0); myservo.write(95); delay(800); myservo.write(10); digitalWrite(verde,0); digitalWrite(vermelho,1); } if(conteudo.substring(1) == "F1 B1 03 1F") { lcd.clear(); Serial.println("Acesso negado "); digitalWrite(verde,0); digitalWrite(vermelho,1); lcd.setBacklight(HIGH); lcd.setCursor(0,0); lcd.print("Erro ! Tag nao "); lcd.setCursor(0,1); lcd.print("autorizada "); } delay(1000); lcd.clear(); lcd.setBacklight(HIGH); lcd.setCursor(0,0); lcd.print("Aproxime a sua "); lcd.setCursor(0,1); lcd.print("tag do leitor ");
}
您应该做的第一件事是检查没有检测到标签,也没有读取标签。代码如下所示。
if(!mfrc522.PICC_IsNewCardPresent()) { return; } if(!mfrc522.PICC_ReadCardSerial()) { return; }
之后,系统读取标签并将其值显示在 IDE Arduino 串行监视器上。请参阅下面的代码部分。
Serial.print(" UID da tag : "); String conteudo = ""; byte letra; for (byte i = 0; i< mfrc522.uid.size; i++) { Serial.print(mfrc522.uid.uidByte[i] <0x10 ? "0":" "); Serial.print(mfrc522.uid.uidByte[i], HEX); conteudo.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ")); conteudo.concat(String(mfrc522.uid.uidByte[i], HEX)); } Serial.println(); Serial.print("Mensagem : "); conteudo.toUpperCase();
出示标签代码后,系统将标签值与系统中注册的十六进制值进行比较。
if(conteudo.substring(1) == "14 45 29 57") {
lcd.clear(); Serial.println("Acesso liberado "); lcd.setBacklight(HIGH); lcd.setCursor(0,0); lcd.print("Ola !"); lcd.setCursor(0,1); lcd.print("Acesso liberado"); digitalWrite(verde,1); digitalWrite(vermelho,0); myservo.write(95); delay(800); myservo.write(10); digitalWrite(verde,0); digitalWrite(vermelho,1);
}
如果标签值等于 14 45 29 57,将执行上述条件的命令。在这些命令中,LCD 将打印访问信息并启动伺服电机打开入口门。
如果标签值等于 F1 B1 03 1F 值,代码流进入条件并显示消息“Tag not authorized!” 并且不触发伺服电机释放访问。
代码部分如下所示。
if(conteudo.substring(1) == "F1 B1 03 1F") { lcd.clear(); Serial.println("Acesso negado "); digitalWrite(verde,0); digitalWrite(vermelho,1); lcd.setBacklight(HIGH); lcd.setCursor(0,0); lcd.print("Erro ! Tag nao "); lcd.setCursor(0,1); lcd.print("autorizada "); }
最后,系统清洁 LCD 屏幕并显示信息,让用户将标签靠近 RFID 阅读器。代码区域如下所示。
delay(1000); lcd.clear(); lcd.setBacklight(HIGH); lcd.setCursor(0,0); lcd.print("Aproxime a sua "); lcd.setCursor(0,1); lcd.print("tag do leitor ");
现在,我们将在工作台上看到代码与电路一起工作的结果。在对 Arduino Uno 进行编程后,我们将使系统正常工作。在图 2 中,我们有系统的初始消息,要求用户接近标签以释放访问权限。
在图 3 中,我们让用户使用正确的标签来允许访问,然后绿色 LED 亮起并激活伺服电机,访问权限显示在显示屏上。
800 毫秒后,伺服电机返回初始位置,绿色 LED 熄灭,红色 LED 亮起。
在图 4 中,用户使用了一个未注册的标签,因此系统给出了一个错误并且不释放访问权限。
之后,系统重新开始编程逻辑运行周期。
结论和未来的项目改进
使用 RFID 技术的系统应用于多种类型的项目。它们不仅限于控制和访问系统。例如,一个非常常见的应用是用它来识别服装和其他商品的批次。发挥您的创造力,您会发现带有 Arduino 的 RFID 模块适用于您的项目的不同类型的应用程序。将来,我们将使用 Arduino 创建门系统的原型,供您使用激光切割机或 3D 打印机在实践中设置您的停车场。
更多推荐
【基于Arduino RFID门禁系统】
发布评论