RFID-считыватель undef.space
- впускает админов в спейс по картам MIFARE;
- сообщает о входе и неудачных попытках входа в админской беседе;
- сообщает о статусе механической задвижки в админской беседе.
Устройство состоит из:
- отладочной платы на базе ESP32-C3;
- NFC-считывателя на базе PN532;
- платы реле;
- держателя, закрепляющего устройство на внутренней стороне стены.
Поднесите карту к считывателю. Если авторизация прошла успешно, светодиод загорится зелёным, а дверь откроется. Если нет - светодиод загорится красным.
Чтобы использовать встроенный REPL, подключите устройство по USB и откройте
монитор порта (например, при помощи
idf.py monitor --no-reset -p /dev/ttyUSB0
). Если любая из команд add
,
remove
или list
используется впервые за последние пять минут, нужно будет
ввести пароль. Используйте help
, чтобы узнать список команд с аргументами.
Формат credential
:
T<10 цифр>
- карта Тройка;U<8 hex-цифр>
- любая карта с 4-байтовым UID;U<14 hex-цифр>
- любая карта с 7-байтовым UID.
Hex-значения прописываются в нижнем регистре: например, не U1234ABCD
, а
U1234abcd
.
Текущий держатель сделан из дерева, он примерно соответствует модели в
bracket.scad
.
Соберите детектор задвижки согласно схеме в main/latch.c
. Подключите всё к
отладочной плате согласно распиновке в main/include/config.h
.
Написана на C с использованием ESP-IDF. Чтобы собрать прошивку:
- установите ESP-IDF
- склонируйте репозиторий
- скачайте зависимости:
git submodule update --recursive
- создайте файл
main/include/secrets.h
со следующим содержанием:#pragma once #define WIFI_SSID "название сети" #define WIFI_PASS "пароль сети" #define HASS_KEY "ключ API HomeAssistant" #define REPL_PASS "пароль от REPL" #define TG_KEY "ключ API Telegram" #define TG_CHAT_ID "-123456789"
- получите ключи шифрования и подписи:
- если собираете новое устройство, сгенерируйте ключи:
espsecure.py generate_flash_encryption_key keys/flash.bin
,espsecure.py generate_signing_key --version 1 keys/sign.pem
- если работаете с уже собранным устройством, получите их от админов и
поместите в папку
keys
(файлыflash.bin
иsign.pem
)
- если собираете новое устройство, сгенерируйте ключи:
- соберите проект и загрузите прошивку:
- в самый первый раз:
idf.py build flash monitor
- в последующие разы, в т.ч. для уже собранного устройства:
./flash.sh
- в самый первый раз:
Форматирование:
- отступы: 4 пробела;
- используйте
SCREAMING_SNAKE_CASE
для макросов,snake_case
для всего остального; - названия символов и типов начинайте с названия файла, например
http_init
вhttp.c
; - названия статических символов начинайте с нижнего подчёркивания, например
_http_urlencode
вhttp.c
; - названия типов завершайте на
_t
, напримерhttp_message_t
вhttp.c
; - не ставьте пробел между ключевым словом и скобкой, а открывающуюся фигурную
скобку ставьте на той же строке, например
if(condition) {
; - подключайте внешние файлы в угловых скобках, а файлы проекта - в кавычках,
например
#include <esp_log.h>
, но#include "http.h"
; - ставьте звёздочки в типах слева, например
void* ptr
, а неvoid *ptr
; - ставьте
void
в сигнатуре функции без аргументов, напримерvoid http_init(void)
, - разделяйте подключения на секции: внешние и внутренние, например:
#include <driver/rmt_tx.h> #include <driver/gpio.h> #include <esp_timer.h> #include <esp_log.h> #include "config.h" #include "latch.h" #include "http.h"
Архитектура:
- инициализируйте оборудование и стейт в
_init
функциях, напримерhttp_init
; - циклы задач реализуйте в
_task
функциях, напримерhttp_task
; - не запускайте задачи в инициализаторах, делайте это в
app_main
; - старайтесь не использовать глобальные переменные для обмена данными между файлами - передавайте их через вызовы функций, очереди, буфера и прочие примитивы синхронизации;
- передавайте данные между задачами через очереди в стиле Erlang - каждая задача имеет одну входную очередь с определённым форматом сообщений.