iT邦幫忙

0

UID寫不進白卡

我是想用Arduino做出一機複製卡片UID
但不確定是哪裡寫錯
白卡的UID改不了qwq
希望各位大老可以幫幫我這個小菜雞交出學習歷程

以下為程式碼(有點雜亂還請見諒

// OLED 函式庫
#include <Arduino.h>
#include <U8g2lib.h>

#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif

#define CURSOR_X  0
#define CURSOR_Y  8

// U8g2 建構子( Frame Buffer )
// 完整列表: https://github.com/olikraus/u8g2/wiki/u8g2setupcpp
// 以下以0.96吋 4Pin IIC-I2C示範
U8G2_SSD1306_128X64_NONAME_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);

U8G2LOG u8g2log;

// 設定終端機 (U8G2LOG) 並連接到 U8g2 自動刷新螢幕
// 選擇的字體將會決定 (width * height) 的大小

// 設定 4x6 字體
#define U8LOG_WIDTH 32
#define U8LOG_HEIGHT 10
uint8_t u8log_buffer[U8LOG_WIDTH * U8LOG_HEIGHT];

// MFRC522 函式庫
#include <SPI.h>
#include <MFRC522.h>

#define RST_PIN   9     // RST腳位
#define SS_PIN    10    // SDA(SS)腳位

MFRC522 mfrc522(SS_PIN, RST_PIN);   // 建立 MFRC522 物件

/* 設定要寫入的UID */
//#define NEW_UID {0xCA, 0xB0, 0x62, 0xBD}

MFRC522::MIFARE_Key key;

void setup() {

  // OLED
  u8g2.begin();

  u8g2.setFont(u8g2_font_6x10_tf);   // 設定終端機視窗字體
  u8g2log.begin(u8g2, U8LOG_WIDTH, U8LOG_HEIGHT, u8log_buffer);
  u8g2log.setLineHeightOffset(0); // 設定行距
  u8g2log.setRedrawMode(0);   // 0: 在下一行更新螢幕, 1: 每個字元更新螢幕

  u8g2log.print("Initialize...\n");   // 顯示於螢幕

  // 針腳設定
  pinMode(7, INPUT_PULLUP); //copy btn

  // 序列埠通訊
  Serial.begin(9600);  // 初始化序列埠通訊 並設定傳輸速率

  // SPI
  SPI.begin();         // 初始化序列周邊介面

  // MFRC522
  mfrc522.PCD_Init();  // 初始化 MRFC522
  Serial.print(F("Reader "));
  Serial.print(F(": "));
  mfrc522.PCD_DumpVersionToSerial(); // 顯示讀卡設備的版本
  Serial.println();

  // 準備金鑰 - 所有金鑰在卡片出廠時被設成 FF FF FF FF FF FF
  for (byte i = 0; i < 6; i++) {
    key.keyByte[i] = 0xFF;
  }

  u8g2log.print("Finish\n");
  delay(500);
  u8g2log.print("\f");  // \f = 跳頁字元: 清空螢幕
  delay(500);
}

// 把讀到的 Byte 陣列用16進位顯示出來
void dump_byte_array(byte *buffer, byte bufferSize) {
  for (byte i = 0; i < bufferSize; i++) {
    Serial.print(buffer[i] < 0x10 ? " 0" : " ");
    Serial.print(buffer[i], HEX);
  }
  Serial.println("");
}

// OLED 顯示 UID
void oled_dump_uid(byte *buffer, byte bufferSize) {
  for (int j = 0; j < bufferSize; j++) {
    u8g2.firstPage();
    do {
      u8g2.setCursor(CURSOR_X, CURSOR_Y);
      u8g2.print("UID:");
      for (byte i = 0; i < bufferSize; i++) {
        if (buffer[i] < 0x10) {  // 讀到小於10的數字時,前面多顯示一個零
          u8g2.setCursor(26 + i * 16, CURSOR_Y);
          u8g2.print("0");
          u8g2.setCursor(26 + i * 16 + 6, CURSOR_Y);
          u8g2.print(buffer[i], HEX);
        } else {
          u8g2.setCursor(26 + i * 16, CURSOR_Y);
          u8g2.print(buffer[i], HEX);
        }
      }
    } while ( u8g2.nextPage() );  // UID列印結束
  }
}

