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 programação paralela ou threads. Dessa forma lançamos mão de artifícios usando o comando 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 testar a biblioteca, vamos realizar a seguinte experiência:
- Três LEDS coloridos (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 coloridos;
- 3 resistores 220 Ohms.
Software Necessário
Timing Library
Essa biblioteca permite, de forma transparente e simplificada, estabelecer intervalos de tempos “concorrentes” 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
Vídeo demonstração
O Sketch
#include//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 schedular tarefas com tempos variáveis entre elas
- Timing Libraries – Uma lista de bibliotecas com o tema “Controle de Tempo”;
Referências
- Tutorial Adafruit – Excelente tutorial sobre Multi-tasking e millis no Arduino;
- Blink sem delay – Sketch de exemplo do site oficial do Arduino
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…
O post Controlando Intervalos de Tempo com Arduino apareceu primeiro em BlogDoJoséCintra.