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.