3.3. Temporizadores virtuales

La página Temporización cubrió las marcas de tiempo y los bucles no bloqueantes impulsados por time.ticks_diff(). Un temporizador virtual es la cara opuesta: el software le pide al entorno de ejecución que llame a una función según una planificación, y el entorno invoca la función de retorno (callback) sin que el script tenga que comprobar el reloj él mismo.

3.3.1. La clase machine.Timer

machine.Timer construye un temporizador virtual. El comportamiento entre puertos requiere el id especial -1; todo lo demás – período, modo, callback – se establece mediante argumentos con nombre:

from machine import Timer

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

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

La función de retorno (callback) se invoca como cualquier llamada de función ordinaria – puede asignar objetos, usar print() y llamar a otro código de biblioteca sin ninguna restricción especial.

3.3.2. Periódico y de un solo disparo

Hay dos modos disponibles:

  • Timer.PERIODIC (el valor por defecto). La función de retorno se dispara cada period milisegundos, indefinidamente, hasta que se llama a deinit() o se reinicializa el temporizador.

  • Timer.ONE_SHOT. La función de retorno se dispara una vez, period milisegundos después de init(), y el temporizador entonces se detiene.

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

deinit() detiene un temporizador periódico y cancela cualquier función de retorno pendiente:

tim.deinit()

3.3.3. Cuándo recurrir a un temporizador

Los temporizadores virtuales y el patrón de sondeo con ticks_diff() de Temporización resuelven el mismo problema desde direcciones opuestas. Un bucle de sondeo comprueba el reloj en cada iteración y actúa cuando ha pasado suficiente tiempo; un temporizador le pide al entorno de ejecución que despierte al script cuando ha pasado suficiente tiempo.

  • Sondeo ticks_diff. Todo se queda en un solo lugar – el bucle es dueño de la temporización, sin funciones de retorno adicionales que rastrear. Lo mejor para trabajo corto y bien definido que une varias tareas dirigidas por el tiempo.

  • Temporizador virtual. Saca la planificación del cuerpo del bucle. Lo mejor cuando la tarea periódica es independiente del flujo principal (un LED de latido, una muestra periódica de un sensor) y permite que el bucle principal dedique su tiempo a otro trabajo.

Ambos enfoques usan el mismo reloj subyacente y ofrecen la misma precisión en períodos de un milisegundo o más. Ninguno es apropiado para la conmutación precisa de pines ni para la generación de formas de onda por debajo del milisegundo – la latencia de la función de retorno es del orden del tick del planificador, no de nanosegundos.