Programação para Arduino – Funções de Temporização

Programação para Arduino – Funções de Temporização

Existem diversas funções que podem ser usadas para inserir temporização em um programa que rode na plataforma Arduino. Com essa temporização é possível pausar a execução do programa por um tempo determinado ou contar a passagem do tempo entre dois momentos específicos.

As funções de temporização disponíveis são:

  • delay()
  • delayMicroseconds()
  • micros()
  • millis()

Vamos estudar cada uma delas separadamente, com um pequeno programa de exemplo para testá-las.

Função delay()

A função delay() pausa a execução do programa por um intervalo de tempo especificado em milissegundos, cujo valor é passado como um parâmetro. Um segundo possui 1000 milissegundos.

Sintaxe:

delay(tempo);

O parâmetro tempo é o número de milissegundos (ms) de pausa. O tipo de dado aceito é unsigned int.

Essa função possui alguns contras em sua utilização. Por exemplo, durante o tempo de pausa não ocorre a leitura de valores em sensores, cálculos matemáticos e nem tampouco a manipulação de pinos – ou seja, o arduino simplesmente “congela” pelo tempo definido na função.

No geral, não se recomenda o emprego da função delay() para pausas a partir de algumas dezenas de milissegundos, exceto para aplicações realmente muito simples.

As interrupções não são desabilitadas durante a pausa de delay(), assim como a comunicação serial em RX.
Uma alternativa mais interessante é o uso da função millis().

Exemplo

Vamos fazer piscar um LED conectado ao pino 9 do Arduino, mantendo-o aceso por 2 segundos e apagado por 1 segundo:

int pino = 9;

void setup() {
  pinMode(pino, OUTPUT);
}

void loop() {
  digitalWrite(pino, HIGH);
  delay(2000);
  digitalWrite(pino, LOW);
  delay(1000);
}

Função delayMicroseconds()

A função delayMicroseconds() pausa a execução do programa por um intervalo de tempo especificado em microssegundos, cujo valor é passado como um parâmetro.

Sintaxe:

delayMicroseconds(tempo);

O parâmetro tempo é o número de microssegundos de pausa. O tipo de dado aceito é unsigned int.

Essa função funciona de forma bastante precisa em temporização a partir de 3μs; em períodos menores ela pode não ter precisão adequada. O maior valor utilizável é 16383 μs (atualmente).

Exemplo

Vamos gerar uma sequência numérica a ser exibida no monitor serial, imprimindo um número a cada cerca de 7 microssegundos:

int valor = 0;

void setup() {
  Serial.begin(9600);
}

void loop() {
  delayMicroseconds(7);
  valor += 1;
  Serial.println(valor);
}

Função micros()

A função micros() retorna o número de microssegundos decorridos desde que a placa do Arduino começou a executar o programa atual – ou seja, o tempo em execução da aplicação.
Esse número é incrementado durante cerca de 70 minutos, sendo zerado após passado esse tempo.

Em placas de Arduino de 16 MHz (como o Arduino Nano), a função possui resolução de 4μs – ou seja, o valor retornado é um múltiplo de 4. Já em placas Arduino de 8 MHz (como o LilyPad), a resolução da função micros() é de 8μs.

Sintaxe:

tempo = micros();

A variável tempo recebe o número de microssegundos (μs) decorridos desde o início do programa. O tipo de dado retornado é unsigned long.

Exemplo

Vamos mostrar no monitor serial o tempo decorrido desde que a aplicação foi iniciada, e fazer acender um LED conectado ao pino 9 do Arduino, quando esse tempo ultrapassar 5 segundos (equivalente a 5 milhões de microssegundos):

int pino = 9;
unsigned long tempo;

void setup() {
  Serial.begin(9600);
  pinMode(pino, OUTPUT);
}

void loop() {
  Serial.print("Tempo decorrido: ");
  tempo = micros();
  Serial.println(tempo);
  if (tempo > 5000000) { 
    digitalWrite(pino, HIGH);
  }
}

Função millis()

A função millis() retorna o número de milissegundos decorridos desde que a placa do Arduino começou a executar o programa atual – ou seja, o tempo em execução da aplicação.
Esse número é incrementado durante cerca de 50 dias, sendo zerado após passado esse tempo.

Sintaxe:

tempo = millis();

A variável tempo recebe o número de milissegundos (ms) decorridos desde o início do programa. O tipo de dado retornado é unsigned long.

Exemplo

Vamos mostrar no monitor serial o tempo decorrido desde que a aplicação foi iniciada, e fazer acender um LED conectado ao pino 9 do Arduino, quando esse tempo atingir exatos 5 segundos (equivalente a 5.ooo ms):

int pino = 9;
unsigned long tempo;

void setup() {
  Serial.begin(9600);
  pinMode(pino, OUTPUT);
}

void loop() {
  Serial.print("Tempo decorrido: ");
  tempo = millis();
  Serial.println(tempo);
  if (tempo > 5000) { 
    digitalWrite(pino, HIGH);
  }
}

É isso aí! Nesta lição vimos como trabalhar com eventos temporais no Arduino, empregando para isso suas funções de temporização.

Até a próxima!

Sobre Fábio dos Reis (1344 Artigos)
Fábio dos Reis trabalha com tecnologias variadas há mais de 25 anos, tendo atuado nos campos de Eletrônica, Telecomunicações, Programação de Computadores e Redes de Dados. É um entusiasta de Unix, Linux e Open Source em geral, adora Eletrônica e Música, e estuda idiomas, além de ministrar cursos e palestras sobre diversas tecnologias em São Paulo e outras cidades do Brasil.
Contato: Website

Escreva um comentário

Seu e-mail não será divulgado


*