3.3. Виртуальные таймеры

Страница Отсчёт времени рассматривала временные метки и неблокирующие циклы, управляемые time.ticks_diff(). Виртуальный таймер – это обратная сторона: программа просит среду выполнения вызывать функцию по расписанию, и среда выполнения вызывает функцию обратного вызова без необходимости скрипту самому проверять часы.

3.3.1. Класс machine.Timer

machine.Timer создаёт виртуальный таймер. Кросс-портовое поведение требует специального id -1; всё остальное – период, режим, функция обратного вызова – задаётся через именованные аргументы:

from machine import Timer

def tick(t):
    print("tick")

tim = Timer(-1)
tim.init(period=100, callback=tick)   # 10 Hz

Функция обратного вызова вызывается как любой обычный вызов функции – она может выделять объекты, вызывать print() и обращаться к другому библиотечному коду без каких-либо особых ограничений.

3.3.2. Периодический и одноразовый режимы

Доступны два режима:

  • Timer.PERIODIC (по умолчанию). Функция обратного вызова срабатывает каждые period миллисекунд, бесконечно, пока не будет вызван deinit() или таймер не будет повторно инициализирован.

  • Timer.ONE_SHOT. Функция обратного вызова срабатывает один раз, через period миллисекунд после init(), после чего таймер останавливается.

Timer(-1).init(mode=Timer.ONE_SHOT, period=2000, callback=fire)

deinit() останавливает периодический таймер и отменяет любой ожидающий вызов:

tim.deinit()

3.3.3. Когда стоит использовать таймер

Виртуальные таймеры и паттерн опроса ticks_diff() со страницы Отсчёт времени решают одну и ту же задачу с противоположных сторон. Опрашиваемый цикл проверяет часы на каждой итерации и действует, когда прошло достаточно времени; таймер просит среду выполнения разбудить скрипт, когда прошло достаточно времени.

  • Опрос ticks_diff. Всё остаётся в одном месте – цикл владеет отсчётом времени, не нужно отслеживать дополнительные функции обратного вызова. Лучше всего подходит для короткой, чётко определённой работы, которая связывает воедино несколько задач, управляемых временем.

  • Виртуальный таймер. Выносит расписание за пределы тела цикла. Лучше всего, когда периодическая задача независима от основного потока выполнения (мигающий светодиод-индикатор работы, периодическая выборка с датчика), и позволяет главному циклу тратить время на другую работу.

Оба подхода используют одни и те же базовые часы и дают одинаковую точность при периодах в миллисекунду и более. Ни один из них не подходит для точного переключения выводов или генерации сигналов с разрешением менее миллисекунды – задержка функции обратного вызова имеет порядок тика планировщика, а не наносекунд.