lua:init.lua:15:尝试调用方法'alarm'(空值)

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

错误:lua:init.lua:15:尝试调用方法'alarm'(空值)

代码(来自这里: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()

--将LED_PIN初始化为复位状态。
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.unregisterMAIN_TIMER_IDprint(“完成配置,IP为”..wifi.sta.getip())
      dofile(“ledserver.lc”)
    end
  end

我该怎么做呢? 有什么问题吗?

干杯,谢谢!

点赞
用户2858170
用户2858170

一切都在手册中。你只需要阅读它。

这里有一个如何使用计时器对象的 alarm 方法的示例:

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()

然后,你必须注册一个回调并启动定时器。有一个简便函数 alarm,它可以为我们同时执行两个操作。

当我们不需要计时器时,必须调用以下内容以释放资源:

tObj:unregister()

尝试这样做:

-- 创建计时器对象
local tObj = tmr.create()
-- 注册一个闹钟
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)
2019-12-03 10:15:08