RFID-RC522 module

Passive RFID tags are basically just little antennas with an extremely low power integrated circuit. When the IC is activated by power induced by the antenna, it generates a signal to transmit a small amount of data, such as an ID number.

This RC522 RFID module can read RFID tags and write to RFID tags that support writing. The RFID tag has a 4-byte (or 32-bit) UID, which means there are about 4.3 billion unique possibilities. Although that sounds like a lot, there are some situations where it's not considered enough to prevent collisions or brute-force guessing.

RFID tags, on their own, are not very suitable for access control in a modern high-security environment. However, it will typically be harder for an intruder to guess a 32-bit UID than, for example, to pick a traditional house lock using standard lockpicking tools and a little practice.

The RFID tag is called a PICC, short for Proximity Integrated Circuit Card because "tag" is apparently too easy.

This sample code will print the PICC type and UID to the serial port:

#include <SPI.h>
#include <MFRC522.h>

const byte RST_PIN = 9;
const byte SS_PIN  = 10;

MFRC522 reader(SS_PIN, RST_PIN);

void printUID(byte* bytes, byte len)
{
	Serial.print("UID: ");

	for (byte i = 0; i < len; i++) {
		// Pad single-digits with 0
		if (bytes[i] < 0x10) {
			Serial.print("0");
		}

		Serial.print(bytes[i], HEX);
	}

	Serial.println();
}

void printPiccType(byte sak)
{
	Serial.print("SAK: ");
	Serial.println(sak);

	auto piccType     = reader.PICC_GetType(sak);
	auto piccTypeName = reader.PICC_GetTypeName(piccType);

	Serial.print("PICC type: ");
	Serial.println(piccTypeName);
}

void setup()
{
	Serial.begin(9600);
	SPI.begin();
	reader.PCD_Init();
}

void loop()
{
	delay(50);

	bool cardFound = reader.PICC_IsNewCardPresent();
	bool cardRead  = reader.PICC_ReadCardSerial();

	if (cardFound && cardRead) {
		auto uid = reader.uid;

		printUID(uid.uidByte, uid.size);
		printPiccType(uid.sak);

		delay(200);
	}
}