X

Controlando Intervalos de Tempo com Arduino

Veja neste rápido tutorial como controlar intervalos de tempo de forma simples com Arduino, executando tarefas de forma “paralela” sem interromper o processamento .


É muito comum em projetos com Arduino a necessidade de realizarmos certas tarefas em intervalos específicos ao mesmo tempo que executamos  outras operações.
Por exemplo: Ler um sensor ou escrever um texto no LCD enquanto fazemos piscar um LED.

No entanto, sabemos que a plataforma Arduino não é boa nesse quesito pois não suporta o uso de  threads. Dessa forma lançamos mão de artifícios usando a função millis ou então apelamos para o uso de  interrupções.

A solução usando o millis funciona bem mas não é a ideal devido às conhecidas limitações desse comando, além de  deixar o seu código  pouco legível com muitas variáveis e controles.
Felizmente existem algumas bibliotecas que encapsulam em classes toda essa complexidade, oferecendo uma interface simples de ser utilizada. É o que vamos ver neste tutorial, deixando  o conceito de interrupções para uma próxima oportunidade.

O projeto

Para os nossos testes, vamos realizar a seguinte experiência:

  • Três LEDS  (R – G – Y) ligados ao Arduino;
  • O led verde vai piscar a cada 2 segundos, o amarelo a cada 4 segundos e o vermelho a cada 10 segundos;
  • A mesmo tempo, ou seja, de forma “paralela”, vamos fazer uma contagem regressiva recursiva de 10 até 1 no monitor serial.

Material necessário

  • Placa Arduino, ESP*, Attiny* ou qualquer outra compatível com a plataforma Arduino;
  • 3 LEDS de cores variadas;
  • 3 resistores 220 Ohms.

Software Necessário

Timing Library

Essa biblioteca permite, de forma transparente e simplificada, estabelecer intervalos de tempos para realização de tarefas  sem poluir muito seu código.  Ela utiliza o millis para seus cálculos e possui apenas dois métodos:

  • begin → Inicializa o timer.
  • onTimeout → Testa se o intervalo especificado foi atingido. Opcionalmente pode-se indicar uma função para ser executada.

Esquema de montagem

Arduino – Controlando Intervalos de Tempo

Vídeo demonstração

O Sketch

#include <Timing.h>

//Definição dos pinos dos LEDs
#define greenLed 5
#define yellowLed 6
#define redLed 7

// Um timer para cada LED e um para o contador
Timing timerGreen;
Timing timerYellow;
Timing timerRed;
Timing timerContador;
int contador = 11;

void setup(void) {
  //Inicializações
  pinMode(greenLed,OUTPUT);
  pinMode(yellowLed,OUTPUT);
  pinMode(redLed,OUTPUT);
  timerGreen.begin(0); 
  timerYellow.begin(0); 
  timerRed.begin(0); 
  timerContador.begin(0);
  Serial.begin(9600);
}
	

void loop(void)	{
	
  if (timerGreen.onTimeout(2000)) { // Acende/Apaga led Verde a cada 2 segundos
		digitalWrite(greenLed,!digitalRead(greenLed));
  }

  if (timerYellow.onTimeout(4000)) { // Acende/Apaga led Amarelo a cada 4 segundos
    digitalWrite(yellowLed,!digitalRead(yellowLed));
  }

  if (timerRed.onTimeout(10000)) { // Acende/Apaga led Vermelho a cada 10 segundos
    digitalWrite(redLed,!digitalRead(redLed));
  }
  
  if (timerContador.onTimeout(1000)) { //Imprime a contagem regressiva no monitor serial a cada 1 segundo 
    Serial.println((contador > 1) ? --contador : contador = 10);
  }

}

Outras alternativas

  • ArduinoThread – Simula ao uso de Threads permitindo “esquedular” tarefas com tempos variáveis entre elas;
  • Timing Libraries – Uma lista de bibliotecas com o tema “Controle de Tempo”;
  • SimpleTimer – Uma das primeiras libs nesse sentido.
  • ElapsedMillis – Esta lib usa uma técnica interessante: Cria um tipo de variável que incrementa automaticamente. Dessa forma é só compará-la com o intervalo desejado. Dica do amigo Rui Viana do Laboratório de Garagem

Referências

Conclusão

A biblioteca que analisamos é muito simples e apenas encapsula em uma classe o que já vimos em vários sites por aí . No entanto, sua vantagem é o pouco espaço em memória utilizado e a facilidade de uso.

Espero ter sido útil.
Até a próxima…

 

José Cintra:
Related Post