Данный код идет в устройстве и доступен в web-редакторе (может немного отличаться в зависимости от исполнения).
Вы можете самостоятельно или с нашей помощью внести изменения для адаптации алгоритма под вас.
-- import section
rfid = require("rfid")
indication = require("indication")
binascii = require("binascii")
--init section
reader = rfid.ComboReader({mfrc = {reset_pin = pio.GPIO25}, emmarine = {}})
leds = indication.Leds.new({RGB=true, ledPin=pio.GPIO32})
snd = indication.Sound.new(pio.GPIO21)
wdt_on = Settings.get("sys_wdt") == "on"
locker = rfid.OUT(pio.GPIO2)
local params = {
addr = tonumber(Settings.get("net_dest")),
port = uart.UART2,
rxpin = 13,
txpin = 14,
rtspin = 12,
baudrate = 115200,
parity = uart.PARNONE,
clear= true
}
modbus.rtu.init(params.addr, params.port, params.rxpin, params.txpin, params.rtspin, params.baudrate, params.parity, params.clear)
local function webserver()
local web_started = false
local sn = cpu.getmac(0, 1)
return function(num)
if (web_started) then
return
end
if string.sub(sn, -4) == string.format("%02X", num) then
net.wf.setup(net.wf.mode.AP, Settings.get("net_ssid"), Settings.get("net_password"), net.wf.powersave.NONE, 4, false)
net.wf.start()
local pass = Settings.get("sys_pwd")
pcall(dofile, "/romfs/backend.lua")
net.service.tinyweb.start(80, "/romfs/www", (#pass > 0) and pass or nil, log, "backend", backendcb)
web_started = true
end
end
end
if cpu.resetreason() == cpu.RESET_POWERON then
leds:start()
snd:start()
end
--start main loop
reader.process({
timeout_ms = 200,
mode = rfid.MODE_LOOP,
uidtype = rfid.UID_STR,
em_uidtype = rfid.EM_UID_STR,
wdt = wdt_on,
checkfunc = function(uid, reader_type)
local reg = 0
if reader_type == "emmarine" then
reg = 4
end
utable = binascii.unhexlify(uid)
modbus.rtu.setregs8(reg, table.unpack(utable))
end,
waitfunc = function()
local req = {addr = 0xf0, qty = 3, clear = true}
local ret = modbus.rtu.getregs(req.addr, req.qty, req.clear)
local action, web_pwd, new_addr = ret[1], ret[2], ret[3]
if action == 1 then
locker.open()
leds:ok()
snd:ok()
elseif action == 2 then
locker.close()
leds:err()
snd:err()
end
if web_pwd ~= 0 then
web_start(web_pwd)
end
if new_addr ~= 0 then
Settings.set("net_dest", string.format("%d", new_addr & 0xff))
os.exit()
end
end
})