Board and part

ESP32-S3 RC522 RFID Simulator: Wiring, Code and a Live Circuit

This is an RC522 (MFRC522) RFID reader wired to an ESP32-S3 DevKitC-1 over SPI, running live with the MFRC522 library: open it in the editor, lay a card on the reader, and the serial monitor prints its UID.

  • 3.3 V logic
  • Library: MFRC522.h
  • SS on GPIO 10
  • 3.3 V module
ESP32-S3 · RC522 RFIDlive0.000 s 0.00x
Click to open it in the editor
The circuit itself, running on the simulator with the sketch below. Press what can be pressed; click anything else to open it in the editor.
Connections

Wiring the RC522 RFID to the ESP32-S3

Seven wires: 3.3 V, GND, the four SPI lines to the ESP32-S3’s SPI pins, and RST to GPIO 4.

Every connection in the circuit above, with the board’s own pin names.

RC522 RFID pinESP32-S3 pinWhy
3.3V3V3The MFRC522 is a 3.3 V chip. Never 5 V on this pin.
GNDGCommon ground.
SDA (SS)GPIO 10Chip select. Labeled SDA on the module, but this is SPI, not I2C.
SCKGPIO 12ESP32-S3’s SPI clock.
MOSIGPIO 11Data from the board to the reader.
MISOGPIO 13Data from the reader to the board.
RSTGPIO 4Reset, held high while the reader runs.
IRQnot connectedThe library polls instead.

Power

The ESP32-S3 and the MFRC522 are both 3.3 V, so the SPI lines connect directly: the cleanest RC522 wiring there is.

Pins to leave alone on the ESP32-S3

GPIO 19 and 20 are the USB port’s data lines, GPIO 35 to 37 belong to the PSRAM on octal-PSRAM boards such as the N8R8, and GPIO 0, 3, 45 and 46 are strapping pins.

On a real bench

The DevKitC-1 has two USB sockets: UART for uploading and the serial monitor, USB for the S3’s own USB device. Plug into UART while you work with the RC522 RFID. The board is wide, so a single breadboard leaves only one row free on one side.

The sketch

The code, and what it does.

The sketch the circuit above runs. Open it in the editor, change a line and press Run: it compiles in your browser.

RC522 RFID on ESP32-S3
#include <SPI.h>
#include <MFRC522.h>

const int SS_PIN = 10;    // SDA on the module, GPIO 10
const int RST_PIN = 4;   // GPIO 4

MFRC522 rfid(SS_PIN, RST_PIN);

void setup() {
  Serial.begin(115200);
  SPI.begin();          // SCK 12, MISO 13, MOSI 11
  rfid.PCD_Init();
  Serial.println("Hold a card to the reader");
}

void loop() {
  if (!rfid.PICC_IsNewCardPresent() || !rfid.PICC_ReadCardSerial()) {
    delay(50);
    return;
  }
  Serial.print("Card UID:");
  for (byte i = 0; i < rfid.uid.size; i++) {
    Serial.print(rfid.uid.uidByte[i] < 0x10 ? " 0" : " ");
    Serial.print(rfid.uid.uidByte[i], HEX);
  }
  Serial.println();
  rfid.PICC_HaltA();    // done with this card until it is lifted
}

SPI.begin() starts the ESP32-S3’s SPI bus on its own pins (SCK 12, MISO 13, MOSI 11), and MFRC522 rfid(SS_PIN, RST_PIN) adds the chip select and reset. PCD_Init() resets the reader and turns its antenna on.

PICC_IsNewCardPresent() asks whether a card has entered the field and PICC_ReadCardSerial() reads its UID, four or seven bytes. The sketch prints them in hex with a leading zero where needed, then PICC_HaltA() puts the card to sleep so it is reported once.

Serial.begin(115200) opens the serial monitor. Serial is UART0 on the board’s UART socket, at 115200 baud in this sketch.

Pitfalls

Common mistakes with the RC522 RFID on the ESP32-S3

Powering it from 5V

The 3.3V pin means it: 5 V there damages the MFRC522. If the module gets warm or reports a version of 0x00 or 0xFF, check this first.

Treating SDA as I2C

The pin marked SDA is the SPI chip select. Wired to the ESP32-S3’s I2C data pin, the reader is never selected. It goes to SS_PIN, GPIO 10 here.

Expecting to read bank cards

The RC522 reads 13.56 MHz MIFARE tags and cards. Contactless bank cards answer, but only with a random ID each time, and 125 kHz key fobs not at all.

FAQ

Questions and answers

Can I simulate an RC522 RFID reader with an ESP32-S3 DevKitC-1?

Yes. The circuit at the top of this page is an ESP32-S3 DevKitC-1 with a RC522 RFID reader, running in your browser on a simulated ESP32-S3 (Xtensa LX7). The simulated reader has four cards with fixed UIDs; click to lay one on the antenna. Press Run it in the editor to change the wiring or the code; it is free and needs no account.

Which pins does the RC522 use on the ESP32-S3?

SPI: SCK on GPIO 12, MISO on GPIO 13, MOSI on GPIO 11. SS and RST can be any digital pins; this page uses GPIO 10 and GPIO 4.

How do I make an access control lock?

Compare the UID bytes with a list of allowed cards, and drive a relay or a servo when one matches. Keep in mind that a UID alone is easy to copy, so it is a learning project, not a security one.

Can I write to the card?

The library has MIFARE_Write() for MIFARE Classic blocks after authentication. This simulated reader models reading UIDs only.

Build your own RC522 RFID project

Open this circuit in the editor, change the wiring or the code, and keep your version in a free account.