Indice
Descrizione
Scopri come utilizzare Arduino per rendere i tuoi progetti ancora più interattivi e personalizzati grazie alle tessere RFID. In questo tutorial imparerai a leggere e scrivere dati sulla memoria interna delle tessere.
Cominceremo con la costruzione del circuito, esplorando come collegare correttamente il modulo RFID e il convertitore di livelli logici. Poi, passeremo alla programmazione, imparando a leggere e scrivere dati nei blocchi liberi delle tessere con facilità.
Segui la guida passo dopo passo e scopri come sfruttare al meglio il potenziale delle tessere RFID.
#include <MFRC522.h>
MFRC522 rfid(10, 9);
void setup() {
Serial.begin(9600);
SPI.begin();
rfid.PCD_Init();
Serial.println(F("Avvicina la tessera RFID"));
}
void loop() {
if (rfid.PICC_IsNewCardPresent() && rfid.PICC_ReadCardSerial()) {
rfid.PICC_DumpToSerial(&(rfid.uid));
Serial.println(F("Avvicina la tessera RFID"));
}
}
#include <MFRC522.h>
MFRC522 rfid(10, 9);
MFRC522::MIFARE_Key key = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
MFRC522::StatusCode status;
char buffer[49];
int bufferIndex = 0;
bool isBufferReady = false;
void setup() {
Serial.begin(9600);
SPI.begin();
rfid.PCD_Init();
Serial.println(F("Inserisci il testo (max 48 caratteri):"));
}
void loop() {
while (Serial.available() && !isBufferReady) {
char c = Serial.read();
if (bufferIndex < 48 && c != '\n') {
buffer[bufferIndex++] = c;
} else {
buffer[bufferIndex] = '\0';
isBufferReady = true;
Serial.println(buffer);
Serial.println();
Serial.println(F("Avvicina la tessera RFID per la scrittura"));
}
}
if (isBufferReady && rfid.PICC_IsNewCardPresent() && rfid.PICC_ReadCardSerial()) {
Serial.println(F("Scrittura in corso..."));
if (writeCard(buffer, bufferIndex)) {
Serial.println(F("Scrittura completata con successo!"));
}
rfid.PICC_HaltA();
rfid.PCD_StopCrypto1();
isBufferReady = false;
bufferIndex = 0;
while (Serial.available()) {
Serial.read();
}
Serial.println();
Serial.println(F("Inserisci il testo (max 48 caratteri):"));
}
}
bool writeCard(char *content, int contentLength) {
int index = 0;
byte blockData[16];
for (byte blockOffset = 0; blockOffset < 3; blockOffset++) {
memset(blockData, '\0', 16);
index = min(16, contentLength - blockOffset * 16);
if (index > 0) {
strncpy((char *)blockData, content + blockOffset * 16, index);
}
if (!writeBlock(4 + blockOffset, blockData)) {
return false;
}
}
return true;
}
bool writeBlock(byte blockAddr, byte *blockData) {
status = rfid.PCD_Authenticate(
MFRC522::PICC_CMD_MF_AUTH_KEY_A,
blockAddr,
&key,
&(rfid.uid));
if (status != MFRC522::STATUS_OK) {
Serial.print(F("Autenticazione del blocco non riuscita: "));
Serial.println(blockAddr);
Serial.println(rfid.GetStatusCodeName(status));
return false;
}
status = rfid.MIFARE_Write(blockAddr, blockData, 16);
if (status != MFRC522::STATUS_OK) {
Serial.print(F("Errore durante la scrittura del blocco: "));
Serial.println(blockAddr);
Serial.println(rfid.GetStatusCodeName(status));
return false;
}
return true;
}
#include <MFRC522.h>
MFRC522 rfid(10, 9);
MFRC522::MIFARE_Key key = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
MFRC522::StatusCode status;
char buffer[49];
void setup() {
Serial.begin(9600);
SPI.begin();
rfid.PCD_Init();
Serial.println(F("Avvicina la tessera RFID"));
}
void loop() {
if (rfid.PICC_IsNewCardPresent() && rfid.PICC_ReadCardSerial()) {
Serial.println(F("Lettura in corso..."));
if (readCard(buffer)) {
Serial.println(F("Contenuto della tessera RFID:"));
Serial.println(buffer);
}
rfid.PICC_HaltA();
rfid.PCD_StopCrypto1();
Serial.println();
Serial.println(F("Avvicina la tessera RFID"));
}
}
bool readCard(char *content) {
int index = 0;
byte blockData[18];
for (byte blockOffset = 0; blockOffset < 3; blockOffset++) {
memset(blockData, '\0', 18);
if (!readBlock(4 + blockOffset, blockData)) {
return false;
}
for (int i = 0; i < 16; i++) {
content[index++] = blockData[i];
if (blockData[i] == '\0') {
return true;
}
}
}
content[index] = '\0';
return true;
}
bool readBlock(byte blockAddr, byte *blockData) {
byte length = 18;
status = rfid.PCD_Authenticate(
MFRC522::PICC_CMD_MF_AUTH_KEY_A,
blockAddr,
&key,
&(rfid.uid)
);
if (status != MFRC522::STATUS_OK) {
Serial.print(F("Autenticazione del blocco non riuscita: "));
Serial.println(blockAddr);
Serial.println(rfid.GetStatusCodeName(status));
return false;
}
status = rfid.MIFARE_Read(blockAddr, blockData, &length);
if (status != MFRC522::STATUS_OK) {
Serial.print(F("Errore durante la lettura del blocco: "));
Serial.println(blockAddr);
Serial.println(rfid.GetStatusCodeName(status));
return false;
}
return true;
}