RFID Register

Program pendaftaran RFID Card

RFID_Regist.ino INO FILE
#include <SPI.h>
#include <MFRC522.h>

// Pin configuration
const uint8_t RST_PIN = 27; // GPIO27 untuk reset RC522
const uint8_t SS_PIN  = 5;  // GPIO5 untuk SS RC522

MFRC522 mfrc522(SS_PIN, RST_PIN);
MFRC522::MIFARE_Key key;

// Block configuration
int blockNum = 4;
byte bufferLen = 18;
byte readBlockData[18];
MFRC522::StatusCode status;

void setup() {
  Serial.begin(9600);
  SPI.begin();
  mfrc522.PCD_Init();
  Serial.println("Tempelkan kartu RFID untuk mendaftarkan...");
}

void loop() {
  // Prepare key for authentication
  for (byte i = 0; i < 6; i++) {
    key.keyByte[i] = 0xFF;
  }

  // Wait for new card
  if (!mfrc522.PICC_IsNewCardPresent()) return;
  if (!mfrc522.PICC_ReadCardSerial()) return;

  // Card detected
  Serial.print("\n**Kartu Terdeteksi**\nUID:");
  for (byte i = 0; i < mfrc522.uid.size; i++) {
    Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
    Serial.print(mfrc522.uid.uidByte[i], HEX);
  }
  Serial.print("\nTipe kartu: ");
  MFRC522::PICC_Type piccType = mfrc522.PICC_GetType(mfrc522.uid.sak);
  Serial.println(mfrc522.PICC_GetTypeName(piccType));

  byte buffer[18];
  byte len;
  Serial.setTimeout(20000L); // Timeout 20 detik

  // Input Nama
  Serial.println(F("---------------------------------------"));
  Serial.println(F("Masukkan NAMA, akhiri dengan #"));
  len = Serial.readBytesUntil('#', (char *)buffer, 16);
  for (byte i = len; i < 16; i++) buffer[i] = ' ';
  blockNum = 4;
  WriteDataToBlock(blockNum, buffer);
  ReadDataFromBlock(blockNum, readBlockData);
  dumpSerial(blockNum, readBlockData);

  // Input ID
  Serial.println(F("---------------------------------------"));
  Serial.println(F("Masukkan ID, akhiri dengan #"));
  len = Serial.readBytesUntil('#', (char *)buffer, 16);
  for (byte i = len; i < 16; i++) buffer[i] = ' ';
  blockNum = 5;
  WriteDataToBlock(blockNum, buffer);
  ReadDataFromBlock(blockNum, readBlockData);
  dumpSerial(blockNum, readBlockData);

  // Input Kode
  Serial.println(F("---------------------------------------"));
  Serial.println(F("Masukkan KODE, akhiri dengan #"));
  len = Serial.readBytesUntil('#', (char *)buffer, 16);
  for (byte i = len; i < 16; i++) buffer[i] = ' ';
  blockNum = 6;
  WriteDataToBlock(blockNum, buffer);
  ReadDataFromBlock(blockNum, readBlockData);
  dumpSerial(blockNum, readBlockData);
  
  Serial.println(F("\nPendaftaran selesai!"));
  Serial.println(F("---------------------------------------\n"));
  
  // Halt PICC dan stop enkripsi
  mfrc522.PICC_HaltA();
  mfrc522.PCD_StopCrypto1();
  
  // Delay sebentar sebelum reset
  delay(5000);
  
  // Reset ESP32 secara software
  Serial.println("Reset ESP32...");
  ESP.restart();
}

// Fungsi WriteDataToBlock, ReadDataFromBlock, dan dumpSerial tetap sama

void WriteDataToBlock(int blockNum, byte blockData[]) {
  status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, blockNum, &key, &(mfrc522.uid));
  if (status != MFRC522::STATUS_OK) {
    Serial.print("Autentikasi gagal: ");
    Serial.println(mfrc522.GetStatusCodeName(status));
    return;
  }

  status = mfrc522.MIFARE_Write(blockNum, blockData, 16);
  if (status != MFRC522::STATUS_OK) {
    Serial.print("Gagal menulis ke blok: ");
    Serial.println(mfrc522.GetStatusCodeName(status));
  }
}

void ReadDataFromBlock(int blockNum, byte readBlockData[]) {
  for (byte i = 0; i < 6; i++) {
    key.keyByte[i] = 0xFF;
  }

  status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, blockNum, &key, &(mfrc522.uid));
  if (status != MFRC522::STATUS_OK) {
    Serial.print("Autentikasi gagal: ");
    Serial.println(mfrc522.GetStatusCodeName(status));
    return;
  }

  status = mfrc522.MIFARE_Read(blockNum, readBlockData, &bufferLen);
  if (status != MFRC522::STATUS_OK) {
    Serial.print("Gagal membaca blok: ");
    Serial.println(mfrc522.GetStatusCodeName(status));
  }
}

void dumpSerial(int blockNum, byte blockData[]) {
  Serial.print("\nData pada blok ");
  Serial.print(blockNum);
  Serial.print(": ");
  for (int j = 0; j < 16; j++) {
    Serial.write(readBlockData[j]);
  }
  Serial.println();

  // Clear buffer
  for (int i = 0; i < sizeof(readBlockData); ++i) {
    readBlockData[i] = (char)0;
  }
}