#include <SPI.h>
#include <MFRC522.h>
#define SS_PIN 10
#define RST_PIN 9
MFRC522 rfid(SS_PIN, RST_PIN);
MFRC522::MIFARE_Key key;
// Все данные с Ultralight (страницы 00-0B по 4 байта)
byte block1[16] = {
0x04, 0xD5, 0x23, 0x7A, // Addr 00
0x62, 0x43, 0x60, 0x80, // Addr 01
0xC1, 0x48, 0x00, 0x00, // Addr 02
0x00, 0x00, 0x00, 0x00 // Addr 03
};
byte block2[16] = {
0x44, 0x6F, 0x6D, 0x6F, // Addr 04 = "Domo"
0x66, 0x6F, 0x6E, 0x2E, // Addr 05 = "fon."
0x6E, 0x65, 0x74, 0x00, // Addr 06 = "net"
0x00, 0x00, 0x00, 0x00 // Addr 07
};
void initRFID() {
rfid.PCD_Init();
delay(50);
rfid.PCD_SetAntennaGain(rfid.RxGain_max);
}
void setup() {
Serial.begin(9600);
SPI.begin();
initRFID();
for (byte i = 0; i < 6; i++) key.keyByte[i] = 0xFF;
Serial.println("Поднеси Classic карту для записи...");
}
void loop() {
delay(200);
if (!rfid.PICC_IsNewCardPresent()) return;
if (!rfid.PICC_ReadCardSerial()) return;
// Проверяем что это Classic
MFRC522::PICC_Type type = rfid.PICC_GetType(rfid.uid.sak);
Serial.print("Тип карты: ");
Serial.println(rfid.PICC_GetTypeName(type));
if (type != MFRC522::PICC_TYPE_MIFARE_MINI &&
type != MFRC522::PICC_TYPE_MIFARE_1K &&
type != MFRC522::PICC_TYPE_MIFARE_4K) {
Serial.println("Это не Classic! Нужна MIFARE Classic карта.");
rfid.PICC_HaltA();
return;
}
Serial.println("Classic найдена! Записываю...");
// Записываем блок 1
if (!writeBlock(1, block1)) return;
Serial.println("Блок 1 записан!");
// Записываем блок 2
if (!writeBlock(2, block2)) return;
Serial.println("Блок 2 записан!");
Serial.println("Готово! Все данные записаны.");
Serial.println("Поднеси снова чтобы записать ещё раз.");
rfid.PICC_HaltA();
rfid.PCD_StopCrypto1();
initRFID();
}
bool writeBlock(byte block, byte* data) {
MFRC522::StatusCode s = rfid.PCD_Authenticate(
MFRC522::PICC_CMD_MF_AUTH_KEY_A, block, &key, &rfid.uid
);
if (s != MFRC522::STATUS_OK) {
Serial.print("Ошибка аутентификации блока ");
Serial.print(block);
Serial.print(": ");
Serial.println(rfid.GetStatusCodeName(s));
rfid.PICC_HaltA();
rfid.PCD_StopCrypto1();
return false;
}
s = rfid.MIFARE_Write(block, data, 16);
if (s != MFRC522::STATUS_OK) {
Serial.print("Ошибка записи блока ");
Serial.print(block);
Serial.print(": ");
Serial.println(rfid.GetStatusCodeName(s));
rfid.PICC_HaltA();
rfid.PCD_StopCrypto1();
return false;
}
return true;
}