Этот скетч реализует систему контроля доступа, которая:
Считывает RFID-метки (карты/брелоки)
Сверяет с базой разрешенных меток
Управляет электромагнитным замком
Отправляет уведомления в Telegram
Ведет журнал доступа на SD-карте
Необходимые компоненты:
Arduino Uno/Nano
RFID-модуль RC522
Электромагнитный замок (12V)
Релейный модуль
Модуль SD-карты
ESP8266 (для WiFi)
Источник питания 12V
Диод 1N4007 (для защиты от ЭДС)
Светодиоды (красный/зеленый)
Зуммер (опционально)
Полный скетч
#include <SPI.h> #include <MFRC522.h> #include <ESP8266WiFi.h> #include <WiFiClientSecure.h> #include <SD.h> #include <TimeLib.h> #define RST_PIN 9 #define SS_PIN 10 #define RELAY_PIN 7 #define GREEN_LED 3 #define RED_LED 4 #define BUZZER 5 MFRC522 mfrc522(SS_PIN, RST_PIN); // Настройки WiFi const char* ssid = "your_SSID"; const char* password = "your_PASSWORD"; // Настройки Telegram const char* botToken = "botXXXXXX:your_token"; const char* chatID = "your_chat_id"; // База разрешенных меток String allowedTags[] = { "A1B2C3D4", "E5F6G7H8" }; void setup() { Serial.begin(9600); SPI.begin(); pinMode(RELAY_PIN, OUTPUT); digitalWrite(RELAY_PIN, LOW); pinMode(GREEN_LED, OUTPUT); pinMode(RED_LED, OUTPUT); pinMode(BUZZER, OUTPUT); mfrc522.PCD_Init(); // Инициализация SD-карты if (!SD.begin(8)) { Serial.println("SD Card error"); digitalWrite(RED_LED, HIGH); } // Подключение к WiFi WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println("WiFi connected"); } void loop() { // Проверка новой метки if (!mfrc522.PICC_IsNewCardPresent() || !mfrc522.PICC_ReadCardSerial()) { delay(50); return; } String tagID = ""; for (byte i = 0; i < mfrc522.uid.size; i++) { tagID += String(mfrc522.uid.uidByte[i], HEX); } tagID.toUpperCase(); bool accessGranted = false; for (String allowedTag : allowedTags) { if (tagID == allowedTag) { accessGranted = true; break; } } // Управление доступом if (accessGranted) { grantAccess(tagID); } else { denyAccess(tagID); } // Журналирование logAccess(tagID, accessGranted); mfrc522.PICC_HaltA(); delay(1000); } void grantAccess(String tag) { digitalWrite(GREEN_LED, HIGH); digitalWrite(RELAY_PIN, HIGH); tone(BUZZER, 1000, 200); Serial.println("Access GRANTED for tag: " + tag); sendTelegramAlert("✅ Доступ разрешен: " + tag); delay(3000); // Удержание замка 3 сек digitalWrite(RELAY_PIN, LOW); digitalWrite(GREEN_LED, LOW); } void denyAccess(String tag) { digitalWrite(RED_LED, HIGH); tone(BUZZER, 300, 1000); Serial.println("Access DENIED for tag: " + tag); sendTelegramAlert("⛔ Доступ запрещен: " + tag); delay(2000); digitalWrite(RED_LED, LOW); } void logAccess(String tag, bool granted) { File logFile = SD.open("access.log", FILE_WRITE); if (logFile) { String logEntry = String(now()) + "," + tag + "," + (granted ? "GRANTED" : "DENIED"); logFile.println(logEntry); logFile.close(); } } void sendTelegramAlert(String message) { WiFiClientSecure client; if (!client.connect("api.telegram.org", 443)) { Serial.println("Telegram connection failed"); return; } String url = "/bot" + String(botToken) + "/sendMessage?chat_id=" + String(chatID) + "&text=" + message; client.print(String("GET ") + url + " HTTP/1.1\r\n" + "Host: api.telegram.org\r\n" + "Connection: close\r\n\r\n"); }
Как это работает:
RFID-считывание:
Модуль RC522 обнаруживает метки
Уникальный ID преобразуется в строку
Проверка доступа:
Сравнение с базой разрешенных меток
Разрешение/запрет доступа
Управление замком:
Реле активирует электромагнит на 3 секунды
Светодиодная и звуковая индикация
Telegram-уведомления:
ESP8266 отправляет сообщения через бота
Формат: ✅/⛔ + ID метки
Журналирование:
Каждое событие записывается на SD-карту
Формат: timestamp, ID метки, статус
Подключение компонентов:
RC522:
SDA → D10
SCK → D13
MOSI → D11
MISO → D12
IRQ → Не подключен
GND → GND
3.3V → 3.3V
Реле:
IN → D7
VCC → 5V
GND → GND
COM → Замок 12V+
NO → 12V+
SD-модуль:
CS → D8
MOSI → D11
MISO → D12
SCK → D13
VCC → 5V
ESP8266:
TX → D2 (Arduino RX)
RX → D3 (Arduino TX)
CH_PD → 3.3V
VCC → 3.3V
Улучшения системы:
Добавьте RTC модуль для точного времени:
#include "RTClib.h" RTC_DS3231 rtc; // В setup(): if (!rtc.begin()) { Serial.println("RTC error"); }
Режим офлайн-работы при потере WiFi:
if (WiFi.status() != WL_CONNECTED) { storeOfflineEvent(tagID, granted); }
Админ-режим для добавления новых меток:
if (tagID == "MASTER_TAG") { enterLearningMode(); }
Энергосбережение:
#include <LowPower.h> // В loop(): if (noActivity) { LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF); }
Настройка Telegram-бота:
Создайте бота через @BotFather
Получите chat ID через @getidsbot
Вставьте данные в скетч:
const char* botToken = "bot123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11"; const char* chatID = "123456789";
Эта система идеальна для:
Контроля доступа в помещения
Умных шкафчиков
Систем учета рабочего времени
Защищенных хранилищ
Стоимость реализации: ~2500-3000руб. Время сборки: 1-2 часа.