#include <SPI.h>
#include <MFRC522.h>
#include <LedControl.h>
#define RST_PIN 9
#define SS_PIN 10
#define DIN_PIN 2
#define CLK_PIN 4
#define CS_PIN 3
MFRC522 mfrc522(SS_PIN, RST_PIN);
LedControl lc = LedControl(DIN_PIN, CLK_PIN, CS_PIN, 1);
// 定義「+」圖案
byte plusSign[8] = {
B00011000,
B00011000,
B00011000,
B11111111,
B11111111,
B00011000,
B00011000,
B00011000
};
// 0~9, A~F, O, "-" 字型
byte hexDigits[18][8] = {
// 0
{B00111100,B01000010,B10000001,B10000001,B10000001,B10000001,B01000010,B00111100},
// 1
{B00001000,B00011000,B00101000,B00001000,B00001000,B00001000,B00001000,B00111110},
// 2
{B00111100,B01000010,B00000010,B00001100,B00110000,B01000000,B10000000,B11111110},
// 3
{B00111100,B01000010,B00000010,B00011100,B00000010,B00000010,B01000010,B00111100},
// 4
{B00000100,B00001100,B00010100,B00100100,B01000100,B11111110,B00000100,B00000100},
// 5
{B11111110,B10000000,B11111100,B00000010,B00000010,B00000010,B10000010,B01111100},
// 6
{B00111100,B01000000,B10000000,B11111100,B10000010,B10000010,B01000010,B00111100},
// 7
{B11111110,B00000010,B00000100,B00001000,B00010000,B00100000,B01000000,B10000000},
// 8
{B00111100,B01000010,B01000010,B00111100,B01000010,B01000010,B01000010,B00111100},
// 9
{B00111100,B01000010,B01000010,B00111110,B00000010,B00000010,B01000010,B00111100},
// A
{B00111100,B01000010,B01000010,B01111110,B01000010,B01000010,B01000010,B01000010},
// B
{B11111100,B10000010,B10000010,B11111100,B10000010,B10000010,B10000010,B11111100},
// C
{B00111100,B01000010,B10000000,B10000000,B10000000,B10000000,B01000010,B00111100},
// D
{B11111000,B10000100,B10000010,B10000010,B10000010,B10000010,B10000100,B11111000},
// E
{B11111110,B10000000,B10000000,B11111100,B10000000,B10000000,B10000000,B11111110},
// F
{B11111110,B10000000,B10000000,B11111100,B10000000,B10000000,B10000000,B10000000},
// O (字母 O,與數字 0 區分:加斜線)
{B00111100,B01000010,B10000001,B10011001,B10000001,B10000001,B01000010,B00111100},
// "-"
{B00000000,B00000000,B00000000,B11111111,B11111111,B00000000,B00000000,B00000000}
};
void setup() {
Serial.begin(9600);
SPI.begin();
mfrc522.PCD_Init();
lc.shutdown(0, false);
lc.setIntensity(0, 8);
lc.clearDisplay(0);
Serial.println("請將卡片靠近讀卡器...");
}
void loop() {
// 沒有卡片 → 顯示 "+"
if (!mfrc522.PICC_IsNewCardPresent() || !mfrc522.PICC_ReadCardSerial()) {
showPattern(plusSign);
return;
}
// 有卡片 → 轉成十六進位字串,分組加 "-"
String uidStr = "";
for (byte i = 0; i < mfrc522.uid.size; i++) {
if (mfrc522.uid.uidByte[i] < 16) uidStr += "0"; // 補零
uidStr += String(mfrc522.uid.uidByte[i], HEX);
if (i < mfrc522.uid.size - 1) uidStr += "-"; // 加 "-"
}
uidStr.toUpperCase();
Serial.print("卡片 UID (HEX): ");
Serial.println(uidStr);
// 滾動顯示 UID,每字元隔 1 秒
scrollText(uidStr);
mfrc522.PICC_HaltA();
}
// 顯示單一 HEX 字元或 "-"
void showHexChar(char c) {
int index;
if (c >= '0' && c <= '9') index = c - '0';
else if (c >= 'A' && c <= 'F') index = 10 + (c - 'A');
else if (c == 'O') index = 16; // 特別處理字母 O
else if (c == '-') index = 17;
else return;
for (int row = 0; row < 8; row++) {
lc.setRow(0, row, hexDigits[index][row]);
}
}
// 顯示圖案
void showPattern(byte pattern[]) {
for (int row = 0; row < 8; row++) {
lc.setRow(0, row, pattern[row]);
}
}
// 滾動顯示字串 (逐字,每段隔 1 秒)
void scrollText(String text) {
for (int i = 0; i < text.length(); i++) {
char c = text.charAt(i);
showHexChar(c);
delay(1000); // 每字顯示 1 秒
lc.clearDisplay(0);
}
}
留言
張貼留言