RFID RC522 на Arduino: идентификация карт, доступ по пропуску

RFID RC522 — популярный модуль для систем контроля доступа на Arduino. Считывает UID карт MIFARE 13.56 МГц, сравнивает с базой, разрешает/запрещает доступ. Интеграция с LCD 1602 для вывода времени (DS3231), UID и статуса. При совпадении — «Доступ разрешён», иначе «Доступ запрещён». Проект для СКУД, турникетов, учёта посещаемости или замков. Поддержка нескольких карт, расширение до реле, buzzer или серво.

RFID RC522 Arduino идентификация карт пропуск доступ

Возможности системы

Чтение UID карты/брелоков. Сравнение с массивом разрешённых. Вывод на LCD 1602: дата/время (DS3231), статус доступа, UID. Добавление нулей для однозначных чисел (09 вместо 9). Расширение: реле на дверь, buzzer, логи в Serial/Excel.

Компоненты

  • Arduino Uno/Nano
  • RFID RC522
  • LCD 1602 I2C
  • DS3231 RTC
  • Карты MIFARE

Подключение

  • RC522: 3.3V, GND, RST → D9, IRQ — не подключать, MISO → D12, MOSI → D11, SCK → D13, SDA → D10
  • LCD I2C: VCC 5V, GND, SDA A4, SCL A5
  • DS3231: VCC 5V, GND, SDA A4, SCL A5 (общий I2C)

Библиотеки

MFRC522, RTClib, LiquidCrystal_I2C.

Скетч идентификации

#include <MFRC522.h>
#include <LiquidCrystal_I2C.h>
#include <RTClib.h>

MFRC522 mfrc522(10, 9);
LiquidCrystal_I2C lcd(0x27,16,2);
RTC_DS3231 rtc;

String allowedUID[] = {"AB CD EF 12", "34 56 78 90" /* ... */};
int numCards = 5;

void setup() {
  mfrc522.PCD_Init();
  lcd.init(); lcd.backlight();
  rtc.begin();
  // rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // установить время
}

void loop() {
  DateTime now = rtc.now();
  lcd.setCursor(0,0);
  lcd.print(now.day()<10?"0":""); lcd.print(now.day()); lcd.print(".");
  lcd.print(now.month()<10?"0":""); lcd.print(now.month()); lcd.print(".");
  lcd.print(now.year());
  lcd.print(" ");
  lcd.print(now.hour()<10?"0":""); lcd.print(now.hour()); lcd.print(":");
  lcd.print(now.minute()<10?"0":""); lcd.print(now.minute());

  if (mfrc522.PICC_IsNewCardPresent() && mfrc522.PICC_ReadCardSerial()) {
    String uid = "";
    for (byte i = 0; i < mfrc522.uid.size; i++) {
      uid += String(mfrc522.uid.uidByte[i], HEX);
      if (i < mfrc522.uid.size-1) uid += " ";
    }
    uid.toUpperCase();

    bool access = false;
    for (int i = 0; i < numCards; i++) {
      if (uid == allowedUID[i]) { access = true; break; }
    }

    lcd.setCursor(0,1);
    if (access) lcd.print("ДОСТУП РАЗРЕШЕН ");
    else lcd.print("ДОСТУП ЗАПРЕЩЕН ");
    delay(2000);
    mfrc522.PICC_HaltA();
  }
}
Делает следующее:
показывает дату и время с DS3231 на LCD 16×2.
считывает UID карты MFRC522.
сравнивает с массивом разрешённых UID.
при совпадении выводит «ДОСТУП РАЗРЕШЕН», иначе «ДОСТУП ЗАПРЕЩЕН».

Как работает

DS3231 даёт точное время. LCD показывает дату/часы с нулями. При карте считывается UID, сравнивается с массивом. Совпадение — разрешение доступа.

Расширение

Добавьте реле на дверь, buzzer, логи в Serial, несколько пользователей с именами.

Заключение

RFID RC522 — простая система контроля доступа на Arduino. Идентификация карт, вывод на LCD, интеграция с часами. Готово к СКУД или умному замку.

FAQ — RFID RC522 идентификация

Карта не читается?

Проверьте подключение SPI, питание 3.3V, библиотеку MFRC522. Карта MIFARE 1K/Classic.

Как добавить новые карты?

Сначала dumpinfo.ino для UID, добавьте в массив allowedUID[] в скетче.

Время сбивается?

Установите rtc.adjust(DateTime(...)) один раз или батарейку CR2032 в DS3231.

LCD не показывает русский?

Используйте LiquidCrystal_I2C с русификатором или символы латиницей.

Добавить реле на дверь?

Подключите реле к пину, digitalWrite при access = true.

Сколько карт в массиве?

До 50–100 на Uno. Для большего — EEPROM или SD-карта.

ESP8266 вместо Arduino?

Да, те же библиотеки, пины SPI другие.