如何在lua中的事件之间间隔时间

时间:2019-01-18 15:42:03

标签: lua

我正在用lua编写一个简单的脚本。如果LED点亮,则计数器将增加1。如果LED指示灯熄灭1秒钟以上,它将重置计数器。

那么我们如何精确地在lua中计时事件呢?

这就是我到目前为止所进行的多种测试。

function ReadADC1()
    local adc_voltage_value = 0
    adc_voltage_value = tonumber(adc.readadc()) * 2 -- 0.10 --get dec number out of this -- need to know where package adc come from
    --convert to voltage
    adc_voltage_value = adc_voltage_value *0.000537109375 --get V
    adc_voltage_value = math.floor(adc_voltage_value *1000 +0.5) --since number is base off resolution

    --print (adc_voltage_value)
    return adc_voltage_value

end
-- end of readADC1() TESTED

function interval()
local counter1 =0 
ledValue = ReadADC1()
if (ledValue >= OnThreshHold) then
    ledStatus = 1
    t1=os.time()
else
    ledStatus = 0
    t2 = os.time()
end

--counter1 =0
for i=1,20 do
if (ledStatus == 1) then -- if led is off for more than 1 second, reset counter = 0
counter1 = counter1 + 1
elseif ((ledStatus ==0 and ((os.difftime(os.time(),t2)/100000) > 1000))) then -- increment counter when led is on
counter1 = 0

end
end
print (counter1)

结束 我肯定知道间隔的逻辑是错误的,因为os.time返回了一个很大的数字(我以秒为单位,而不是秒)。

欢迎任何建议或解决方案。在此之前,我尝试过vmstarttimer和vmstoptimmer,但不确定如何运行。

编辑:

function counter()

    local ledValue = ReadADC1()
        local t1 = os.clock()   
        while true do
            local t2 = os.clock()
            local dt = t2 - t1
            t1 = t2

            if ((ledValue < OnThreshHold) and (dt < 1)) then -- if led is off for less than 1 second
                ledCounter = ledCounter + 1
            elseif ((ledValue < OnThreshHold) and (dt > 1)) then-- if led is off for more than 1 second
                ledCounter = 0;
            else
                ledCounter = ledCounter
            end
            print (ledCounter)
        end

end

最终,它将返回ledCounter而不是打印计数器,因为我将将counter的值插入另一个函数,该函数将打印对应于counter数量的消息

1 个答案:

答案 0 :(得分:1)

您可以使用os.clock来返回程序的运行时间(以秒为单位)。

  

以秒为单位返回该程序使用的CPU时间量的近似值。    Source

可以通过这种方式使用此功能。

local t1 = os.clock() -- begin
local t2 = os.clock() -- end
local dt = t2 - t1    -- calulate delta time

-- or looped

local t1 = os.clock() -- begin
while true do
    local t2 = os.clock() -- end
    local dt = t2 - t1    -- calulate delta time
    t1 = t2               -- reset t1

    -- use dt ...
end

-- or wait for time elapsed
-- runs until 1 second passed    

local t1 = os.clock()
while (os.clock() - t1) < 1 do
    -- do stuff while dt is smaller than 1

    -- could even reset timer (t1) to current to 
    -- repeat waiting
    -- t1 = os.clock() | ...
end

-- logic for your example

function counter()
    local time = os.clock()
    local lastLedOn = false
    local counter = 0

    while true do
        if os.clock() - time > 1.0 then
            break
        end

        if getLedValue() == on then -- replace
            time = os.clock()

            if not lastLedOn then
                lastLedOn = true
                counter = counter + 1

                -- print(counter) | or here if you want to print repeatedly
            end
        end
    end

    print(counter)
end -- was unable to test it