该系统模块主要由RFID模块+WIFI模块+振动传感器+有源蜂鸣器+舵机+Arduino UNO R3组成的门禁系统模块。这里使用舵机充当门锁,用户可以刷卡开门,也可以通过APP控制舵机状态达到开门的效果。若有不法分子想要强行进入室内,对门进行撞击或者人为的破坏,振动传感器检测到有一定强度的震感时会触发有源蜂鸣器发出警报。

一、设备准备

Arduino UNO R3

RFID ACCESS CONTROL门禁_初始化


RFID模块

RFID ACCESS CONTROL门禁_舵机_02


有源蜂鸣器

RFID ACCESS CONTROL门禁_舵机_03


振动传感器

RFID ACCESS CONTROL门禁_初始化_04


舵机

RFID ACCESS CONTROL门禁_初始化_05


WIFI模块

RFID ACCESS CONTROL门禁_初始化_06

二、设备连接

RFID模块

RFID读卡器

Arduino UNO R3

3.3V

3.3V

RST

P9

GND

GND

MISO

P12

MOSI

P11

SCK

P13

SDA

P10

有源蜂鸣器

有源蜂鸣器

Arduino UNO R3

VCC

5V

GND

GND

I/O

P7

振动传感器

振动传感器

Arduino UNO R3

VCC

5V

GND

GND

DO

P8

舵机模块

舵机

Arduino UNO R3

黄线

P6

灰线

GND

红线

5V

WIFI模块(局域模式)

WIFI模块

Arduino UNO R3

RX

TX

TX

RX

GND

GND

5V

5V

三、配置网络

将代码下载到Arduino UNO R3开发板上

WIFI模块需要调节到局域模式,此时打开手机wifi热点,即可检测到WiFi模块所组成的网络,

RFID ACCESS CONTROL门禁_arduino_07

,进行连接。

APP下载路径,打开下载安装好的手机APP

RFID ACCESS CONTROL门禁_舵机_08


之后,点击右上角的连接

RFID ACCESS CONTROL门禁_R3_09


连接成功之后,即可点击 开锁(49) 对舵机进行控制,此时就可以APP控制开门了。

四、完整代码

#include <SPI.h> //RFID库文件  
#include <MFRC522.h>//RFID库文件
#include <Servo.h>  //Arduino IDE自带的舵机库文件

String CardInfo[4][2] ={
    {"f32f3a1c", "yanyu"},
    {"43855194", "beyond"}
};//这里的卡片信息通过Serial.print("Card:" + temp + "\n");进行串口显示,将自己的卡片信息进行修改即可
int MaxNum = 4; //这里存储最大的卡信息数与上面数组保持一致.


#define Servo_Pin       6      //模拟开门
#define Beep_Pin        7      //蜂鸣器成功提示


#define RST_PIN         9      // RFID 的RST引脚
#define SS_PIN          10     // RFID 的SDA(SS)引脚

const int vibswPin = 8; //震动传感器
int val = 0; //initialize the variable val as 0

MFRC522 mfrc522(SS_PIN, RST_PIN);   // Create MFRC522 instance.

MFRC522::MIFARE_Key key;
int comdata;
Servo myservo;      //定义舵机对象myservo
boolean g_boolSuccess = false; //刷卡成功标识 
/*通信协议*/
int incomingByte = 0;       // 接收到的 data byte
String inputString = "";         // 用来储存接收到的内容
boolean newLineReceived = false; // 前一次数据结束标志
boolean startBit  = false;  //协议开始标志
String returntemp = ""; //存储返回值 

void Beep_Success()         //刷卡成功铃声
{
  for(int i = 0; i < 3; i++)  //鸣叫三次
  {
    digitalWrite(Beep_Pin, LOW); //打开蜂鸣器
    delay(100);//延时100
    digitalWrite(Beep_Pin, HIGH); //关闭蜂鸣器  
    delay(100);//延时100
  }
}

void Beep_Fail()  //刷卡失败铃声
{

    digitalWrite(Beep_Pin, LOW); //打开蜂鸣器
    delay(1500);//延时1500
    digitalWrite(Beep_Pin, HIGH); //关闭蜂鸣器  
}