// 複製UID
void copy_uid(byte *buffer, byte bufferSize, byte *newbuffer) {
  for (int i = 0; i < bufferSize; i++) {
    newbuffer[i] = buffer[i];
  }
  for (int i = 0; i < bufferSize; i++) {
    Serial.print(newbuffer[i]);
    Serial.print(" ");
  }
  Serial.println();
}

void loop() {

  int cursor_x = CURSOR_X;
  int cursor_y = CURSOR_Y;
  bool want_to_copy = false;

  u8g2.firstPage();
  do {
    u8g2.setFont(u8g2_font_6x10_tf);
    u8g2.drawStr(cursor_x, cursor_y, "Scanning...");
    delay(50);
  } while ( u8g2.nextPage() );

  // 偵測卡片並讀取
  if ( ! mfrc522.PICC_IsNewCardPresent() || ! mfrc522.PICC_ReadCardSerial() ) {
    delay(50);
    return;
  }

  // 列印 UID
  Serial.print("卡片 UID:");
  dump_byte_array(mfrc522.uid.uidByte, mfrc522.uid.size);
  oled_dump_uid(mfrc522.uid.uidByte, mfrc522.uid.size);
  Serial.print("PICC type: "); // 印出 PICC
  MFRC522::PICC_Type piccType = mfrc522.PICC_GetType(mfrc522.uid.sak);
  Serial.println(mfrc522.PICC_GetTypeName(piccType)); // 顯示卡片的類型
  Serial.println();

  // 複製 UID
  if (digitalRead(7) == LOW) {
    byte *newUid = mfrc522.uid.uidByte;
    byte uidsize = mfrc522.uid.size;
    u8g2log.print("UID was copied.\n");
    //copy_uid(mfrc522.uid.uidByte, mfrc522.uid.size, newUid);
    Serial.print("要複製的UID:");
    dump_byte_array(mfrc522.uid.uidByte, uidsize);
    Serial.print("被複製的UID:");
    dump_byte_array(newUid, uidsize);
    Serial.println();
    delay(500);

    // 讀取新卡片
    mfrc522.PICC_HaltA();
    bool read_new_card = false;
    do {
      u8g2.firstPage();
      do {
        u8g2.setFont(u8g2_font_6x10_tf);
        u8g2.drawStr(cursor_x, cursor_y, "Scanning new card...");
        delay(50);
      } while ( u8g2.nextPage() );
      if ( ! mfrc522.PICC_IsNewCardPresent() || ! mfrc522.PICC_ReadCardSerial() ) {
        delay(50);
        continue;
      }
      read_new_card = true;

      // 列印 UID
      Serial.print("卡片 UID:");
      dump_byte_array(mfrc522.uid.uidByte, mfrc522.uid.size);
      oled_dump_uid(mfrc522.uid.uidByte, mfrc522.uid.size);
      Serial.println();
      delay(1000);

      u8g2log.print("Writing UID to\n");
      u8g2log.print("new card...\n");
      if ( mfrc522.MIFARE_SetUid(newUid, (byte)4, true) ) {
        u8g2log.print("Finish\n");
        Serial.println("完成寫入新的 UID 至卡片\n");
        delay(2000);
        u8g2log.print("\f");
        u8g2.clear();
        break;
      } else {
        u8g2log.print("Failed\n");
        delay(2000);
        u8g2log.print("\f");
        u8g2.clear();
        break;
      }
    } while (!read_new_card);
  } // 複製 UID 結束

  mfrc522.PICC_HaltA(); // 卡片進入停止模式
  delay(1000);

}   // loop() 結束
0
iT邦見習生 ‧ 2021-09-13 13:59:41

白卡不能寫 UID

JK8823 iT邦新手 5 級 ‧ 2021-09-13 20:48:45 檢舉

UID位出廠固化只可讀不可寫

0
japhenchen
iT邦大師 1 級 ‧ 2021-09-14 10:37:25

你只能用讀卡機讀出ID使用,不能寫入,線圈是固定的無法改寫,又不是條碼卡

我要發表回答

立即登入回答