主要由系统模块组成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 0MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance.MFRC522::MIFARE_Key key;int comdata;Servo myservo; //定义舵机对象myservoboolean g_boolSuccess = false; //刷卡成功标识 /*通信协议*/int incomingByte = 0; // 接收到的 data byteString 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站