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?
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.
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:
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.
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!
