Перейти к содержанию
Материалы раздела

Таймеры uLua

Таймеры позволяют отложить действие или повторять его с заданным периодом, пока основная программа занимается другой работой.

hw.timer_after(ms, func)
hw.timer_after(ms, func, arg1)
hw.timer_after(ms, func, arg1, arg2)

hw.timer_every(ms, func)
hw.timer_every(ms, func, arg1)
hw.timer_every(ms, func, arg1, arg2)

hw.timer_cancel(timer_id)
  • hw.timer_after(...) -> int создаёт однократный таймер;
  • hw.timer_every(...) -> int создаёт периодический таймер;
  • hw.timer_cancel(timer_id) отменяет таймер.

Обе функции создания возвращают идентификатор, который нужен для отмены.

Таймеры действуют только пока выполняется текущая программа на uLua. Если основная функция завершится, прошивка отменит все ожидающие вызовы. После настройки таймеров оставьте основной цикл работающим; hw.delay_ms() внутри него не мешает обработчикам.

Ограничения

  • функция-обработчик должна быть именованной функцией верхнего уровня;
  • можно передать не больше двух аргументов;
  • одновременно работают не более двух таймеров;
  • задержка или период — от 1 до 65535 мс.

Аргументом может быть int, bool, nil, строковый литерал или встроенное значение наподобие pin и bitset. Строку, созданную во время выполнения оператором .., передавать нельзя: её буфер может быть перезаписан до вызова функции.

Если период истёк несколько раз, пока прежний вызов ещё ожидает выполнения или выполняется, события объединяются в один следующий вызов. Обработчик не прерывает собственное выполнение и не запускается одновременно сам с собой.

Однократный вызов

function blink_once()
    hw.gled(true)
    hw.delay_ms(50)
    hw.gled(false)
end

hw.timer_after(1000, blink_once)

while true do
    hw.delay_ms(100)
end

Через одну секунду функция мигнёт зелёным индикатором один раз.

Периодический вызов с аргументами

function pulse(pin, duration_ms)
    hw.gpio_set(pin, 1)
    hw.delay_ms(duration_ms)
    hw.gpio_set(pin, 0)
end

hw.gpio_init(hw.p1, hw.out)
local timer_id = hw.timer_every(1000, pulse, hw.p1, 25)

while true do
    hw.delay_ms(100)
end

Каждую секунду на hw.p1 формируется импульс длительностью 25 мс.

Отмена

function turn_on_red()
    hw.rled(true)
end

local timer_id = hw.timer_after(500, turn_on_red)
hw.timer_cancel(timer_id)
hw.delay_ms(600)
return 1

После отмены обработчик не будет вызван. Краткое описание этих же функций есть в аппаратном API.