Program pendaftaran RFID Card
#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;
}
}