3.3. Temporizadores virtuais

A página de temporização abordou timestamps e ciclos não bloqueantes baseados em time.ticks_diff(). Um temporizador virtual é o lado oposto: o software pede ao runtime que chame uma função num horário definido, e o runtime invoca o callback sem que o script tenha de verificar o relógio por si próprio.

3.3.1. A classe machine.Timer

machine.Timer constrói um temporizador virtual. O comportamento entre ports requer o id especial -1; tudo o resto – período, modo, callback – é definido através de argumentos por palavra-chave:

from machine import Timer

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

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

O callback é invocado como qualquer chamada de função ordinária – pode alocar objetos, usar print() e chamar outro código de biblioteca sem quaisquer restrições especiais.

3.3.2. Periódico e de disparo único

Estão disponíveis dois modos:

  • Timer.PERIODIC (o padrão). O callback dispara a cada period milissegundos, indefinidamente, até que deinit() seja chamado ou o temporizador seja reinicializado.

  • Timer.ONE_SHOT. O callback dispara uma vez, period milissegundos após init(), e o temporizador pára depois.

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

deinit() para um temporizador periódico e cancela qualquer callback pendente:

tim.deinit()

3.3.3. Quando usar um temporizador

Os temporizadores virtuais e o padrão de polling com ticks_diff() de temporização resolvem o mesmo problema de direções opostas. Um ciclo com polling verifica o relógio a cada iteração e age quando já passou tempo suficiente; um temporizador pede ao runtime que acorde o script quando já passou tempo suficiente.

  • Polling com ticks_diff. Tudo fica num único lugar – o ciclo controla a temporização, sem callbacks adicionais para gerir. Mais indicado para trabalho curto e bem definido que liga várias tarefas temporizadas.

  • Temporizador virtual. Move o agendamento para fora do corpo do ciclo. Mais indicado quando a tarefa periódica é independente do fluxo principal (um LED de heartbeat, uma amostragem periódica de sensor) e permite que o ciclo principal use o seu tempo em outro trabalho.

Ambas as abordagens usam o mesmo relógio subjacente e dão a mesma precisão para períodos de um milissegundo ou mais. Nenhuma é adequada para alternância precisa de pinos ou geração de formas de onda abaixo do milissegundo – a latência do callback é da ordem do tick do agendador, não de nanossegundos.