Função millis Arduino: Aprendendo na prática

Quantas vezes você já tentou criar um projeto com a função millis Arduino e não conseguiu?

Antigamente, na minha cabeça a função millis era difícil, complexa e eu me recusava a utilizá-la, mas com o tempo, eu percebi que o problema não é a função millis.

O problema está na lógica de programação para trabalhar com essa função. Até o final desse artigo, eu vou te mostrar que trata-se mais de lógica do que da própria função millis. Vamos lá!

O que é a função Millis?

A millis é uma função que tem a finalidade de te retornar o tempo desde o momento em que o Arduino foi energizado. Esse tempo é entregue em valores de milissegundos.

Pronto! Até esse momento, eu quero que você compreenda apenas esse conceito. A seguir, eu vou te mostrar mais conceitos para facilitar o seu entendimento no passo a passo da minha explicação.

Sabendo que ela nos retorna esse tempo, como fazemos para ativá-la?

O processo de ativação consiste em chamá-la em nosso código. Quando a chamamos, um temporizador do CHIP do Arduino é atividado e, a cada chamada de função ela retorna o valor do tempo contado por esse temporizador.

O seu funcionamento, de forma bem simples, pode ser visto no bloco de código abaixo.

Veja como tudo é simples!

Na linha 3 inicializamos a serial para imprimirmos o valor da contagem da millis no monitor serial. Posteriormente, na linha 8 executamos a função millis.

A função irá pegar o valor da contagem desde que o Arduino foi ligado e retornará esse valor para a variável tempo_atual. Por fim, na linha 9, imprimimos o valor lido no monitor serial.

Percebe como a função millis é simples. Todo o seu funcionamento se resume a isso! Esse é o primeiro código que você deve executar para entendê-la.

Pegar o valor do temporizador ativado desde a energização do Arduino e retornar o valor para uma variável. Simples!

Entretanto, eu volto a te afirmar: o grande segredo de ser bom com a função millis Arduino está na sua lógica de programação. Uma boa lógica de programação vai te fazer dominar a função millis Arduino. Eu vou te provar isso a seguir.

Descomplicando a função millis Arduino na prática

O primeiro passo para você entendê-la, é aplicá-la em uma situação real. O que eu vou te ensinar, foi porque eu apliquei em um projeto e funcionou muito bem. Vamos lá.

Há alguns anos atrás, eu precisei desenvolver um projeto para automação de um sistema de proteção de uma máquina e o cliente pediu a seguinte funcionalidade a seguir.

Desenvolver uma função para desligar um LED Ultra-Violeta quando o atuador da máquina ficasse, por mais de 3 segundos, parado próximo de uma determinada região da máquina.

Esse sistema evitaria que o LED aquecesse a estrutura e a danificasse pelo excesso de calor.

O que eu fiz para monitorar o tempo do atuador parado?

Eu utilizei um sensor fim de curso e em seguida, apliquei a função millis Arduino para contar o tempo que o sensor estava acionado. Caso esse tempo fosse maior que 3 segundos, o LED deveria ser desligado.

Desenvolvi um circuito similar ao que está sendo apresentado na Figura 1.

circuito função millis Arduino

Figura 1 – Circuito do Projeto de controle do relé com LED Ultra-Violeta.

O circuito acima utiliza um botão para representar o sensor fim de curso e o LED vermelho é utilizado para representar o LED ultra-violeta da aplicação.

O relé é acionado com nível lógico baixo e sempre que ocorre o seu acionamento, os contatos do LED serão abertos, pois ele está conectado nos contatos normalmente aberto do relé.

Além disso, utilizamos duas alimentações diferentes para o relé. A alimentação do Arduino foi utilizada para alimentar os pinos de acionamento da bobina do relé. Entretanto, a alimentação do LED é feita através de outra fonte de alimentação por baterias/pilhas. Isto tem a finalidade de isolar as alimentações do circuito.

A seguir, vou te explicar toda a lógica de controle do projeto.

A lógica de controle com a função millis Arduino

