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

Posted

技术标签:

【中文标题】如何在lua中设置事件之间的时间间隔【英文标题】:How to time interval between event in lua 【发布时间】:2019-06-12 21:46:56 【问题描述】:

我正在用 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 返回一个巨大的数字(我假设它在 psecond 而不是秒)。

欢迎提出任何建议或解决方案。在此之前我尝试过 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 而不是打印计数器,因为我会将计数器的值插入另一个函数,该函数将打印与计数器数量相对应的消息

【问题讨论】:

【参考方案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

【讨论】:

这不会只测量程序在开始和结束之间执行任何内容的增量时间,而不是 LED 开启和关闭之间的时间(使用脉冲边缘) 您可以指定开始和结束。在我的示例中,t1 是测量的开始,t2 是测量的结束。 dt 是 t1 和 t2 之间的时间。在循环示例中,dt 是循环每次迭代之间的时间(以秒为单位)。 你能看看我编辑的代码,如果我理解错了告诉我吗?它只为我的计数器返回 0。谢谢 @JackVu 我认为您对第一部分的理解有误。为您的问题提供了完整的逻辑示例。

以上是关于如何在lua中设置事件之间的时间间隔的主要内容,如果未能解决你的问题,请参考以下文章

如何在 coredata 中设置日期和时间间隔的谓词

如何在android中设置自定义分钟间隔timepickerdialog

如何在javascript中设置定时间隔?

如何在 Apache 中设置 mod_lua 以访问第三方 Lua 模块?

如何在 UNNotificationRequest 中设置重复间隔和触发日期

如何在pyspark中设置计数id的日期间隔?