Tempo de excecução de tarefas no arduino com as funções delay() e millis(). Quais as diferenças entre elas?

 

 

TEMPO DE EXCECUÇÃO DE TAREFAS NO ARDUINO COM AS FUNÇÕES DELAY() E MILLIS(). QUAIS AS DIFERENÇAS ENTRE ELAS?

 

 

O tempo de execução de tarefas no Arduino refere-se ao tempo necessário para que uma determinada tarefa seja concluída ou executada pelo microcontrolador. Quando você programa o Arduino, está essencialmente fornecendo uma série de instruções para o microcontrolador executar em sequência. Cada instrução ou linha de código leva um certo tempo para ser executada, e o tempo total de execução de uma tarefa depende da complexidade da ação que está sendo realizada.

O tempo de execução pode variar de uma tarefa simples, como acender um LED, que geralmente leva apenas alguns milissegundos, até tarefas mais complexas, como ler múltiplos sensores, processar dados e tomar decisões, que podem levar alguns segundos ou mais.

 

É importante levar em consideração o tempo de execução ao desenvolver projetos no Arduino, especialmente ao lidar com tarefas simultâneas ou eventos em tempo real. A otimização do código e a escolha adequada das funções e estruturas de controle podem ajudar a reduzir o tempo de execução e melhorar a eficiência do programa.

Neste artigo, serão exploradas de forma detalhada as funções essenciais para o controle do tempo de execução de tarefas no Arduino. Serão abordados os conceitos fundamentais dessas funções, suas distinções e a maneira efetiva de utilizá-las em seus projetos.

 

Quais são as funções utilizadas pelo Arduino para controlar o tempo de execução de tarefas?

Uma das características essenciais do Arduino é sua capacidade de controlar o tempo de execução de tarefas por meio de funções conhecidas como millis() e delay(). Essas funções desempenham um papel crucial na programação de temporizações e na criação de atrasos precisos. A seguir iremos detalhar cada uma delas.

 

Função delay()

A função delay() é utilizada para criar atrasos ou pausas no programa do Arduino. Ela suspende a execução do código por um determinado número de milissegundos especificado como argumento.

A sintaxe básica da função delay () é simples:

 

 

Onde tempo é o valor em milissegundos pelo qual você deseja atrasar a execução do programa.

Quando o Arduino encontra uma chamada à função delay(), ele interrompe temporariamente a execução das instruções subsequentes. Durante esse intervalo de tempo, o Arduino fica em um estado inativo, aguardando até que o tempo especificado tenha decorrido.

Por exemplo, se quisermos que um LED acenda por 1 segundo e depois apague por 500 milissegundos, podemos usar a função delay() para criar os atrasos necessários. Na figura 1 podemos observar como ficaria o código.

 

Figura 1 – Exemplo de código utilizando a função delay()

 

No entanto, é importante notar que a função delay() tem uma limitação. Durante o tempo especificado em delay(), o Arduino fica inativo e não executa nenhuma outra tarefa. Isso significa que, se você tiver um código complexo com várias ações e chamar a função delay() em algum ponto, todas as operações serão interrompidas até que o tempo especificado tenha decorrido.

Essa limitação pode ser problemática quando você precisa manter a responsividade do programa ou executar tarefas simultâneas. Portanto, ao utilizar a função delay(), é importante considerar cuidadosamente o contexto do seu projeto e garantir que a pausa não afete negativamente a funcionalidade geral do programa.

 

Função millis()

A função millis() é uma função presente no Arduino que retorna o número de milissegundos decorridos desde o início da execução do programa. Ela é utilizada para medir o tempo de maneira precisa e é amplamente empregada para controle temporal e sincronização de tarefas.

Essa função se baseia em uma contagem interna de tempo do Arduino, a qual é iniciada quando o programa começa a ser executado. Essa contagem aumenta constantemente em intervalos de 1 milissegundo. Ao chamar a função millis(), obtemos o valor atual dessa contagem de tempo. A sintaxe básica para usar a função millis() é a seguinte:

 

 

Nesse exemplo, o valor retornado pela função millis() é armazenado em uma variável chamada tempoAtual, que é do tipo unsigned long. Essa variável pode ser usada para comparar o tempo atual com um valor de referência e tomar decisões com base nessa comparação.

Em microcontroladores Arduino baseados no ATmega328P (como o Arduino Uno), o tipo unsigned long possui um limite máximo de 4.294.967.295 (ou seja, 2^32 - 1). Isso significa que quando o tempo decorrido atinge esse valor, a variável unsigned long volta a zero e o "overflow" ocorre.

 

