Função de atraso arduino, 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:Começando com o Arduino: Guia de um novatoComeçando com o Arduino: Guia de um novatoArduino é uma plataforma electrónica de prototipagem de código aberto baseado em flexível e fácil de usar hardware e software. É destinado a artistas, designers, entusiastas e qualquer pessoa interessada em criar objetos ou ambientes interativos.consulte Mais informação

Conectado ao seu Arduino seria uma única luz LED. Isso iria transformar e desligar a cada segundo ou assim, e continuará até o Arduino é desligado. Este é o programa “Olá Mundo” de Arduino, e ilustra perfeitamente 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 está a coisa: enquanto atraso é útil para demonstrações básicas de como Arduino funciona, você realmente não deve 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 número inteiro ú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.Os princípios de computador Programação 101 - Variáveis ​​e tipos de dadosOs princípios de computador Programação 101 - Variáveis ​​e tipos de dadosTendo introduzido e falou um pouco sobre Programação Orientada a Objetos antes e onde seu xará vem, eu pensei que é hora de passar os princípios absolutos de programação de uma maneira específica não-linguagem. Este...consulte Mais informação

Mas o problema é, o demora() função não é uma boa maneira de fazer a sua espera 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 nonblocking. Ambos fazem o mesmo trabalho, mas de maneiras muito diferentes.

Quando Henry torna-almoço, ele começa por colocar duas rodadas de pão na torradeira. Quando finalmente pings, eo pão saia marrom dourado, Henry coloca-lo em um prato e rachaduras dois ovos em uma frigideira. Mais uma vez, ele fica por como o óleo aparece, e os brancos começam a endurecer. Quando tiver terminado, ele placas-los e começa a fritar duas fatias de bacon. Uma vez que eles são suficientemente crocante, ele leva-los fora da frigideira, coloca-los no prato e começa a comer.

arduino-chef

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

É uma analogia tola, mas ilustra o ponto.

Bloqueio funções 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 seu aplicativo requer que você adquira 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 codificação 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 seguinte é uma demonstração básica de como millis () funciona. Como você verá, a vontade programa acende a luz LED no 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 baseado em um a partir da documentação oficial Arduino - funciona subtraindo o tempo de gravação anterior a partir do momento atual. Se o restante (ie. Tempo decorrido desde o tempo foi gravado passado) é maior do que o intervalo (neste caso, 1000 milissegundos), o programa atualiza o vez anterior variável para a hora 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 que fazer 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 é usada para armazenar se o valor é positivo ou negativo. Especificando que isso só vai ser positivo, 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 forma, 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, constantemente à 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 é acionado, ou ele pára o programa, ou chama uma função, vulgarmente conhecido como interrupção Handler ou um Rotina de interrupção de serviço. Uma vez que este tenha sido concluído, o programa depois volta para o que estava acontecendo.

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

Parece enigmática. Confuso, mesmo. Mas não é. Para ver como eles funcionam, e ver alguns exemplos deles sendo usados ​​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 Alarme de James Bruce.Arduino Night Light and Sunrise Projeto AlarmArduino Night Light and Sunrise Projeto AlarmHoje, nós estaremos fazendo um relógio nascer do sol de alarme, que vai suave e lentamente acordá-lo sem recorrer a uma máquina de fazer barulho ofensiva.consulte Mais informação

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

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


Artigos relacionados