Você já deve ter ouvido falar no millis, uma função muito utilizada em programas mais avançados envolvendo Arduino, mas para que serve o millis?

Circuitos leds vermelho e verde com millis

O millis() é uma função do Arduino que retorna o número de milisegundos que se passaram desde que o programa atual começou a rodar, ou seja: rodou o programa, o “millis” começa a contar.

Até aí ok, mas por qual motivo eu deveria usar o millis nos meus programas?

Comparativo Millis x Delay

A função delay() é a forma mais comum de se aguardar algum tempo nos programas envolvendo Arduino para realizar alguma tarefa. Exemplo: Quero manter um led aceso por 5 segundos e depois desligar. Então no programa eu ligo o led, aguardo 5 segundos (usando a função delay) e depois desligo. Nesse intervalo de 5 segundos, praticamente toda a execução do programa pára aguardando o final desse tempo, ou seja, não consigo fazer nada nesse intervalo.

Seria como se, por exemplo, eu acordasse as 9 da manhã e tivesse uma reunião marcada para as 14 h. Se eu usasse o “delay” na minha vida, eu olharia o relogio as 9 h e ficaria sentado no sofá sem fazer nada até as 14 h, quando seria a hora da minha reunião. Aí sim eu poderia sair e fazer as minhas tarefas.

Pessoa aguardando o horário

Se por outro lado eu usasse o “millis”, isso significa que eu poderia acordar as 9 h, olhar o relógio de vez em quando para ver se já são 14 h e continuar realizando as minhas tarefas normalmente até esse horário. Percebeu a diferença?

O millis() no Arduino

No Arduino então eu posso usar o millis para checar se o tempo desejado já foi atingido, sem que eu precise parar as outras atividades. Posso por exemplo piscar um led em intervalos de 5 segundos sem deixar de ler os dados de um sensor, ou enviar dados para um display durante uma contagem de tempo qualquer.

Vamos usar esse exemplo do led com o circuito abaixo, onde usamos um Arduino Uno e um led conectado na porta digital 4:

Circuito Arduino e Led

O nosso programa com delay ficaria assim, piscando o led em intervalos de 1 segundo:

//Programa: Pisca led usando delay
//Autor: Arduino e Cia

//Pino do led
int pinoLed = 4;

//Estado do led: aceso ou apagado
int estadoLed = LOW;

//Intervalo de tempo entre acionamentos do led (em milisegundos)
const long intervalo = 1000;

void setup()
{
  //Define o pino do led como saida
  pinMode(pinoLed, OUTPUT);
}

void loop()
{
  //Inverte o estado do led
  if (estadoLed == LOW)
  {
    estadoLed = HIGH;
  } else {
    estadoLed = LOW;
  }

  //Acende ou apaga o led
  digitalWrite(pinoLed, estadoLed);

  //aguarda o intervalo especificado para continuar o programa
  delay(intervalo);
}

No caso de usarmos millis, temos uma variável que armazena o valor do tempo atual (currentMillis) e outra que é alterada conforme o intervalo é atingido (previousMillis). Essa variável é atualizada constantemente conforme o led é aceso:

//Programa: Pisca led usando millis
//Autor: Arduino e Cia

//Pino do led
int pinoLed = 4;

//Estado do led: aceso ou apagado
int estadoLed = LOW;

//Armazena o valor (tempo) da ultima vez que o led foi aceso
unsigned long previousMillis = 0;

//Intervalo de tempo entre acionamentos do led (em milisegundos)
const long intervalo = 1000;

void setup()
{
  //Define o pino do led como saida
  pinMode(pinoLed, OUTPUT);
}

void loop()
{
  unsigned long currentMillis = millis();

  //Verifica se o intervalo já foi atingido
  if (currentMillis - previousMillis >= intervalo)
  {
    //Armazena o valor da ultima vez que o led foi aceso
    previousMillis = currentMillis;

    //Inverte o estado do led
    if (estadoLed == LOW)
    {
      estadoLed = HIGH;
    } else {
      estadoLed = LOW;
    }

    //Acende ou apaga o led
    digitalWrite(pinoLed, estadoLed);
  }
}

Apesar do programa com millis ter ficado maior (e um pouco mais complexo), temos a opção de realizar outras tarefas enquando o tempo não é atingido, ou seja, o loop continua funcionando durante o intervalo de 1 segundo que nós colocamos.

Mais uma aplicação com millis()

Nesse outro exemplo, vamos usar dois leds, com cada um piscando em um intervalo: o vermelho a cada 2 segundos e o verde a cada 1 segundo. Adicionei ao circuito um led verde na porta digital 6.

Circuito millis Arduino Uno

Usei o programa anterior como base e dupliquei as variáveis de intervalo e de armazenamento do tempo em que o led foi acionado:

//Programa: 2 Leds com millis
//Autor: Arduino e Cia

//Pinos dos leds
int pinoLedVermelho = 4;
int pinoLedVerde = 6;

//Armazena o estado dos leds
int estadoLedVermelho = LOW;
int estadoLedVerde = LOW;

//Armazena o valor (tempo) da ultima vez que o led foi aceso
unsigned long previousMillisLedVermelho = 0;
unsigned long previousMillisLedVerde = 0;

//Intervalo de tempo entre acionamentos do led (em milisegundos)
const long intervaloLedVermelho = 2000;
const long intervaloLedVerde = 1000;

void setup()
{
  //Define o pino do led como saida
  pinMode(pinoLedVermelho, OUTPUT);
  pinMode(pinoLedVerde, OUTPUT);
}

void loop()
{
  unsigned long currentMillis = millis();

  //Verifica se o intervalo do Led Vermelho já foi atingido
  if (currentMillis - previousMillisLedVermelho >= intervaloLedVermelho)
  {
    //Armazena o valor da ultima vez que o led foi aceso
    previousMillisLedVermelho = currentMillis;

    //Inverte o estado do led
    if (estadoLedVermelho == LOW)
    {
      estadoLedVermelho = HIGH;
    } else {
      estadoLedVermelho = LOW;
    }

    //Acende ou apaga o led
    digitalWrite(pinoLedVermelho, estadoLedVermelho);
  }
  
  //Verifica se o intervalo do Led Verde já foi atingido
  if (currentMillis - previousMillisLedVerde >= intervaloLedVerde)
  {
    //Armazena o valor da ultima vez que o led foi aceso
    previousMillisLedVerde = currentMillis;

    //Inverte o estado do led
    if (estadoLedVerde == LOW)
    {
      estadoLedVerde = HIGH;
    } else {
      estadoLedVerde = LOW;
    }

    //Acende ou apaga o led
    digitalWrite(pinoLedVerde, estadoLedVerde);
  }
}

O único inconveniente da função millis() é que ela “só” dura 50 dias. Depois disso, o contador é zerado.

Gostou dos exemplos de uso da função millis com Arduino? Então confira outros posts sobre Arduino aqui mesmo no blog!

5/5 - (55 votes)