• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Нужна помощь WeMos D1 mini NodeMCU перезагружается при выполнении программы

Гек

New member
Всем дорого дня.
Люди помогите пожалуйста с проблемкой.
Есть у меня WeMos D1 Mini на ESP8266 12F, я туда залил NodeMCU:
NodeMCU custom build by frightanic.com
branch: master
commit: 5073c199c01d4d7bbbcd0ae1f761ecc4687f7217
SSL: false
modules: bme280,cron,crypto,file,gpio,http,i2c,net,node,rtctime,sntp,spi,tmr,u8g,uart,websocket,wifi
build built on: 2018-02-25 09:04
powered by Lua 5.1.4 on SDK 2.1.0(116b762)

и прописал вот такой вот скетчик (пользуюсь для этого ESPlorer v0.2.0-rc5):
Код:
--GPIO output config
lighton=0
pin=4
timer_period = 500
gpio.mode(pin,gpio.OUTPUT)

--timer config
timer_accelerator=tmr.create()
timer_accelerator:register(timer_period, 1, function()
    if lighton==0 then
    lighton=1
    gpio.write(pin,gpio.HIGH)
    else
    lighton=0
    gpio.write(pin,gpio.LOW)
    end
end)
timer_accelerator:start()


--WiFi AP Settup
wifi.setmode(wifi.STATIONAP)
cfg={}
cfg.ssid="ESPWIFI"
cfg.pwd="1234567890"
wifi.ap.config(cfg)
cfg = nil

--Starting server
sv=net.createServer(net.TCP)

function receiver(sck, data)
    speed = string.sub(data,7)
    while type(speed)~="number" do
        speed =tonumber(speed)
    end
    print(speed)
    --timer_accelerator:interval(timer_period/speed)
end

if sv then
    sv:listen(123, function(conn)
        conn:on("receive", receiver)
        end)
end
на своем смартфоне установил RoboRemoFree, создал там слайдер, который при перемещении ползунка отправляет данные о делителе скорости мигания светодиодом. Данные приходят такие speed X, где Х - это значение делителя скорости. И вот незадача - если в функции receiver() просто выводить принятые данные в консоль, то все в порядке, но если нагрузить чип обработкой данных, то в случае если слайдер потаскать изрядно (создать большой поток данных), NodeMCU вылетает в перезагрузку. Предполагаю, что происходит это потому что каждый прием данных запускает на выполнение отдельный экземпляр функции receiver(), и при большом потоке данных переполняется либо стек вызовов, либо буфер данных. Отсюда вопрос - как заблокировать или даже дропать выполнение функции до завершения текущей (как по мне то связываться с прерываниями дорого по ресурсам выйдет) до выполнения текущего ее экземпляра (выполнение обработки именно текущего значения не критично - оно все равно будет заменено другим при перетаскивании слайдера).
Помогите решить проблему плз или ткните куда читать, а то что-то роюсь в доках а понять куда копать не могу (((
Спасибо заранее.
 
Сверху Снизу