Ir para o conteúdo principal

Timers

Introdução

Em sistemas embarcados, a capacidade de controlar e antecipar uma variedade de cenários é essencial. Nesse contexto, os temporizadores desempenham um papel fundamental, por oferecerem controle preciso sobre o tempo e a ordem de eventos em diversas aplicações.

Neste artigo, abordaremos o controle de dois tipos distintos de temporizadores, o timer periódico e o timer one-shot.

Timer periódico

O temporizador periódico é um recurso utilizado para gerar interrupções ou eventos em intervalos pré-definidos de tempo. Seu funcionamento é simples, o temporizador irá iniciar sua contagem de 0 até o valor definido e, quando atinge o valor do período configurado, ele gera uma interrupção ou dispara um evento. Após a interrupção ele reinicia automaticamente.

Este timer pode ser utilizado para piscar LEDs, leitura de sensores, aquisição de dados, dentre outras aplicações.

Timer one-shot

O temporizador one-shot é um recurso utilizado para gerar uma única interrupção em um intervalo pré-definido de tempo. Diferente do timer periódico, este irá disparar apenas uma vez e, em seguida, parar até que seja reiniciado no código.

Este timer pode ser utilizado no debouncing de botões, atrasos programados, temporizar tarefas únicas, dentre outras aplicações.

Recursos necessários

Para iniciar o trabalho com os GPIOs, é essencial possuir o diagrama de pinos da placa à disposição, pois isso vai permitir que você identifique tanto os nomes quanto as funções associadas a cada um deles.

PinoRecurso
IO1LDR
IO2BT6
IO3BT5
IO4BT4
IO5BT3
IO6BT2
IO7BT1
IO8OLED_SDA
IO9OLED_SCL
IO10TFT_DC
IO11TFT_RES
IO12LED AZUL
IO13LED VERDE
IO14LED VERMELHO
IO15DHT11
IO17BUZZER
IO35TFT_SDA
IO36TFT_SCL

Tabela 1 – Franzininho WiFi Lab01 mapeamento de pinos

Código

Com a Franzininho WiFi conectada ao seu computador, abra o Thonny e crie um novo arquivo contendo o código a seguir:

from machine import Pin, Timer
import utime

ledR= Pin(14,Pin.OUT) #definindo o pino 14 (LED vermelho) como saída
temporizador = Timer(0) #definindo timer

ledState = False

def toogleLed ():
global ledState
ledState = not ledState
ledR.value(ledState)

def tempo (timer): #definindo função callback
global ledR
toogleLed() # muda estado do led

temporizador.init(period = 1000, mode = Timer.PERIODIC, callback = tempo)
#configurando timer com frequência de 1Hz e no modo periódico

Vamos começar com from machine import Pin, Timer. Para poder ser acessado os pinos da placa e trabalhar com os timers. O timer foi configurado utilizando a variável temporizador, e o LED selecionado foi o de cor vermelha, que está conectado ao pino 14 da Franzininho WiFi (como verificado na tabela de pinagem).

Para configurar o timer é preciso chamar a função init e preencher alguns parâmetros:

  1. period: esse parâmetro define o tempo que levará para o temporizador atingir zero e gerar uma interrupção. Vamos definir como 1000 (1Hz), isso fará com que o temporizador dure 1 segundo.
  2. mode: esse parâmetro define o modo de funcionamento do temporizador e pode ter um dos seguintes valores:
    1. Timer.PERIODIC – modo que usaremos neste exemplo
    2. Timer.ONE_SHOT
  3. callback: esse parâmetro permite especificar a função de callback que será executada quando o temporizador atingir zero. Essa função de callback é chamada como uma interrupção, então ela deve ser projetada para ser curta e eficiente. A função de callback é “tempo”.

A função de callback, chamada de tempo, será chamada a cada segundo, pois essa foi a duração definida para o temporizador. Seu papel é alterar o status do LED vermelho.

Para controlar o estado do LED vermelho foi criada a função toogle_led. Inicialmente, a variável led_state, que define o estado no LED (on ou off), é definida como false e, a cada vez que a função toggle_led é chamada, ela inverte o estado atual. A função é usada dentro da função callback tempo, isso fará com que a cada segundo o LED vermelho seja alternado entre ligado e desligado. Assim, temos um blink LED.

Note que dentro das funções as variáveis são alteradas para global, isso é feito para garantir que as modificações feitas dentro das funções alterem o valor das variáveis fora delas.

Desativar LED utilizando timer one-shot

Com a Franzininho WiFi conectada ao seu computador, abra o Thonny e crie um novo arquivo contendo o código a seguir:

from machine import Pin, Timer

ledR= Pin(14,Pin.OUT) #definindo o pino 14 (LED vermelho) como saída
temporizador = Timer(0)

def desliga (timer): #definindo função callback
global ledR
ledR.off()
print("led desligado")

print("Iniciando o timer")
temporizador.init(period = 3000, mode = Timer.ONE_SHOT, callback = desliga)
ledR.on()

Vamos começar com from machine import Pin, Timer. Para poder ser acessado os pinos da placa e trabalhar com os timers. O timer foi configurado utilizando a variável temporizador, e o LED selecionado foi o de cor vermelha, que está conectado ao pino 14 da Franzininho WiFi (como verificado na tabela de pinagem).

Para configurar o novo timer foi preciso alterar os seguintes parâmetros:

  1. period: vamos definir como 3000 (3Hz), isso fará com que o temporizador dure 3 segundos.
  2. mode: Timer.ONE_SHOT
  3. callback: a função de callback é “desliga”.

A função de callback, chamada de desliga, será chamada uma vez após passados 3 segundos, pois essa foi a duração definida para o temporizador. Sua finalidade é desativar o LED vermelho, que inicialmente está ligado.

Nesse caso, diferente do timer periódico, o LED irá desligar após o tempo definido e somente será aceso outra vez se a função temporizador.init for chamada novamente.

AutorSthefania Fernandes
Data:15/12/2023