← До всіх проєктів
Автоматизація Середній

RFID-замок на RC522: відкриваємо двері карткою чи брелоком

Зчитувач RC522 розпізнає картки та брелоки 13.56 МГц, ESP32 перевіряє UID за списком і на 3 секунди відкриває електромагнітний замок. Плюс звукова індикація.

Складність
Середній
Час
2 h
Категорія
Автоматизація

Що будуємо

Контроль доступу для шафи, гаража чи майстерні: підносите картку — замок відчиняється, чужа картка — довгий писк і запис у лог. Модуль RC522 коштує копійки й зазвичай продається разом із карткою та брелоком.

Компоненти

  • ESP32 DevKit
  • Модуль RC522 (13.56 МГц, MIFARE) + картки/брелоки
  • Електромагнітна защіпка (solenoid lock) 12 В
  • MOSFET-модуль з логічним рівнем (IRLZ44N) або реле
  • Діод 1N4007 паралельно замку (гасить викид напруги)
  • Активний зумер 3.3–5 В
  • Блок живлення 12 В + понижувач до 5 В для ESP32 (напр. MP1584)

Підключення

RC522 працює по SPI і живиться лише від 3.3 В.

RC522 ESP32
SDA (SS) GPIO 5
SCK GPIO 18
MOSI GPIO 23
MISO GPIO 19
RST GPIO 22
3.3V / GND 3V3 / GND
IRQ не підключаємо
Інше ESP32
MOSFET SIG (замок) GPIO 26
Зумер + GPIO 25

Замок: +12V → замок → MOSFET (DRAIN), діод 1N4007 паралельно замку смужкою до +12V. Земля 12 В та ESP32 — спільна.

Бібліотека

MFRC522 (GithubCommunity / miguelbalboa) — з Library Manager.

Код

#include <SPI.h>
#include <MFRC522.h>

#define SS_PIN     5
#define RST_PIN    22
#define LOCK_PIN   26
#define BUZZER_PIN 25

const unsigned long OPEN_MS = 3000;

// UID дозволених карток — додайте свої (їх виводить Serial Monitor)
const char* ALLOWED[] = {
  "A1B2C3D4",
  "04A23B1A6F5E80",
};

MFRC522 rfid(SS_PIN, RST_PIN);

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);
  }
  s.toUpperCase();
  return s;
}

bool isAllowed(const String &uid) {
  for (const char* allowed : ALLOWED) {
    if (uid == allowed) return true;
  }
  return false;
}

void beep(int ms) {
  digitalWrite(BUZZER_PIN, HIGH);
  delay(ms);
  digitalWrite(BUZZER_PIN, LOW);
}

void setup() {
  Serial.begin(115200);
  pinMode(LOCK_PIN, OUTPUT);
  pinMode(BUZZER_PIN, OUTPUT);
  digitalWrite(LOCK_PIN, LOW);

  SPI.begin();          // SCK 18, MISO 19, MOSI 23
  rfid.PCD_Init();
  rfid.PCD_DumpVersionToSerial();   // має показати версію 0x91 або 0x92
  Serial.println("Tap a card...");
}

void loop() {
  if (!rfid.PICC_IsNewCardPresent() || !rfid.PICC_ReadCardSerial()) return;

  String uid = uidToString(rfid.uid);

  if (isAllowed(uid)) {
    Serial.println("Access granted: " + uid);
    beep(80);
    digitalWrite(LOCK_PIN, HIGH);
    delay(OPEN_MS);
    digitalWrite(LOCK_PIN, LOW);
  } else {
    Serial.println("Unknown card: " + uid);
    beep(600);
  }

  rfid.PICC_HaltA();
  rfid.PCD_StopCrypto1();
}

Реєстрація карток

  1. Прошийте скетч як є і відкрийте Serial Monitor.
  2. Прикладіть свої картки — побачите Unknown card: 04A23B1A6F5E80.
  3. Скопіюйте UID у масив ALLOWED і прошийте знову.

Якщо не працює

  • Firmware Version: 0x0 = (unknown) — перевірте SPI-дроти й живлення 3.3 В (від 5 В модуль може вийти з ладу).
  • Замок не клацає — MOSFET має бути саме logic-level, звичайний IRF540 від 3.3 В не відкриється.
  • ESP32 перезавантажується при спрацюванні замка — немає діода або слабкий БЖ.

⚠️ Про безпеку

Перевірка лише UID — це зручність, а не захист. UID карток MIFARE Classic легко клонується на «китайські» картки з перезаписуваним UID. Для серйозного контролю доступу використовують картки MIFARE DESFire з криптографічною автентифікацією. Для шафки з інструментами чи дитячого «секретного входу» — цілком достатньо.

Також передбачте механічний спосіб відкрити двері, якщо зникне живлення.

Ідеї

  • Зберігати список карток у NVS і додавати нові «майстер-карткою» без перепрошивки.
  • Надсилати журнал входів у Telegram (див. проєкт «Telegram-бот»).
  • Веб-сторінка для керування списком карток.