Skip to content

Instantly share code, notes, and snippets.

@mosluce
Created December 1, 2017 01:11
Show Gist options
  • Save mosluce/8bbeb0f2ce96623d696a464e2f73319a to your computer and use it in GitHub Desktop.
Save mosluce/8bbeb0f2ce96623d696a464e2f73319a to your computer and use it in GitHub Desktop.
#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