lua:init.lua:15:尝试调用方法“ alarm”(nil值)

时间:2019-12-02 22:11:23

标签: lua esp8266

我正在尝试修复我在网上找到的一段代码。 (是的,我知道....) 但是,如果你们能帮我解决这个错误,那就太好了:

错误:lua:init.lua:15:尝试调用方法“ alarm”(nil值)

代码(从此处:https://github.com/Christoph-D/esp8266-wakelight

dofile("globals.lc")

wifi.setmode(wifi.STATION)
wifi.sta.config(WIFI_SSID, WIFI_PASSWORD)
wifi.sta.sethostname(MY_HOSTNAME)
if WIFI_STATIC_IP then
  wifi.sta.setip({ip = WIFI_STATIC_IP, netmask = WIFI_NETMASK, gateway = WIFI_GATEWAY})
end
wifi.sta.connect()

-- Initialize the LED_PIN to the reset state.
gpio.mode(LED_PIN, gpio.OUTPUT)
gpio.write(LED_PIN, gpio.LOW)

tmr.alarm(
  MAIN_TIMER_ID, 2000, tmr.ALARM_AUTO, function ()
    if wifi.sta.getip() then
      tmr.unregister(MAIN_TIMER_ID)
      print("Config done, IP is " .. wifi.sta.getip())
      dofile("ledserver.lc")
    end
  end)

我在那里可以做什么?怎么了?

干杯,谢谢!!

1 个答案:

答案 0 :(得分:1)

全部在手册中。您只需要阅读它即可。

有一个示例,说明如何使用计时器对象的警报方法。

if not tmr.create():alarm(5000, tmr.ALARM_SINGLE, function()
  print("hey there")
end)
then
  print("whoopsie")
end

您试图呼叫tmr.alarm,但它是tobj:alarm。该手册未提及tmr.alarm。该功能已于2019年1月从NodeMCU中删除。

您使用的是在线发现的基于旧版NodeMCU的代码。它正在使用现在不推荐使用的功能。

请参见https://github.com/nodemcu/nodemcu-firmware/pull/2603#issuecomment-453235401

https://github.com/nodemcu/nodemcu-firmware/compare/5b22e1f9aee77095ab99dd6240ebd9dddd1cc5a0..c6444ecb6088d20e95197d808d8303c8093faab5

因此,必须首先创建一个计时器对象,然后才能使用其任何方法。 alarm不再是tmr模块的方法。


修改

首先,您必须创建一个计时器对象https://nodemcu.readthedocs.io/en/latest/modules/tmr/#tobjcreate

local tObj = tmr.create()

然后,您必须register进行回调并start计时器。有一个便捷功能alarm可以为我们完成这一切。

当我们不再需要计时器时,我们必须通过调用来释放资源

tObj:unregister()

尝试类似

-- create a timer object
local tObj = tmr.create()
-- register an alarm
tObj:alarm(2000, tmr.ALARM_AUTO, function ()
    if wifi.sta.getip() then
      tObj:unregister()
      print("Config done, IP is " .. wifi.sta.getip())
      dofile("ledserver.lc")
    end
  end)