#include #include #include // ========================== // RC522 wiring (ESP8266) // ========================== // Keep your existing pins here. #define SS_PIN D4 #define RST_PIN D3 MFRC522 rfid(SS_PIN, RST_PIN); // ========================== // UART link to ESP32-S3 // ========================== // Easiest: use Serial at 115200 to talk to ESP32. // NOTE: This means you can't reliably use the same Serial for USB monitor at the same time. // If you want USB monitor + ESP32 link simultaneously, switch to SoftwareSerial. static constexpr uint32_t LINK_BAUD = 115200; // Set true if you want extra prints on the same UART (will also be received by ESP32). static constexpr bool DEBUG_UART = false; String uidToString(const MFRC522::Uid &uid) { String s; for (byte i = 0; i < uid.size; i++) { if (uid.uidByte[i] < 0x10) s += '0'; s += String(uid.uidByte[i], HEX); if (i < uid.size - 1) s += ':'; } s.toUpperCase(); return s; } void sendEventToMaster(const String &uid) { // Message consumed by ESP32-S3 Serial.println("RFID UID=" + uid); } void setup() { Serial.begin(LINK_BAUD); delay(800); if (DEBUG_UART) { Serial.println("ESP8266 RFID SLAVE READY"); } SPI.begin(); SPI.setFrequency(400000); // more stable for some RC522 boards rfid.PCD_Init(); delay(50); byte version = rfid.PCD_ReadRegister(MFRC522::VersionReg); if (DEBUG_UART) { Serial.print("RC522 Version: 0x"); Serial.println(version, HEX); } } void loop() { // Poll RFID if (!rfid.PICC_IsNewCardPresent()) { delay(20); return; } if (!rfid.PICC_ReadCardSerial()) { delay(60); return; } String uid = uidToString(rfid.uid); if (DEBUG_UART) { Serial.print("UID: "); Serial.println(uid); } // Always send UID-only event to ESP32. sendEventToMaster(uid); rfid.PICC_HaltA(); rfid.PCD_StopCrypto1(); delay(1500); // debounce }