RFID電子晶片門禁所控制
//LCD 設定
#include <Wire.h> // I2C 函式庫
#include <LiquidCrystal_I2C.h> // I2C LCD 函式庫
#define Addr 0x27 // 定義 I2C 位址
LiquidCrystal_I2C LCD(0x27,20,4); // 宣告 LCD 為 20*4
//RFID 設定
#include <SPI.h> //SPI 函式庫
#include <MFRC522.h> //RFID 函式庫
#define RST_PIN 5 //RST 接腳
#define SS_PIN 53 //SS 接腳
MFRC522 mfrc522(SS_PIN, RST_PIN); // 建立 MFRC522 物件,名稱為 mfrc522
byte pass[7]; // 儲存密碼陣列,如晶片碼加常可在此增加陣列值
#define relay 2 // 繼電器接腳
int gen = 3; //正確綠燈
int red = 4; //錯誤紅燈
int bzz = 6; //蜂鳴器
/** 初始值 */
void setup() {
Serial.begin(9600);
pinMode(relay,OUTPUT);
pinMode(gen,OUTPUT);
pinMode(red,OUTPUT);
digitalWrite(relay,HIGH);
LCD.init(); //LCD 初始化
LCD.backlight(); //LCD 背光源
LCD.setCursor(3,0); // 游標移至第 3 行第 0 列位置
LCD.print("==RFID Reader=="); // 在 LCD 裡顯示 ==RFID Reader==
SPI.begin(); //SPI 協定初始化
mfrc522.PCD_Init(); //MFRC522 初始化
digitalWrite(gen,HIGH);
digitalWrite(red,LOW);
}
void loop() {
if ( ! mfrc522.PICC_IsNewCardPresent()) // 測試是否有新卡
return;
if ( ! mfrc522.PICC_ReadCardSerial()) // 測試 RFID 卡是否可讀取
return;
dump_byte_array(mfrc522.uid.uidByte,mfrc522.uid.size);
if(pass[0] == 0x04 && pass[1] == 0x1A && pass[2] == 0x6E && pass[3] == 0x32 && pass[4] == 0xE2 && pass[5] == 0x64 && pass[6] == 0x80 ){ //在此加入正確晶片值
tone(6, 523, 500); // 蜂鳴器0.5秒
delay(200);
digitalWrite(relay,LOW); // 繼電器動作
LCD.setCursor(7,2); // 游標移至第 7 行第 2 列位置
LCD.print("OPEN!"); // 在 LCD 上顯示 OPEN!
digitalWrite(gen,LOW); // 正確時亮綠燈
digitalWrite(red,HIGH);
delay(2000);
digitalWrite(relay,HIGH); // 繼電器復歸
digitalWrite(gen,HIGH);
digitalWrite(red,LOW);
LCD.setCursor(7,2); // 游標移至第 7 行第 2 列位置
LCD.print(" "); // 清除 LCD 上 OPEN! 文字
}
else {
LCD.setCursor(7,2); // 游標移至第 7 行第 2 列位置
LCD.print("Error!"); // 在 LCD 上顯示 Error!
tone(6, 523, 200);
delay(200); // 錯誤時蜂鳴器0.2秒
tone(6, 523, 200);
delay(200);
tone(6, 523, 200);
delay(200);
LCD.setCursor(7,2); // 游標移至第 7 行第 2 列位置
LCD.print(" "); // 清除 LCD 上 Error! 文字
}
delay(1000);
}
void dump_byte_array(byte *buffer, byte bufferSize) {
LCD.setCursor(1,1); // 游標移至第 1 行第 1 列位置
LCD.print("UID:");
for (byte i = 0; i < bufferSize; i++) {
LCD.print(buffer[i] < 0x10 ? " 0" : " ");
LCD.print(buffer[i], HEX);
pass[i] = buffer[i];
}
}