В прошлых заметках на тему MR1132 от nooLite я безуспешно пытался соединить модуль с ESP8266 напрямую, подразумевая, что производитель сделает его в той же логике, что и передатчик MT1132. Попытка не удалась, модуль был соединен с JS платой от Амперки.
Однако, мысль соединить MR1132 c ESP8266 меня не покидала, и диктовалась простой целью: сделать раз и забыть, забросив все на шкаф. Устройство должно снабжать любой мозг умного дома информацией по протоколу mqtt о состоянии устройств nooLite, а также биндиться с новыми или вычеркивать ненужные по команде от MqttSpy. Решение, на мой взгляд, чрезвычайно удобное и полезное. В итоге, была собрана вот такая несложная схема:
Железная часть обведена красным прямоугольником, то что за его пределами к делу отношения не имеет. Что и как соединено хорошо видно или смотрим схему в конце статьи.
Между MR1132 и ESP8266 видна китайская нонэйм прокладка для согласования уровней. В ESP8266 зальем следующий скрипт. Этот же скрипт с пояснениями — по ссылке. Однако заливать следует тот что здесь — меньше объем.
Broker="САЙТ_БРОКЕРА"
port=ПОРТ_БРОКЕРА
myClient="nooLite"
name=myClient
pass="password"
summ = 0
udata =""
ttable = {}
counter = 0
function clearAll()
udata = ""
ttable = {}
counter = 0
summ = 0
end
uart.on("data",1,
function(data)
udata = udata..data
table.insert(ttable, string.byte(data, 1))
counter = counter + 1
if(udata == "OK\r\n") then
print("bind_mode_off\03")
clearAll()
end
if counter == 1 then
tmr.alarm(3, 1000, 0, function()
clearAll()
end )
end
if counter 0x7FF) then
temp = temp - 0x1000
end
temp = temp * 0.1
m:publish(myClient.."/"..ttable[3].."/state",temp,0,0 )
if ttable[8] ~= 0 then
m:publish(myClient.."/".."10"..ttable[3].."/state",ttable[8],0,0)
end
end
end
clearAll()
end
end, 0)
m = mqtt.Client(myClient, 180, name, pass)
m:lwt("/lwt", myClient, 0, 0)
m:on("offline", function(con)
tmr.alarm(1, 120000, 1, function()
m:connect(Broker, port, 0, function(conn)
tmr.stop(1)
m:subscribe(myClient.."/#",0, function(conn)
end)
end)
collectgarbage()
end)
end)
m:on("message", function(conn, topic, data)
if (string.find(topic, "state")) == nil then
local top = string.gsub(topic, myClient.."/","")
local sendto = ""
if top == "1" then
sendto = sendto.."clear_all_cell"
elseif top == "2" then
sendto = sendto.."clear_one_cell_"..data
elseif top == "3" then
sendto = sendto.."bind_mode_cell_"..data
elseif top == "4" then
sendto = sendto.."bind_mode_off"
else
sendto = ""
return
end
sendto = sendto.."\03"
print(sendto)
end
sendto = ""
collectgarbage()
end)
tmr.alarm(0, 1000, 1, function()
if wifi.sta.status() == 5 and wifi.sta.getip() ~= nil then
tmr.stop(0)
m:connect(Broker, port, 0, function(conn)
-- print("connected")
m:subscribe(myClient.."/#",0, function(conn)
end)
end)
end
end)
В результате будем наблюдать такую картинку с помощью MqttSpy:
Теперь общие мысли.
Выполнить задачу «сделал — забросил на шкаф» и в этот раз не удалось. Причина — если во время включения устройства нога RX модуля MR1132 соединена через согласователь уровней с ESP8266, то MR1132 входит в непонятный режим. Иногда он мигает, иногда — его зеленый светодиод горит постоянно, иногда ничего не светится, но всегда — модуль не отвечает. В некоторых случаях MR1132 стирает из памяти весь биндинг.
С чем это связано выяснить не удалось, да и задачи особой не ставил. Решение проблемы простое — в момент включения устройства приемная нога модуля отсоединяется от всего. После включения ее можно соединить. Дальше все работает отлично, как принимается информация, так и происходит дистанционный биндинг.
Не исключаю, что ситуация связана с тем, что в момент старта ESP8266 выдает в порт кучу технической информации. Полагаю, у всех модулей она разная и в других случаях странной реакции MR1132 может не наступать.
Таким образом, если вы решите делать описываемое здесь устройство, полагаю, может потребоваться иметь тумблер на цепи приема информации модулем, который будет замыкаться лишь на время биндинга. Итого, на шкаф, все таки, придется лезть.
Следует ли дальше разбираться с этой проблемой — пока не знаю. Больше склоняюсь к мысли о том, что UART приемник и передатчик от nooLite следует объединить на одной плате — Iskra JS и работать с таким устройством по протоколу mqtt. Iskra, при этом, может выполнять еще кучу полезной работы. В данный момент у меня есть конструкция, которая читает 4 датчика и все еще недозаргужена работой. Поэтому, задействовать у него пару UART портов проблемой не будет.
Ну а кто, все таки, решит сопрягать MR1132 и ESP8266, рекомендую сделать это по следующей схеме (она же у меня и работала в этой заметке):
nooLite: MR1132 && ESP8266.: Один комментарий