Foi por meio dessa aplicação prática, que eu resolvi trazer o código abaixo para você. Ele foi a solução utilizada para esse problema. O código e bastante simples e, como já falei pra você, o problema é solucionado com 90% de lógica e 10% de função millis Arduino. Vamos lá!

Primeiramente, declaramos as variáveis tempo_atual e ultimo_tempo para manipular os valores obtidos com a função millis Arduino. É obrigatório você declará-las como unsigned long, pois esse é o tamanho do dado que a função millis Arduino retorna.

Depois disso, entramos na função setup e configuramos os pinos do LED e do botão como saída e entrada, respectivamente.

Após a função setup, temos a função loop. Toda a lógica de controle acontecerá nela. Agora, eu vou detalhar o função millis Arduino nesse projeto. Você verá que ela é simples.

A lógica é muito simples. Nas linhas 12 e 13, fazemos a leitura do estado do botão e a função millis Arduino retorna o valor do tempo para a variável tempo_atual.

Suponha, nesse momento, que o botão não está pressionado e o valor retornado para millis seja 500. Dessa forma, temos a variável pino com valor 0 e a tempo_atual com valor de 500.

Considerando esses valores, vamos para a linha 15. Nela, podemos analisar se o estado do pino é 0. Essa condição será verdadeira, pois a variável pino possui valor 0.

O fluxo de código entrará na condição e armazenará o valor 500 da variável tempo_atual na variável ultimo_tempo. Em seguida, o LED será desligado.

Mas, afinal, qual a diferença entre a variável tempo_atual e ultimo_tempo?

A variável tempo_atual sempre guarda o valor que a millis retorna no ciclo atual de execução do loop. Enquanto que a variável ultimo tempo é utilizada como referencia para armazenar um tempo anterior retornado pela função millis.

Por isso que chama-se ultimo_tempo. Faça a seguinte pergunta: o que acontece quando eu não pressiono o botão/sensor?
Ele entra na primeira condição e guarda esse valor do tempo_atual na variável ultimo_tempo, para que ele seja usado como referência de tempo, quando o botão for pressionado.

Preste atenção nisso: ele não entrará primeira condição quando o botão for pressionado. Esse valor de referência lido ficará armazenado na variável ultimo_tempo. Por que? Porque a variável pino possui valor igual a 1 e ele não entra mais na condição de pino igual a 0.

Dessa forma, esse variável não terá mais o seu valor atualizado e permanecerá com esse valor guardado.

Agora que você aprendeu sobre a diferença entre essas duas variáveis, vamos falar da próxima condição. Ela é o coração do projeto. Por meio dela, vamos conseguir detectar se o sensor/botão já passou mais de 3 segundos acionados.

Monitorando o tempo de acionamento com a função millis Arduino

A terceira condição é a responsável por realizar o acionamento do LED, quando o botão/sensor passa mais de 3 segundos acionados.

A condição acima é responsável por fazer duas coisas:

  • Verificar se o botão está pressionado (pino == 1)
  • Verificar se o botão/sensor está acionado com tempo maior ou igual a 3 segundos (tempo_atual – ultimo_tempo >= 3000)

Afinal, como ela funciona? Vou te ensinar agora!

Suponha que o sistema ficou rodando por 3 segundos e o usuário não havia pressionado o botão. Logo, o fluxo de código continuou a entrar na primeira condição, que é apresentada abaixo.

Como o sistema está rodando há 2 segundos, a variável ultimo_tempo e a variável tempo_atual terá o valor de 2000 e o LED estará desligado.

Agora, imagine que no próximo ciclo do loop, o botão foi pressionado e o novo tempo retornado pela millis seja de 2500. O que acontecerá nesse momento? Vou te explicar a seguir.

A variável pino receberá o valor 1, porém, não entrará mais na condição acima.

Em seguida, ela irá testar a segunda condição, que está citada novamente abaixo.

Essa condição não será verdadeira no momento de verificação. Embora o pino possua valor 1, mas a diferença entre a variável tempo_atual e ultimo_tempo será menor que 3000.

