Função de atraso do Arduino e por que você não deve usá-lo

Embora delay () seja útil para demonstrações básicas de como o Arduino funciona, você realmente não deveria usá-lo no mundo real. Aqui está o porquê e o que você deve usar em vez disso.

Embora delay () seja útil para demonstrações básicas de como o Arduino funciona, você realmente não deveria usá-lo no mundo real.  Aqui está o porquê e o que você deve usar em vez disso.
Propaganda

Quando você começou a aprender a desenvolver Introdução ao Arduino: Um Guia do Iniciante Introdução ao Arduino: um Guia do Iniciante O Arduino é uma plataforma de prototipagem eletrônica de código aberto baseada em hardware e software flexível e fácil de usar. É destinado a artistas, designers, amadores e qualquer pessoa interessada em criar objetos ou ambientes interativos. Leia mais sobre o Arduino O que é o Arduino e o que você pode fazer com ele? O que é o Arduino e o que você pode fazer com ele? O Arduino é um pequeno dispositivo eletrônico notável, mas se você nunca usou um antes, o que exatamente eles são eo que você pode fazer com um? Leia mais, você provavelmente construiu um produto que funciona um pouco assim:

Conectado ao seu Arduino seria uma única luz LED. Isso seria desativado a cada segundo, e continuará até que o Arduino seja desativado. Este é o programa “Hello World” do Arduino e ilustra perfeitamente como apenas algumas linhas de código podem criar algo tangível.

liderado por arduino

Eu também estou disposto a apostar que você usou a função delay () para definir os intervalos entre a luz ligada e desligada. Mas aqui está a coisa: enquanto o atraso é útil para demonstrações básicas de como o Arduino funciona, você realmente não deveria usá-lo no mundo real. Aqui está o porquê - e o que você deve usar em vez disso.

Como funciona o atraso ()

A maneira como a função delay () funciona é bem simples. Aceita um único inteiro O Básico da Programação de Computador 101 - Variáveis ​​e DataTypes O Básico da Programação de Computador 101 - Variáveis ​​e DataTypes Tendo introduzido e falado um pouco sobre Programação Orientada a Objetos antes e de onde vem o seu homônimo, achei que é hora de passarmos por os fundamentos absolutos da programação de uma maneira não específica da linguagem. Este argumento ... Leia Mais (ou número). Esse número representa o tempo (medido em milissegundos) que o programa deve esperar até passar para a próxima linha de código.

Mas o problema é que a função delay () não é uma boa maneira de fazer seu programa esperar, porque é conhecida como uma função de "bloqueio".

A diferença entre funções de bloqueio e não bloqueio

Para ilustrar por que as funções de bloqueio são ruins, quero que você imagine dois chefs diferentes em uma cozinha: Henry Blocking e Eduardo NonBlocking . Ambos fazem o mesmo trabalho, mas de formas muito diferentes.

Quando Henry faz o café da manhã, ele começa colocando duas rodadas de pão na torradeira. Quando finalmente pica, e o pão sai dourado, Henry coloca em um prato e quebra dois ovos em uma frigideira. Mais uma vez, ele fica parado enquanto o óleo estala e os brancos começam a endurecer. Quando terminam, ele as prepara e começa a fritar duas fatias de bacon. Uma vez que estejam suficientemente crocantes, ele tira-as da frigideira, coloca-as no prato e começa a comer.

chef arduino

Eduardo trabalha de uma maneira um pouco diferente. Enquanto seu pão está brindando, ele já começou a fritar seus ovos e bacon. Em vez de esperar que um item termine de cozinhar antes de passar para o próximo, ele está cozinhando vários itens ao mesmo tempo . O resultado final é que Eduardo leva menos tempo para fazer o café da manhã do que Henry - e, quando Henry Blocking termina, a torrada e os ovos esfriam.

É uma analogia tola, mas ilustra o ponto.

As funções de bloqueio impedem que um programa faça outra coisa até que essa tarefa específica seja concluída. Se você quiser que várias ações aconteçam ao mesmo tempo, simplesmente não poderá usar delay () .

