RC522 е лесен за употреба, нискобюджетен, подходящ за разработване на проекти свързани с употребата на безконтактни RF карти и тагове на 13.56MHz. Той използва захранване 3.3V, а комуникацията се извършва чрез Serial Peripheral Interface (SPI) интерфейс.

Свързваме:
3.3vнаRC522с3v3наNodeMCURSTнаRC522сD3наNodeMCUGNDнаRC522сGNDнаNodeMCUMISOнаRC522сD6наNodeMCUMOSIнаRC522сD7наNodeMCUSCKнаRC522сD5наNodeMCUSDAнаRC522сD8наNodeMCU
На D1 свързваме светодиод (с резистор), който да ни послужи за индикатор при успешен достъп.
Ще се наложи да инсталираме една библиотека MFRC522.

Хайде да напишем малко код:
#include "SPI.h"
#include "MFRC522.h"
#define RST_PIN D3 // Пин за ресет на MFRC522
#define SS_PIN D8 // Пин за конфигуриране
#define UNLLOCK_PIN D1 // Пин за светодиод / осигуряване на достъп
// създаваме обект MFRC522
MFRC522 mfrc522(SS_PIN, RST_PIN);
String allowed = "";
void setup() {
// инициализираме UART
Serial.begin(115200);
// инициализираме Serial Peripheral Interface
SPI.begin();
// инициализираме MFRC522
mfrc522.PCD_Init();
// извеждаме празен ред
Serial.println();
// извеждаме съобщение
Serial.println("Моля сканирайте карта за да видите нейното UID");
// задаваме режим на пин D1 като изход
pinMode(UNLLOCK_PIN, OUTPUT);
}
void loop() {
// проверяваме има ли карта
if (mfrc522.PICC_IsNewCardPresent()) {
// четем данни от картата
if (mfrc522.PICC_ReadCardSerial()) {
// извеждаме текст
Serial.print("Card UID:");
// конвертираме UID на картата в четим текст
String uid = uid_to_str(mfrc522.uid.uidByte, mfrc522.uid.size);
// извеждаме UID
Serial.println(uid);
// проверяваме дали UID е в разрешените
if (allowed.indexOf(uid)>-1) {
// извеждаме OK
Serial.println("OK");
// подаваме ток към светодиода на пин D1
digitalWrite(UNLLOCK_PIN, HIGH);
// изчакваме една секунда
delay(1000);
// спираме подаването на ток към светодиода на пин D1
digitalWrite(UNLLOCK_PIN, LOW);
}
delay(250);
}
}
}
// конвертира UID в четим низ
String uid_to_str(byte *buffer, byte bufferSize) {
String result = "*";
for (byte i = 0; i < bufferSize; i++) {
result+=String(buffer[i] < 0x10 ? " 0" : " ");
result+=String(buffer[i], HEX);
}
result+="*";
return result;
}
След като го качим на нашето NodeMCU трябва да отворим Serial Monitor (в Arduino лупичката горе-дясно) и да изберем 115200 baud.
Сега остава да натиснем RST на нашето NodeMCU и серийният монитор ще ни подкани да сканираме карта.
Задържаме за секунда съвместима карта върху RC522 и виждаме резултата:

Аз ще сканирам още една карта и ще редактирам:
String allowed = "";
на:
String allowed = "* 13 0b f4 1b*,* db 98 74 0d*";
Сега остава да качим нашият редактиран код и нека видим какво ще стане.

Разбира се, не е правилно използването на низове (String) с променливи дължини, но го правим за прегледност.
Също така, записването на UID-тата в кода е голяма грешка, понеже при всяка промяна ще се налага да свързваме устройството с компютър. За целта може да използваме вградената флаш памет чрез SPIFFS или да съхраняваме информацията на отдалечен сървър и да достигаме до нея чрез протокола MQTT, но за това в някоя друга тема.
