Air105开发板上,有三颗不同颜色的LED,官方提供的gpio样例中,就包含了轮流点亮三颗LED代码,具体如下:
local P1, P2, P3 = pin.PD14, pin.PD15, pin.PC3
local LEDA = gpio.setup(P1, 0, gpio.PULLUP)
local LEDB = gpio.setup(P2, 0, gpio.PULLUP)
local LEDC = gpio.setup(P3, 0, gpio.PULLUP)
sys.taskInit(function()
local count = 0
while 1 do
sys.wait(1000)
LEDA(count % 3 == 0 and 1 or 0)
LEDB(count % 3 == 1 and 1 or 0)
LEDC(count % 3 == 2 and 1 or 0)
log.info("GPIO", "P", (count % 3) 1)
count = count 1
end
end)
在该实例中,启动一个task,然后死循环,间隔1000毫秒,点亮下一个LED。
在Air105使用的openluat中,还提供了定时器操作,可以让我们以更有效的方式,来实现流水灯,代码如下 :
local count = 0
sys.timerLoopStart(function()
LEDA(count % 3 == 0 and 1 or 0)
LEDB(count % 3 == 1 and 1 or 0)
LEDC(count % 3 == 2 and 1 or 0)
log.info("GPIO_TIMER", "P", (count % 3) 1)
count = count 1
end,1000)
上述代码中,使用sys.timerLoopStart()系统调用,启动了一个循环定时器,每隔1000毫秒运行一次,这样运行的效率将会更高。
这个定时器使用起来非常方便,而且操作起来也比较简单。
定时器有两种类类型,分别是:
- 单次定时器 :也就是一定时间后执行一次。
sys.timerStart(log.info,1000,"1s timer")
sys.timerStart(function()
log.info("1s timer function")
end,1000)
- 循环定时器 :也就是每间隔一定时间,执行一次
local loopId = sys.timerLoopStart(log.info,2000,"2s loop timer")
sys.timerLoopStart(function()
log.info("2s timer function")
end,2000)
启动一个定时器后,如果还没有到达执行时间,我们还可以把他取消掉,停止其继续执行。
local loopId = sys.timerLoopStart(log.info,2000,"2s loop timer")
sys.timerStart(function()
sys.timerStop(loopId)
log.info("stop 2s loop timer")
end,6000)
以上代码,将会在每2秒输出一次"2s loop timer",但在第三次输出也就是第6秒的时候,取消循环定时器,从而不再继续输出。
通过定时器,可以完成定时检测、定时响应和定时控制的工作,例如:
- 定时数据上报
- 指示灯:可以用在联网或者数据传输的指示灯上,在操作的过程中,通过循环定时器亮灭LED进行提示;而等操作完成的时候,再取消定时器。
- 演示代码中的watchdog,实际上也是一种特殊的定时器,而定时喂狗,就使用了上面说的sys.timerLoopStart()来进行。
if wdt then
wdt.init(15000)
sys.timerLoopStart(wdt.feed, 10000)
end