RFID-замок на RC522: відкриваємо двері карткою чи брелоком
Зчитувач RC522 розпізнає картки та брелоки 13.56 МГц, ESP32 перевіряє UID за списком і на 3 секунди відкриває електромагнітний замок. Плюс звукова індикація.
Що будуємо
Контроль доступу для шафи, гаража чи майстерні: підносите картку — замок відчиняється, чужа картка — довгий писк і запис у лог. Модуль 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();
}
Реєстрація карток
- Прошийте скетч як є і відкрийте Serial Monitor.
- Прикладіть свої картки — побачите
Unknown card: 04A23B1A6F5E80. - Скопіюйте 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-бот»).
- Веб-сторінка для керування списком карток.