RFID 8X8 LED 顯示卡號16進位

#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);

  }

}


留言