主要由系统模块组成RFID模块 WIFI模块 振动传感器 有源蜂鸣器 舵机 Arduino UNO R门禁系统模块由3组成。使用舵机作为门锁,用户可以刷卡或通过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
然后单击右上角的连接 连接成功后,可点击 控制舵机,此时可以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控制
视频链接CSDN 视频链接B站