Delay com Millis() – Multitarefas
Quando é necessário executarmos várias tarefas ao mesmo tempo, precisamos limitar a utilização do delay() no código fonte, e utilizarmos mais a função millis().
A função millis() retorna o tempo que o microcontrolador está ligado, em milissegundos.
Guardando o valor de tempo que o processo foi executado e comparando com o valor de tempo atual, poderemos calcular quando deve ser executado novamente.
Para facilitar a lógica, fiz a biblioteca MillisTimer que faz o gerenciamento das variáveis para cada processo que for utilizar.
A lógica é simples, mas com a biblioteca, o código fonte fica mais limpo e mais fácil de se trabalhar.
Biblioteca disponível em:
Referências:
Segue o esquema elétrico e o código fonte:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
/*----------------------------------------------------------------------------------------------
Programa : DELAY COM MILLIS - MULTITAREFAS
Descrição : Exemplo de uso da biblioteca para usar a função Millis() como agendador de tarefas
(Cuidado ao usar a função Delay em outras partes do programa)
Autor : Fellipe Couto [ http://www.efeitonerd.com.br ]
GitHub : https://github.com/fellipecouto/MillisTimer
Data : 07/06/2020
----------------------------------------------------------------------------------------------*/
#include <MillisTimer.h> //https://github.com/fellipecouto/MillisTimer [ http://www.efeitonerd.com.br ]
#define LED_1 2
#define LED_2 3
#define LED_3 4
#define LED_4 5
#define BUTTON 6
//Inicialização da biblioteca passando o valor do delay em milissegundos
MillisTimer timer_led1(100); //Led 1 pisca com intervalo de 100 ms
MillisTimer timer_led2(250); //Led 2 pisca com intervalo de 250 ms
MillisTimer timer_led3(1000); //Led 3 pisca com intervalo de 1000 ms (1 segundo)
void setup() {
pinMode(LED_1, OUTPUT);
pinMode(LED_2, OUTPUT);
pinMode(LED_3, OUTPUT);
pinMode(LED_4, OUTPUT);
pinMode(BUTTON, INPUT_PULLUP);
}
void loop() {
//Enquando os leds 1, 2 e 3 permanecem piscando, cada um no seu tempo,
//o led 4 acende somente quando o botão estiver pressionado
//A cada 100ms a função timer() da biblioteca retornará true
if (timer_led1.timer()) {
digitalWrite(LED_1, !digitalRead(LED_1));
}
//A cada 250ms a função timer() da biblioteca retornará true
if (timer_led2.timer()) {
digitalWrite(LED_2, !digitalRead(LED_2));
}
//A cada 1000ms (1 segundo) a função timer() da biblioteca retornará true
if (timer_led3.timer()) {
digitalWrite(LED_3, !digitalRead(LED_3));
}
//Se o botão for pressionado, liga o led
if (digitalRead(BUTTON) == LOW) {
digitalWrite(LED_4, HIGH);
} else {
digitalWrite(LED_4, LOW);
}
}
|




