nooLite: MR1132 && ESP8266.

В прошлых заметках на тему MR1132 от nooLite я безуспешно пытался соединить модуль с ESP8266 напрямую, подразумевая, что производитель сделает его в той же логике, что и передатчик MT1132. Попытка не удалась, модуль был соединен с JS платой от Амперки.

Однако, мысль соединить MR1132 c ESP8266 меня не покидала, и диктовалась простой целью: сделать раз и забыть, забросив все на шкаф. Устройство должно снабжать любой мозг умного дома информацией по протоколу mqtt о состоянии устройств nooLite, а также биндиться с новыми или вычеркивать ненужные по команде от MqttSpy. Решение, на мой взгляд, чрезвычайно удобное и полезное. В итоге, была собрана вот такая несложная схема:

ESP_MR

Железная часть обведена красным прямоугольником, то что за его пределами к делу отношения не имеет. Что и как соединено хорошо видно или смотрим схему в конце статьи.

Между 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:

ESP_MR02

Теперь общие мысли.

Выполнить задачу «сделал — забросил на шкаф» и в этот раз не удалось. Причина — если во время включения устройства нога RX модуля MR1132 соединена через согласователь уровней с ESP8266, то MR1132 входит в непонятный режим. Иногда он мигает, иногда — его зеленый светодиод горит постоянно, иногда ничего не светится, но всегда — модуль не отвечает. В некоторых случаях MR1132 стирает из памяти весь биндинг.

С чем это связано выяснить не удалось, да и задачи особой не ставил. Решение проблемы простое — в момент включения устройства приемная нога модуля отсоединяется от всего. После включения ее можно соединить. Дальше все работает отлично, как принимается информация, так и происходит дистанционный биндинг.

Не исключаю, что ситуация связана с тем, что в момент старта ESP8266 выдает в порт кучу технической информации. Полагаю, у всех модулей она разная и в других случаях странной реакции MR1132 может не наступать.

Таким образом, если вы решите делать описываемое здесь устройство, полагаю, может потребоваться иметь тумблер на цепи  приема информации модулем, который будет замыкаться лишь на время биндинга. Итого, на шкаф, все таки, придется лезть.

Следует ли дальше разбираться с этой проблемой — пока не знаю. Больше склоняюсь к мысли о том, что UART приемник и передатчик от nooLite следует объединить на одной плате — Iskra JS и работать с таким устройством по протоколу mqtt. Iskra, при этом, может выполнять еще кучу полезной работы. В данный момент у меня есть конструкция, которая читает 4 датчика и все еще недозаргужена работой. Поэтому, задействовать у него пару UART портов проблемой не будет.

Ну а кто, все таки, решит сопрягать MR1132 и ESP8266, рекомендую сделать это по следующей схеме (она же у меня и работала в этой заметке):

ESP_MR03

 

nooLite: MR1132 && ESP8266.: Один комментарий

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход /  Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход /  Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход /  Изменить )

Connecting to %s