Как интервал времени между событиями в Луа - PullRequest
0 голосов
/ 18 января 2019

Я пишу простой сценарий на языке луа. Если светодиод включен, счетчик будет увеличиваться на 1. Если светодиод выключен более чем на 1 секунду, он сбрасывает счетчик.

Итак, как именно мы рассчитываем такое событие в Луа?

Это то, что я имею и до сих пор тестировал несколько способов.

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 до этого, но не уверен, как это работает.

EDIT:

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 Ответ

0 голосов
/ 18 января 2019

Вы можете использовать os.clock, который возвращает время выполнения ваших программ с момента запуска в секундах.

Возвращает приблизительную величину в секундах процессорного времени, используемого программой. Источник

Эту функцию можно использовать таким образом.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...