Em particular, se o seu aplicativo exigir que você constantemente adquira dados de sensores conectados, você deve tomar cuidado para evitar o uso da função delay (), uma vez que pausa absolutamente tudo .

Felizmente, delay () não é a única maneira de fazer seu programa esperar ao codificar para o Arduino.

Conheça Millis ()

A função millis () executa uma única tarefa. Quando chamado, ele retorna (como um tipo de dados longo ) o número de milissegundos decorridos desde que o programa foi lançado pela primeira vez. Então, por que isso é útil?

Porque usando um pouco de matemática simples, você pode facilmente “tempo” aspectos do seu programa sem afetar como ele funciona. A seguir, uma demonstração básica de como millis () funciona. Como você verá, o programa ligará a luz do LED por 1000 milissegundos (um segundo) e, em seguida, desligará. Mas, crucialmente, faz isso de uma maneira que não é de bloqueio.

Agora vamos ver como isso funciona com o Arduino.

arduino-millis-example

Este programa - que é fortemente baseado em um da documentação oficial do Arduino - funciona subtraindo o tempo registrado anteriormente a partir da hora atual. Se o restante (ou seja, o tempo decorrido desde a última gravação) for maior que o intervalo (neste caso, 1000 milissegundos), o programa atualizará a variável previousTime para a hora atual e ativará ou desativará o LED.

E porque é um não bloqueador, qualquer código localizado fora dessa primeira instrução if deve funcionar normalmente.

Simples, não é? Note como nós criamos a variável currentTime como um longo não assinado . Um valor não assinado significa simplesmente que nunca pode ser negativo; Fazemos isso para que o número máximo que possamos armazenar seja maior. Por padrão, as variáveis ​​numéricas são assinadas, o que significa que um “bit” de memória para essa variável é usado para armazenar se o valor é positivo ou negativo. Especificando que só será positivo, temos um pouco mais para brincar.

Interrupções

Até agora, aprendemos sobre uma maneira de abordar o tempo em nosso programa Arduino, que é melhor que delay () . Mas há outra maneira, muito melhor, mas mais complexa: interrompe . Eles têm a vantagem de permitir que você calcule com precisão o seu programa Arduino e responda rapidamente a uma entrada externa, mas de maneira assíncrona .

Isso significa que ele é executado em conjunto com o programa principal, aguardando constantemente que um evento ocorra, sem interromper o fluxo do seu código. Isso ajuda você a responder eficientemente aos eventos, sem afetar o desempenho do processador Arduino.

Quando uma interrupção é acionada, ela pára o programa ou chama uma função, comumente conhecida como Manipulador de Interrupções ou Rotina de Serviço de Interrupção . Depois que isso for concluído, o programa volta ao que estava acontecendo.

O chip AVR alimentando o Arduino suporta apenas interrupções de hardware. Estes ocorrem quando um pino de entrada vai de alto para baixo, ou quando acionado pelos timers internos do Arduino.

Parece enigmático. Confuso mesmo. Mas não é. Para ver como eles funcionam e ver alguns exemplos deles sendo usados ​​no mundo real, acesse a documentação do Arduino.

Não fique bloqueado

Usando millis () admitidamente leva um pouco de trabalho extra quando comparado ao uso de delay () . Mas confie em mim, seus programas vão agradecer por isso, e você não pode fazer multitarefa no Arduino sem ele.

Se você quiser ver um exemplo de millis () usado em um projeto Arduino do mundo real, confira o Arduino Night Light e Sunrise Alarm de James Bruce. Arduino Night Light e Sunrise Alarm Project Arduino Night Light e Sunrise Alarm Project Hoje, vamos fazer um despertador do nascer do sol, que vai gentilmente e lentamente acordá-lo sem recorrer a uma máquina de fazer ruído ofensivo. consulte Mais informação

Encontrou alguma outra função de bloqueio que devemos ser cautelosos? Deixe-me saber nos comentários abaixo, e vamos conversar.

Créditos das fotos: Arduino (Daniel Spiess), Chef (Ollie Svenson)

In this article