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); } } |