Para converter esse valor em dias, podemos fazer a seguinte conta:

 

 

Realizando os cálculos temos:

 

 

Portanto, o valor de 4.294.967.295 milissegundos equivale a aproximadamente 49,7 dias. Esse é o período máximo que pode ser alcançado usando a função millis() antes que ocorra o "overflow". Após esse tempo, a variável unsigned long retornará a zero e começará a contar novamente.

Podemos usar a função millis() para verificar se um determinado período de tempo decorreu e, em seguida, prosseguir com a próxima ação. Isso permite que o programa continue executando outras tarefas enquanto aguarda o tempo desejado.

Na Figura 2 apresentamos um código simples que demonstra o uso da função millis() para criar um atraso de 1 segundo.

 

Figura 2 – Exemplo de código utilizando a função millis()

 

No exemplo apresentado, o LED é conectado ao pino 13 do Arduino (você pode alterar o número do pino de acordo com sua configuração). O LED irá piscar em um intervalo de 1 segundo (1000 milissegundos).

A cada vez que o loop é executado, a função millis() é usada para obter o tempo atual. Se tiverem passado pelo menos 1 segundo desde o último piscar do LED, o estado do LED é invertido usando digitalWrite() e digitalRead(). Isso faz com que o LED pisque em um intervalo regular de 1 segundo.

Você pode ajustar o valor da variável intervalo para controlar a frequência de piscagem do LED. Por exemplo, se você definir intervalo = 500, o LED piscará a cada meio segundo.

 

Quais as diferenças entre as funções delay() e millis()?

Embora ambas as funções estejam relacionadas ao tempo, elas possuem diferenças significativas em seu comportamento e aplicação.

A principal diferença entre as funções é que a função delay() bloqueia a execução do programa durante o atraso, enquanto a função millis() permite que outras tarefas sejam realizadas ao mesmo tempo.  Mesmo a função delay() sendo mais simples de usar, ela pode impedir o funcionamento adequado de outras partes do código, especialmente em projetos que requerem multitarefa ou resposta em tempo real. Por outro lado, a função millis() permite criar atrasos não bloqueantes, permitindo que o programa execute outras tarefas enquanto aguarda um determinado período de tempo.

 

Qual delas devo utilizar, delay() ou millis()?

A escolha entre a função delay() e millis() depende do contexto e dos requisitos específicos do seu projeto. Aqui estão algumas diretrizes que podem ajudá-lo a decidir qual função utilizar:

Simplicidade: Se o seu projeto é relativamente simples e não requer multitarefa ou resposta em tempo real, a função delay() pode ser suficiente. Ela é fácil de usar e não exige uma lógica complexa.

Multitarefa: Se você precisa realizar várias tarefas simultaneamente ou precisa garantir uma resposta em tempo real, a função millis() é mais adequada. Ela permite criar atrasos não bloqueantes, permitindo que o programa execute outras tarefas enquanto aguarda.

Responsividade: Se o tempo é crítico para o seu projeto e você precisa responder a eventos em tempo real, a função millis() é preferível. Com ela, você pode controlar o tempo de execução com mais precisão e garantir que outras partes do código sejam processadas prontamente.

Complexidade: Se o seu projeto é complexo, com lógica condicional e várias tarefas interdependentes, a função millis() é mais flexível. Ela permite que você crie uma lógica mais avançada para controlar o tempo de execução e gerenciar as diferentes partes do programa.

Em geral, se você está começando com um projeto simples e não precisa de multitarefa ou resposta em tempo real, a função delay() pode ser mais conveniente. Porém, à medida que seu projeto se torna mais complexo e exige multitarefa, responsividade ou lógica avançada de tempo, a função millis() se torna uma opção mais poderosa e indicada.

Lembre-se de que você também pode combinar ambas as funções em seu código, usando delay() em alguns pontos e millis() em outros, conforme necessário. A escolha da função depende da natureza específica do seu projeto e dos requisitos de tempo e execução que você precisa atender.

 

Conclusão

Saber distinguir e utilizar os métodos de controle do tempo de excecução de tarefas no arduino é fundamental para o programador. A função delay() é um ótimo ponto de partida e pode ser utilizada para realizar várias tarefas simples. Ela é um dos primeiros comandos que normalmente se aprende, porém, à medida que se avança e se desenvolve códigos mais complexos, é importante se familiarizar com a função millis(). A função millis() permite executar códigos mais complexos, com múltiplas tarefas, sem as pausas que atrasam o código o que acaba comprometendo a velocidade de resposta do programa.