本网页已闲置超过3分钟,按键盘任意键或点击空白处,即可回到网页

带Arduino的停车门禁系统
发布时间:2021-02-02
分享到:
带Arduino的停车门禁系统
发布时间:2021-02-02
分享到:

您将学习如何使用Arduino创建自己的停车门禁控制系统。

硬件部件:

  • 定制PCB×    1个    
  • Arduino Uno    ×    1个    
  • SparkFun RFID Qwiic套件    ×    1个    
  • SG90微型伺服电机    ×    1个    
  • LED(通用)    ×    2    
  • 面包板(通用)    ×    1个    
  • 跳线(通用)    ×    1个    
  • RGB背光LCD-16x2    ×    1个    

软件应用程序和在线服务:

  • Arduino IDE    

射频识别或RFID(无线电频率识别)是一种通过无线电信号自动识别,通过RFID标签检索和存储数据的方法。

这些RFID标签可以放置在动物,物体上。

因此,这些标签具有许多应用,例如放置在车辆上的不间断标签,动物识别。

RFID标签有3种类型:无源是对发送器发送的信号做出响应的标签,半无源和会发出信号本身的有源标签。

当前,有几种方法可以控制对位置的访问:使用指纹,带密码的小键盘以及使用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模块通信所需功能的库。
  • 伺服-包含启动伺服电动机所需功能的库。
  • 电线-包含与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();
不能在sistema上使用apresentaçãodocódigo标签,请在val上使用十六进制cadastrado no sistema。

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值,则代码流输入条件并显示消息“标签未授权!”。并且不会触发伺服电机释放访问权限。

代码部分如下所示。
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毫秒后,伺服电动机返回初始位置,绿色指示灯熄灭,红色指示灯亮起。

在图4中,用户使用了未注册的标签,因此系统出现错误,并且不释放访问权限。

之后,系统重新启动编程逻辑操作周期。

结论和未来项目改进

使用RFID技术的系统已应用于多种类型的项目。它们不仅限于控制和访问系统。例如,一种非常常见的应用是使用它来识别成批的服装和其他商品。
利用您的创造力,您将通过带有Arduino的RFID模块为您的项目找到不同类型的应用程序。
将来,我们将使用Arduino创建门系统的原型,供您在实际中使用激光切割机或3D打印机设置停车场。

 

加入微信技术交流群

技术交流,职业进阶

关注与非网服务号

获取电子工程师福利

加入电路城 QQ 交流群

与技术大牛交朋友

讨论