8 de junho de 2020

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 MillisTimerLib 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: 
 
A instalação pode ser realizada através do gerenciador de bibliotecas da IDE Arduino:
 

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/MillisTimerLib
  Data      : 07/06/2020
  ----------------------------------------------------------------------------------------------*/
#include <MillisTimerLib.h> //https://github.com/fellipecouto/MillisTimerLib [ 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
MillisTimerLib timer_led1(100);  //Led 1 pisca com intervalo de 100 ms
MillisTimerLib timer_led2(250);  //Led 2 pisca com intervalo de 250 ms
MillisTimerLib 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);
  }
}

2 comentários:

  1. Boa tarde nesse caso para não ter o estouro do Millis temos que criar algo ?

    ResponderExcluir