void setup() 
{
    Serial.begin(9600); //波特率9600 (Wifi通讯设定波特率)
    pinMode(Servo_Pin, OUTPUT);  //初始化舵机为输出模式
    pinMode(Beep_Pin, OUTPUT); //初始化蜂鸣器为输出模式    
    
    pinMode(vibswPin,INPUT); //initialize vibration switch as an input
       
    while (!Serial);    // 如果没有打开串行端口,就什么也不做(添加基于ATMEGA32U4的Arduinos)
    SPI.begin();        //初始化SPI
    mfrc522.PCD_Init(); // 初始化 MFRC522
    myservo.attach(Servo_Pin);    //设置舵机控制引脚为3
    myservo.write(0);    //初始化舵机位置0
    digitalWrite(Beep_Pin, HIGH); //关闭蜂鸣器  
}

void loop() {  
    val = digitalRead(vibswPin); //read the value from vibration switch
    Serial.println(val);
    if(val == 1)  //without vibration signal
      {
        digitalWrite(Beep_Pin,LOW);
        delay(2000);
      }
      else
      {
        digitalWrite(Beep_Pin,HIGH);
        delay(2000);
      }
    while (Serial.available())
    {
      comdata= Serial.read();
      if(comdata==49)
      {
        Serial.print("open the door\n");
        Beep_Success();//刷卡成功铃声
        myservo.write(90); //舵机旋转至90度
        delay(3000);      // 延时3000ms
        myservo.write(0);//舵机旋转至0度
      }
      delay(100);
    }

    /* 寻找新的卡片*/
    if ( ! mfrc522.PICC_IsNewCardPresent())
        return;
    /* 选择一张卡片*/
    if ( ! mfrc522.PICC_ReadCardSerial())
        return;
     /* 显示PICC的信息,将卡的信息写入temp */ 
    String temp,str;  //定义字符串temp,str
    for (byte i = 0; i < mfrc522.uid.size; i++)
    {
        str = String(mfrc522.uid.uidByte[i], HEX);    // 将数据转换成16进制的字符 
        if(str.length() == 1) //保证str的长度有两位
        {
          str = "0" + str;
        }
        temp += str; //将字符str放入temp       
    }
    Serial.print("Card:" + temp + "\n");  //这里打开可以查看实际的卡,方便填写数组
    /* 将temp的信息与存储的卡信息库CardInfo[4][2]进行比对*/
    for(int i = 0; i < MaxNum; i++)
    {
        if(CardInfo[i][0] == temp) //如果在CardInfo[i][0]中比对到卡片的信息
        {
          //Serial.print(CardInfo[i][1] + " Open door!\n");
          Serial.print("$RFID-" + CardInfo[i][0] + "-" + CardInfo[i][1] + "-1-0#"); //将卡的信息打印到串口
          g_boolSuccess = true;  //刷卡成功标识
        }
    }
    if(g_boolSuccess == true) //如果刷卡成功
    {
        Beep_Success();//刷卡成功铃声
        myservo.write(90); //舵机旋转至90度
        delay(3000);      // 延时3000ms
        myservo.write(0);//舵机旋转至0度
    }
    else//刷卡失败
    {
        Beep_Fail();//刷卡失败铃声
    }
    g_boolSuccess = false;//刷卡失败标识
    mfrc522.PICC_HaltA();      //停止读写
    mfrc522.PCD_StopCrypto1(); //  停止向PCD加密
}


void serialEvent()
{
  while (Serial.available())                    //如果串口接收到数据则进入循环
  {    
    incomingByte = Serial.read();              //一个字节一个字节地读,下一句是读到的放入字符串数组中组成一个完成的数据包
    if(incomingByte == '$')                     //如果到来的字节是'$',开始读取 
    {
      startBit= true;
    }
    if(startBit == true)
    {
       inputString += (char) incomingByte;     // 全双工串口可以不用在下面加延时,半双工则要加的//
    }  
    if (incomingByte == '^') 
    {
       newLineReceived = true;                 //如果到来的字节是'#',读取结束
       startBit = false;
    }
  }
}

RFID所需库文件 将下载好的压缩包解压,把文件RC522复制到你的编译器Arduino的libraries文件夹下

RFID ACCESS CONTROL门禁_arduino_10

五、视频效果演示

基于Arduino UNO R3开发板的安全检测系统的实现---RFID门禁系统APP控制