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]; 

  }

}