Perceba que o fluxo não entrou na primeira condição e a variável tempo_anterior permaneceu com o valor 2000. Portanto, a diferença entre essas duas variáveis é de 500. Desse modo, o valor é menor que 3000 ms e o sistema não acionará o LED.

Nesse momento, perceba uma coisa importante: enquanto o botão está pressionado, o valor da variável ultimo_tempo permanecerá com 2000 e não será atualizado, pois o fluxo de código não entrará em nenhuma das duas condições.

O tempo continua contando com millis

Perceba, também, que conforme o tempo passa e o botão está pressionado, apenas o valor da variável tempo_atual será atualizado, pois a cada ciclo é feita uma nova leitura do tempo. Agora, considere que o usuário continua com o botão pressionado, vários ciclos se passaram e o fluxo não entrou em nenhuma das condições, pois nenhuma foi verdadeira.

Imagine que, nesse momento, o valor retornado pela função millis para a variável tempo_atual seja de 4950.

Embora já tenha passado algum tempo com o botão pressionado, o fluxo ainda não conseguirá entrar na segunda condição, pois a diferença entre as duas variáveis será de 2950, já que não ocorreu alteração na variável ultimo_tempo (2000).

Agora, imagine que no próximo ciclo, a função millis Arduino retornou um valor de 5050 para a variável tempo_atual.

O que acontecerá quando a condição abaixo for executada novamente?

Nessa hora o LED será acionado, pois o botão está pressionado (pino = 1) e a diferença entre as variáveis tempo_atual (5050) e a variável ultimo_tempo (2000) é maior que 3000.

O fluxo entrará na condição, ligará o LED conectado no pino digital 2 a atualizará o valor da variável ultimo_tempo para 5050.

Perceba, portanto, que a função millis Arduino é 90% lógica e 10% a própria função. Ela é simples.

Desse modo, enquanto você ficar com o botão/sensor pressionado, a cada 3 segundos o sistema irá mandar desativar o relé. Existe uma estrutura lógica de controle, que te permite acionar apenas 1 vez, mas eu resolvi deixar dessa forma, para que fique simples para o seu entendimento.

Em último caso, se o usuário soltar o botão ou o sensor não estiver detectando, o sistema desligará o LED novamente através da primeira condição do programa.

Sugestão de Aplicação com essa lógica

Essa lógica pode ser utilizada em sistemas para resetar as configurações do dispositivo para as configurações de fábrica. Se você apertar o botão do roteador de internet e segurá-lo por alguns segundos, perceberá que ele irá resetar.

O nome da rede e senha serão alteradas para as configurações de fábrica. Tudo isso acontece, depois que você pressiona o botão por mair de 3 a 5 segundos.

Desafio você a implementar esse sistema. Caso você tenha ficado em dúvidas, você pode acionar o botão do WhatsApp aqui na página ou assistir uma de nossas aulas sobre a função millis Arduino.

Conclusão

Eu provei pra você que a sua dificuldade não é em utilizar a função millis, mas em estruturar a lógica de programação para aplicá-la em seus projetos. Nesse projeto, 90% dele foi desenvolvido por lógica de programação. E, finalmente, apresentei pra você uma funcionalidade de um projeto que eu desenvolvi para um cliente.

Se você se interessa em aprender assuntos relacionados ao desenvolvimento de projetos e soluções  com o Arduino, deixo esse artigo para você aprender a conquistar novos clientes para desenvolver projetos.

Espero ter te ajudado e qualquer dúvida, clique no botão do WhatsApp e fale comigo. Seja bem-vindo à nossa Escola Robô Lúdico! 🙂

Comments
  • André Feliciano

    Ótima explicação. Parabéns. Detalhe que nas outras explicações não tem é o nome das variáveis em português : ultimo_tempo e atual_tempo. Isso ajuda na hora de entender

    Reply
Post a Comment

Fale com o Professor!
Enviar Mensagem!