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!
Escreva um comentário