该系统模块主要由RFID模块+WIFI模块+振动传感器+有源蜂鸣器+舵机+Arduino UNO R3组成的门禁系统模块。这里使用舵机充当门锁,用户可以刷卡开门,也可以通过APP控制舵机状态达到开门的效果。若有不法分子想要强行进入室内,对门进行撞击或者人为的破坏,振动传感器检测到有一定强度的震感时会触发有源蜂鸣器发出警报。
一、设备准备
Arduino UNO R3
RFID模块
有源蜂鸣器
振动传感器
舵机
WIFI模块
二、设备连接
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模块所组成的网络,
,进行连接。
APP下载路径,打开下载安装好的手机APP
之后,点击右上角的连接
连接成功之后,即可点击 开锁(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文件夹下
五、视频效果演示
基于Arduino UNO R3开发板的安全检测系统的实现---RFID门禁系统APP控制