# Умный замок
Один из важнейших вопросов при создании умного дома – безопасность.
Защитимся от непрошенных гостей при помощи технологии RFID и карт доступа.
RFID — это технология автоматической бесконтактной идентификации объектов при помощи радиочастотного канала связи.
Любая RFID-система состоит из:
* RFID-метки;
* считывателя информации (RFID-ридера);
* микроконтроллера или компьютера для дальнейшей обработки информации.
Идентификация объектов производится по уникальному цифровому коду, который считывается из памяти электронной метки, прикрепляемой к объекту идентификации.
Мы будем использовать модуль RC522 – RFID-модуль 13.56 МГц с SPI-интерфейсом
![](/assets/images/iot/10/rc522.png)
В RFID-метках, работающих на данной частоте, реализована криптографическая защита, что обеспечивает защиту от копирования и подделки.
**Основные характеристики:**
* Основан на микросхеме MFRC522;
* Напряжение питания: 3.3 V;
* Потребляемый ток: 13-26 mA
* Рабочая частота: 13.56 MHz
* Дальность считывания: 0 ~ 60 мм
* Интерфейс: SPI, максимальная скорость передачи 10 МБит/с
* Размер: 40мм х 60мм
* Чтение и запись 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
#include
// Константы подключения контактов 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)