Created
December 1, 2017 01:11
-
-
Save mosluce/8bbeb0f2ce96623d696a464e2f73319a to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <SPI.h> | |
#include <MFRC522.h> // 引用程式庫 | |
#define RST_PIN A0 // 讀卡機的重置腳位 | |
#define SS_PIN 10 // 晶片選擇腳位 | |
#define BUZZ_PIN 8 // 蜂鳴器腳位 | |
MFRC522 mfrc522(SS_PIN, RST_PIN); // 建立MFRC522物件 | |
MFRC522::MIFARE_Key key; // 儲存金鑰 | |
MFRC522::StatusCode status; | |
byte sector = 15; // 指定讀寫的「區段」,可能值:0~15 | |
byte block = 1; // 指定讀寫的「區塊」,可能值:0~3 | |
void setup() { | |
Serial.begin(9600); | |
pinMode(BUZZ_PIN, OUTPUT); | |
SPI.begin(); | |
mfrc522.PCD_Init(); // 初始化MFRC522讀卡機模組 | |
// 準備金鑰(用於key A和key B),出廠預設為6組 0xFF。 | |
for (byte i = 0; i < 6; i++) { | |
key.keyByte[i] = 0xFF; | |
} | |
} | |
void readBlock(byte _sector, byte _block, byte _blockData[]) { | |
byte blockNum = _sector * 4 + _block; // 計算區塊的實際編號(0~63) | |
byte trailerBlock = _sector * 4 + 3; // 控制區塊編號 | |
// 驗證金鑰 | |
status = (MFRC522::StatusCode) mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, trailerBlock, &key, &(mfrc522.uid)); | |
// 若未通過驗證… | |
if (status != MFRC522::STATUS_OK) { | |
// 顯示錯誤訊息 | |
Serial.print(F("PCD_Authenticate() failed: ")); | |
Serial.println(mfrc522.GetStatusCodeName(status)); | |
return; | |
} | |
byte buffersize = 18; | |
status = (MFRC522::StatusCode) mfrc522.MIFARE_Read(blockNum, _blockData, &buffersize); | |
// 若讀取不成功… | |
if (status != MFRC522::STATUS_OK) { | |
// 顯示錯誤訊息 | |
Serial.print(F("MIFARE_read() failed: ")); | |
Serial.println(mfrc522.GetStatusCodeName(status)); | |
return; | |
} | |
// 顯示「讀取成功!」 | |
Serial.println(F("Data was read.")); | |
} | |
void loop() { | |
// 確認是否有新卡片 | |
if (mfrc522.PICC_IsNewCardPresent() && mfrc522.PICC_ReadCardSerial()) { | |
byte *id = mfrc522.uid.uidByte; // 取得卡片的UID | |
byte idSize = mfrc522.uid.size; // 取得UID的長度 | |
// 根據卡片回應的SAK值(mfrc522.uid.sak)判斷卡片類型 | |
MFRC522::PICC_Type piccType = mfrc522.PICC_GetType(mfrc522.uid.sak); | |
// 暫存讀取區塊內容的陣列,MIFARE_Read()方法要求至少要18位元組空間,來存放16位元組。 | |
byte buffer[18]; | |
readBlock(sector, block, buffer); | |
// char cbuffer [16]; | |
// for (byte i=0; i<16; i++) { | |
// cbuffer[i] = (char)buffer[i]; | |
// } | |
// Serial.println(cbuffer); | |
tone(BUZZ_PIN, 1500, 100); | |
mfrc522.PICC_HaltA(); // 讓卡片進入停止模式 | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment