我有一个问题,因为有点问题。 我是初学者,与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
答案 0 :(得分:0)
NodeMCU在线文档包含FAQ,其中包含所有这些内容。非常值得一读。简而言之,API是一个事件驱动的架构,非常node.js
。该系统包括一个看门狗定时器,它将重置CPU是任何甚至任务花费太长时间。
实现淡入淡出的正确方法是使用定时器回调来执行LED渐变。再次阅读文档的相关部分。