Arduino delay função, e por que você não deve usá-lo

Quando você começou aprender a desenvolver para o Arduino, você provavelmente construído um produto que funciona um pouco como este:

Conectado ao seu Arduino seria uma única luz LED. Isso transformaria e desligar a cada segundo ou assim, e continuará até o Arduino é desligado. Este é o programa "Olá Mundo" de Arduino, e perfeitamente ilustra como apenas algumas linhas de código pode criar algo tangível.

levou-arduino

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

Como Delay () funciona

A forma como o demora() função funciona é bastante simples. Ele aceita um integer única (Ou número) argumento. Este número representa o tempo (medido em milissegundos) o programa deve esperar até passar para a próxima linha de código.

Mas o problema é, o demora() função não é uma boa maneira de fazer a sua espera do programa, porque é o que é conhecido como uma função de "bloqueio".

A diferença entre o bloqueio e funções non-blocking

Para ilustrar porque funções de bloqueio são ruim, eu quero que você imagine dois chefs diferentes em uma cozinha: Henry Blocking, e Eduardo não bloqueante. Ambos fazem o mesmo trabalho, mas de maneiras muito diferentes.

Quando Henry faz café da manhã, ele começa por colocar duas rodadas de pão na torradeira. Quando finalmente pings, eo pão saia marrom dourado, Henry coloca-o em um prato e rachaduras dois ovos em uma frigideira. Novamente, ele está por que o óleo aparece, e os brancos começam a endurecer. Quando terminar, ele placas-los e começa a fritar duas fatias de bacon. Uma vez que está suficientemente crocante, ele leva-los fora da frigideira, coloca-los no prato e começa a comer.

arduino-chef

Eduardo funciona de uma maneira um pouco diferente. Enquanto o pão é brindar, ele já começou a fritar os ovos e bacon. Em vez de esperar um item para terminar de cozinhar antes de passar para próxima, que está cozinhando vários itens concorrentemente. O resultado final é Eduardo leva menos tempo para fazer café da manhã de Henry faz - e pelo tempo que Henry Bloqueio tiver terminado, o brinde e os ovos foram frio.

É uma analogia tola, mas ilustra o ponto.

Bloqueio funções de impedir que um programa de fazer mais nada até que determinada tarefa foi concluída. Se você quiser múltipla ações a acontecer ao mesmo tempo, você simplesmente não pode usar demora().

Em particular, se o seu aplicativo requer que você adquirir constantemente os dados de sensores conectados, você deve tomar cuidado para evitar o uso do demora() função, como ele faz uma pausa absolutamente tudo.

Felizmente, demora() não é a única maneira de fazer a sua espera programa quando codificando para Arduino.

Conheça Millis ()

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

Porque, usando um pouco de matemática simples, você pode facilmente "tempo" aspectos do seu programa sem afetar como ele funciona. O que se segue é uma demonstração básica de como millis () funciona. Como você verá, a vontade programa transforma a luz do LED on para 1000 milissegundos (um segundo), e depois desliga. Mas fundamentalmente, ele faz isso de uma maneira que é non-blocking.

Agora vamos ver como ele funciona com Arduino.

arduino-millis-exemplo

Este programa - Que é fortemente baseada em um da documentação oficial Arduino - Funciona subtraindo o tempo de gravação anterior a partir da hora atual. Se a parte restante (isto é. O tempo decorrido desde a última vez foi gravada) é maior do que o intervalo (neste caso, 1000 milissegundos), o programa actualiza o vez anterior variável para o tempo atual, e quer transforma o LED ligado ou desligado.

E porque é um non-blocking, qualquer código que está localizado fora desse primeiro if deve funcionar normalmente.

Simples, não é? Note como nós criamos a variável hora atual como um não assinado longo. A não assinado valor significa simplesmente que ele nunca pode ser negativa fazemos isso para que o número máximo que pode armazenar é maior. Por padrão, as variáveis ​​numéricas são assinados, o que significa um "bit" de memória para essa variável é usado para armazenar se o valor é positivo ou negativo. Especificando que isso só vai ser positiva, temos um bit extra para jogar. 

interrupções

Até agora, nós aprendemos sobre uma maneira de abordar tempo em nosso programa Arduino que é melhor do que demora(). Mas há um outro, muito melhor maneira, mas mais complexa: interrupções. Estes têm a vantagem de permitir que você cronometrar precisamente o seu programa Arduino, e responder rapidamente a uma entrada externa, mas de uma assíncrono maneira.

Isso significa que ele é executado em conjunto com o programa principal, sempre à espera de um evento a ocorrer, sem interromper o fluxo do seu código. Isso ajuda você a responder eficazmente aos acontecimentos, sem afetar o desempenho do processador Arduino.

Quando uma interrupção é acionada, ou ele pára o programa, ou chama uma função, comumente conhecido como um interrupção Handler ou um Rotina de interrupção de serviço. Uma vez que este tenha sido concluído, o programa, em seguida, volta para o que estava acontecendo.

O chip AVR alimentar o Arduino só suporta interrupções de hardware. Estes ocorrem quando um pino de entrada vai de cima para baixo, ou quando provocado por temporizadores internos do Arduino.

Parece enigmática. Confuso, mesmo. Mas não é. Para ver como eles funcionam, e veja alguns exemplos de que sejam utilizados no mundo real, bateu a documentação Arduino.

Não fique bloqueado

utilização millis () reconhecidamente leva um pouco de trabalho extra quando comparado ao uso demora(). Mas confie em mim, seus programas vai agradecer por ele, e você não pode fazer multitarefa no Arduino sem ele.

Se você quiser ver um exemplo de millis () usado em um projeto do mundo real Arduino, veja Arduino Night Light and Sunrise Relógio de James Bruce.

Encontrado quaisquer outras funções de bloqueio que deve ser cauteloso? Deixe-me saber nos comentários abaixo, e nós vamos conversar.

Créditos das fotos: Arduino (Daniel Spiess)Chefe de cozinha (Ollie Svenson)

» » Arduino delay função, e por que você não deve usá-lo