Lua:在webserver运行时执行函数

时间:2018-02-14 17:14:10

标签: lua webserver esp8266 coroutine nodemcu

我有一个问题,因为有点问题。 我是初学者,与Lua和ESP8266 12-E合作。我正在使用randomnerdtutorials中的一个例子,它使用网络服务器控制LED的颜色。同时我可以用节点红色控制LED颜色。 问题是我想写一个不断淡化不同颜色LED的程序。我写了一个循环,将collors从0增加到999.循环在函数中,从node-red调用。在这个for循环中,ESP在aprox处重置。从我读到的内容我知道for循环和等待输入的web服务器应该同时运行。 任何人都可以给我一个暗示我怎么能做到这一点。我能够中断for循环,但是我无法从web服务器返回,因为没有循环可以放置命令。我希望我的英语是可以理解的。 这是我的代码:

dofile("anmeldedaten.lc")

function led(r, g, b)
    pwm.setduty(5, r)
    pwm.setduty(6, g)
    pwm.setduty(7, b)
end

pwm.setup(5, 1000, 1023)
pwm.setup(6, 1000, 1023)
pwm.setup(7, 1000, 1023)
pwm.start(5)
pwm.start(6)
pwm.start(7)

r=0
g=0
b=0
fade1=1
ic=0 --internal counter
ig=0 -- global counter
fade1on=0


    if srv ~= nil then
      srv:close()
    end

    srv=net.createServer(net.TCP)

    srv:listen(80,function(conn)

        conn:on("receive", function(client,request)
            local buf = "";
            buf = buf.."HTTP/1.1 200 OK\r\n\r\n"
            local _, _, method, path, vars = string.find(request, "([A-Z]+) (.+)?(.+) HTTP");
            if(method == nil)then
                _, _, method, path = string.find(request, "([A-Z]+) (.+) HTTP");
            end
            local _GET = {}
            if (vars ~= nil)then
                for k, v in string.gmatch(vars, "(%w+)=(%w+)&*") do
                    _GET[k] = v
                end
            end
            buf = buf.."<!DOCTYPE html><html><head>";
            buf = buf.."<meta charset=\"utf-8\">";
            buf = buf.."<meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">";
            buf = buf.."<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">";
            buf = buf.."<link rel=\"stylesheet\" href=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css\">";
            buf = buf.."<script src=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js\"></script>";
            buf = buf.."<script src=\"https://cdnjs.cloudflare.com/ajax/libs/jscolor/2.0.4/jscolor.min.js\"></script>";
            buf = buf.."</head><body><div class=\"container\"><div class=\"row\"><h1>ESP Color Picker</h1>";       
            buf = buf.."<a type=\"submit\" id=\"change_color\" type=\"button\" class=\"btn btn-primary\">Change Color</a> ";
            buf = buf.."<input class=\"jscolor {onFineChange:'update(this)'}\" id=\"rgb\"></div></div>";
            buf = buf.."<script>function update(picker) {document.getElementById('rgb').innerHTML = Math.round(picker.rgb[0]) + ', ' +  Math.round(picker.rgb[1]) + ', ' + Math.round(picker.rgb[2]);";      
            buf = buf.."document.getElementById(\"change_color\").href=\"?r=\" + Math.round(picker.rgb[0]*4.0117) + \"&g=\" +  Math.round(picker.rgb[1]*4.0117) + \"&b=\" + Math.round(picker.rgb[2]*4.0117);}</script></body></html>";


            if(_GET.r or _GET.g or _GET.b or _GET.fade1) then
                print(_GET.r, _GET.g,_GET.b,_GET.fade1)

                    if _GET.fade1 == "OFF" then
                        fade1on=0
                        r = _GET.r
                        g = _GET.g
                        b = _GET.b
                        led(r,g,b)
                    elseif _GET.fade1 == "ON" then 
                        ig=0
                        ic=0
                        fade1on=1
                        fade()
                    end
                print(r,g,b,fade1)
            end

            client:send(buf);
            conn:on("sent", function() client:close() end)
            collectgarbage();
        end)   
    end)


function fade()

        for ic=0,999,1 do
            r=ic
            led(r,g,b)
            print(r)
        end
end

1 个答案:

答案 0 :(得分:0)

NodeMCU在线文档包含FAQ,其中包含所有这些内容。非常值得一读。简而言之,API是一个事件驱动的架构,非常node.js。该系统包括一个看门狗定时器,它将重置CPU是任何甚至任务花费太长时间。

实现淡入淡出的正确方法是使用定时器回调来执行LED渐变。再次阅读文档的相关部分。