O módulo RC522 RFID é um leitor de cartões inteligentes que, entre outras coisas, permite ativar um mecanismo quando o cartão certo é apresentado ao leitor. Neste tutorial, veremos como usar o módulo RC522 RFID com um cartão NodeMCU ESP32.
Pré-requisito: Programar o seu NodeMCU com Arduino
Material
- Computador
- Cartão ESP32 NodeMCU
- Cabo USB A macho/ Micro B macho
- módulo RFID RC522
Esquema
O módulo RC522 RFID se comunica com o ESP32 por meio do protocolo SPI. A comunicação SPI utiliza pinos específicos neste tipo de microcontrolador.
A ligação é feita da seguinte forma (lado esquerdo RC522, lado direito ESP32):
- Vcc <-> 3V3 (ou Vin(5V), dependendo da versão do módulo)
- RST (Reset) <-> D0
- GND (Masse) <-> GND
- MISO (Master Input Slave Output) <-> 19
- MOSI (Master Output Slave Input) <-> 23
- SCK (Serial Clock) <-> 18
- SS/SDA (Slave select) <-> 5

Atenção: Dependendo da versão do módulo RFID, a tensão de alimentação pode mudar (3,3V ou 5V). Verifique a tensão de alimentação do seu módulo.
Para lembrar, este é o diagrama de ligação do cartão ESP32:

Código para ler um cartão RFID
Para usar o módulo RC522 RFID, utilizamos a biblioteca SPI.h , que permite estabelecer a comunicação entre o cartão ESP32 e o módulo. Também usamos a biblioteca MFRC522.h, que permite dialogar com o módulo.
//Libraries
#include <SPI.h>//https://www.arduino.cc/en/reference/SPI
#include <MFRC522.h>//https://github.com/miguelbalboa/rfid
//Constants
#define SS_PIN 5
#define RST_PIN 0
//Parameters
const int ipaddress[4] = {103, 97, 67, 25};
//Variables
byte nuidPICC[4] = {0, 0, 0, 0};
MFRC522::MIFARE_Key key;
MFRC522 rfid = MFRC522(SS_PIN, RST_PIN);
void setup() {
//Init Serial USB
Serial.begin(115200);
Serial.println(F("Initialize System"));
//init rfid D8,D5,D6,D7
SPI.begin();
rfid.PCD_Init();
Serial.print(F("Reader :"));
rfid.PCD_DumpVersionToSerial();
}
void loop() {
readRFID();
}
void readRFID(void ) { /* function readRFID */
////Read RFID card
for (byte i = 0; i < 6; i++) {
key.keyByte[i] = 0xFF;
}
// Look for new 1 cards
if ( ! rfid.PICC_IsNewCardPresent())
return;
// Verify if the NUID has been readed
if ( !rfid.PICC_ReadCardSerial())
return;
// Store NUID into nuidPICC array
for (byte i = 0; i < 4; i++) {
nuidPICC[i] = rfid.uid.uidByte[i];
}
Serial.print(F("RFID In dec: "));
printDec(rfid.uid.uidByte, rfid.uid.size);
Serial.println();
// Halt PICC
rfid.PICC_HaltA();
// Stop encryption on PCD
rfid.PCD_StopCrypto1();
}
/**
Helper routine to dump a byte array as hex values to Serial.
*/
void printHex(byte *buffer, byte bufferSize) {
for (byte i = 0; i < bufferSize; i++) {
Serial.print(buffer[i] < 0x10 ? " 0" : " ");
Serial.print(buffer[i], HEX);
}
}
/**
Helper routine to dump a byte array as dec values to Serial.
*/
void printDec(byte *buffer, byte bufferSize) {
for (byte i = 0; i < bufferSize; i++) {
Serial.print(buffer[i] < 0x10 ? " 0" : " ");
Serial.print(buffer[i], DEC);
}
}
Resultado
Quando um cartão, crachá ou chip RFID é passado em frente do módulo, o monitor serial exibe o seu endereço de comunicação.

Aplicações
- Desenvolver uma interface web que se ativa somente quando o cartão certo é passado em frente do módulo