# Умный замок Один из важнейших вопросов при создании умного дома – безопасность. Защитимся от непрошенных гостей при помощи технологии RFID и карт доступа. RFID — это технология автоматической бесконтактной идентификации объектов при помощи радиочастотного канала связи. Любая RFID-система состоит из: * RFID-метки; * считывателя информации (RFID-ридера); * микроконтроллера или компьютера для дальнейшей обработки информации. Идентификация объектов производится по уникальному цифровому коду, который считывается из памяти электронной метки, прикрепляемой к объекту идентификации. Мы будем использовать модуль RC522 – RFID-модуль 13.56 МГц с SPI-интерфейсом ![](/assets/images/iot/10/rc522.png) В RFID-метках, работающих на данной частоте, реализована криптографическая защита, что обеспечивает защиту от копирования и подделки. **Основные характеристики:** * Основан на микросхеме MFRC522; * Напряжение питания: 3.3&nbsp;V; * Потребляемый ток: 13-26&nbsp;mA * Рабочая частота: 13.56&nbsp;MHz * Дальность считывания: 0 ~ 60&nbsp;мм * Интерфейс: SPI, максимальная скорость передачи 10&nbsp;МБит/с * Размер: 40мм х 60мм * Чтение и запись RFID-меток. Для работы со считывателем понадобится библиотека <https://github.com/miguelbalboa/rfid>. ### Схема подключения Схема подключения типовая – раз связь осуществляется по SPI, то и используем аппаратный SPI контроллера WeMos D1. ![](/assets/images/iot/10/rfid.svg) | WeMos D1 | RFID-RC522 | |----------|------------| | 3V3 | VCC | | GND | GND | | D3 | RST | | D5 | SCK | | D6 | MISO | | D7 | MOSI | | D8 | SDA | ### Пример программы ```c #include <SPI.h> #include <MFRC522.h> // Константы подключения контактов RST и SS #define RST_PIN D3 //Pin on WeMos D1 #define SS_PIN D8 //Pin on WeMos D1 MFRC522 mfrc522(SS_PIN, RST_PIN); // Идентификатор карты unsigned long uid = 0; void setup() { Serial.begin(115200); // Инициализация монитора последовательного порта while (!Serial); // Ожидание включения монитора последовательного порта SPI.begin(); // Инициализация SPI шины mfrc522.PCD_Init(); // Инициализация RC522 ShowReaderDetails(); // Вывод данных о модуле RC522 Serial.println(F("Scan PICC to see UID, type, and data blocks...")); } void loop() { // Поиск новой метки if ( ! mfrc522.PICC_IsNewCardPresent()) { return; } // Выбор метки if ( ! mfrc522.PICC_ReadCardSerial()) { return; } // Вывод данных с карты uid = 0; Serial.print("Card UID:"); for (byte i = 0; i < mfrc522.uid.size; i++) { uid <<= 8; uid += mfrc522.uid.uidByte[i]; } String stringUID = String(uid, HEX); stringUID.toUpperCase(); Serial.println("Card UID: " + stringUID); // Останавливаем модуль считывателя до следующего раза mfrc522.PICC_HaltA(); } // Функция вывода данных о модуле RFID (RC522) void ShowReaderDetails() { // Получение номера программной версии модуля RC522 byte v = mfrc522.PCD_ReadRegister(mfrc522.VersionReg); Serial.print(F("MFRC522 Software Version: 0x")); Serial.print(v, HEX); if (v == 0x91) Serial.print(F(" = v1.0")); else if (v == 0x92) Serial.print(F(" = v2.0")); else Serial.print(F(" (unknown)")); Serial.println(""); // Когда получено 0x00 или 0xFF, передача данных нарушена if ((v == 0x00) || (v == 0xFF)) { Serial.println(F("WARNING: Communication failure, is the MFRC522 properly connected?")); } } ``` ### Готовое устройство ![](/assets/images/iot/10/rfid.jpg) ## Задача 1. При обнаружении карты отослать сообщение в топик **itschool/lock/code**. 2. Подписаться на топик **itschool/lock/status** и если знчение больше нуля – зажечь светодиод на плате WeMos D1 на указанное число секунд (имитация открытия замка). [к списку задач](iot/summer/tasks)