該系統模塊主要由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 0MFRC522 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);//延時100digitalWrite(Beep_Pin, HIGH); //關閉蜂鳴器 delay(100);//延時100}
}void Beep_Fail() //刷卡失敗鈴聲
{digitalWrite(Beep_Pin, LOW); //打開蜂鳴器delay(1500);//延時1500digitalWrite(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 inputwhile (!Serial); // 如果沒有打開串行端口,就什么也不做(添加基于ATMEGA32U4的Arduinos)SPI.begin(); //初始化SPImfrc522.PCD_Init(); // 初始化 MFRC522myservo.attach(Servo_Pin); //設置舵機控制引腳為3myservo.write(0); //初始化舵機位置0digitalWrite(Beep_Pin, HIGH); //關閉蜂鳴器
}void loop() { val = digitalRead(vibswPin); //read the value from vibration switchSerial.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); // 延時3000msmyservo.write(0);//舵機旋轉至0度}delay(100);}/* 尋找新的卡片*/if ( ! mfrc522.PICC_IsNewCardPresent())return;/* 選擇一張卡片*/if ( ! mfrc522.PICC_ReadCardSerial())return;/* 顯示PICC的信息,將卡的信息寫入temp */ String temp,str; //定義字符串temp,strfor (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); // 延時3000msmyservo.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站