rfid.lua
rfid
Lua-библиотека с единым интерфейсом для работы со считывателями RFID в устройствах ODNFC.
Библиотека предоставляет:
Reader(...)с единым циклом чтения и обработки дляmfrc522,emmarineиhid;- вспомогательные функции
OUT(...)иIN(...)для GPIO; - набор констант режимов и URI-префиксов;
- функции модуля
mfrc522через тот же объектrfid.
Подключение
local rfid = require("rfid")
Константы
- ключ Ultralight:
rfid.KeyUL("UL"); - форматы UID:
rfid.UID_STR,rfid.UID_TUP,rfid.UID_INT,rfid.UID_TAB; - режимы чтения:
rfid.MODE_ONCE,rfid.MODE_LOOP,rfid.MODE_CORO; - URI-префиксы:
rfid.URI_NONE,rfid.URI_HTTP_WWW,rfid.URI_HTTPS_WWW,rfid.URI_HTTP,rfid.URI_HTTPS,rfid.URI_TEL,rfid.URI_MAILTO.
OUT([pin], [initval])
Вспомогательная функция для дискретного выхода.
Аргументы:
pin(опционально): GPIO выхода, по умолчаниюpio.GPIO32.initval(опционально): начальное значение, если передано.
Возвращает объект с методами:
set(val)- установить уровень.open()- вызватьset(0).close()- вызватьset(1).inv()- инвертировать текущее состояние.
Пример:
local lock = rfid.OUT()
lock.open()
thread.sleepms(500)
lock.close()
IN([pin])
Вспомогательная функция для дискретного входа.
Аргументы:
pin(опционально): GPIO входа, по умолчаниюpio.GPIO34.
Возвращает объект с методами:
get()- вернуть текущий уровень пина.pressed()- вернутьtrue, еслиget() == 0.
Пример:
local btn = rfid.IN()
if btn.pressed() then
print("button pressed")
end
Reader([rfid_reader], [format], [read_hid])
Создаёт объект считывателя. Доступны обе формы вызова: rfid.Reader(...) и rfid.Reader.new(...).
Аргументы:
rfid_reader(опционально):"mfrc"(по умолчанию)"emmarine""combo"(оба)
format(опционально): строка формата чтения; дляmfrcпередаётся вmfrc522.scan(format).read_hid(опционально): еслиtrue, добавляется чтение HID.
Возвращает объект с методами:
uid()process(proc_params)
uid()
Последовательно опрашивает подключённые источники и возвращает первое успешное чтение.
Возвращает:
uid, idx- UID и индекс источника (1..N) в порядке подключения.nil- если ничего не считано.
Порядок источников:
mfrcдобавляется первым (если включён).emmarineдобавляется следующим (если включён).hidдобавляется последним (еслиread_hid == true).
process(proc_params)
Универсальный цикл обработки чтений.
Поля proc_params:
mode-rfid.MODE_ONCE | rfid.MODE_LOOP | rfid.MODE_CORO(по умолчаниюMODE_LOOP).timeout_ms- пауза между итерациями вMODE_LOOP(по умолчанию50).wdt- еслиtrue, в цикле вызываетсяcpu.watchdog.reset().checkfunc(uid, idx)- проверка UID.true-> вызываетсяokfunc(uid, idx)false-> вызываетсяerrfunc(uid, idx)nil-> ничего изokfunc/errfunc
okfunc(uid, idx)- обработчик успешной проверки.errfunc(uid, idx)- обработчик неуспешной проверки.waitfunc(uid, idx)- вызывается каждую итерацию.
Возвращаемое значение:
MODE_ONCE/MODE_LOOP: возвращаетuid, idxиз последней итерации.MODE_CORO: возвращает coroutine; внутри корутины на каждой итерацииyield(uid, idx).
Форматы результатов для emmarine и hid
Параметр format задаёт формат результата не только для mfrc522, но и для emmarine и hid:
| format | emmarine type | hid type |
|---|---|---|
"e" или "D" | 1 | 2 |
"E" | 2 | 1 |
"HU*" или "U*" | 4, затем младшие 4 байта | 2 |
| другое/пусто | 0 | 2 |
Примеры
Однократное чтение
local rfid = require("rfid")
local reader = rfid.Reader("combo", "HU*", false)
local uid, idx = reader.uid()
if uid then
print("uid:", uid, "source:", idx)
end
Цикл с колбэками
local rfid = require("rfid")
local reader = rfid.Reader("combo", "HU*", true)
reader.process({
mode = rfid.MODE_LOOP,
timeout_ms = 50,
wdt = false,
checkfunc = function(uid, idx)
return uid ~= nil
end,
okfunc = function(uid, idx)
print("OK", idx, uid)
end,
errfunc = function(uid, idx)
print("ERR", idx, uid)
end,
waitfunc = function()
-- фоновые действия
end,
})