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

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

Quando você começou aprendendo a desenvolver para o arduino , você provavelmente criou um produto que funciona um pouco assim:





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





Também estou disposto a apostar que você usou o atraso() função para definir os intervalos entre o acendimento e o apagamento da luz. Mas o problema é o seguinte: embora o atraso 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 no lugar.





Como funciona o Delay ()

A maneira como atraso() função funciona é muito simples. Ele aceita um único argumento inteiro (ou número). Este 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 atraso() não é uma boa maneira de fazer seu programa esperar, porque é conhecida como função de 'bloqueio'.



como transferir dados de um pc para outro

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 maneiras totalmente diferentes.

Quando Henry faz o café da manhã, ele começa colocando duas rodelas de pão na torradeira. Quando finalmente pings , e o pão fica marrom dourado, Henry o coloca em um prato e quebra dois ovos em uma frigideira. Mais uma vez, ele fica parado enquanto o óleo explode e os brancos começam a endurecer. Quando terminam, ele os coloca nos pratos e começa a fritar duas fatias de bacon. Assim que estiverem suficientemente crocantes, ele tira da frigideira, coloca no prato e começa a comer.





Eduardo trabalha de uma maneira um pouco diferente. Enquanto o pão está torrando, ele já começou a fritar os ovos com bacon. Em vez de esperar que um item termine de cozinhar antes de passar para o próximo, ele está cozinhando vários itens simultaneamente . 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 já esfriam.

É uma analogia boba, mas ilustra o ponto.





Bloqueando funções impedem um programa de fazer qualquer outra coisa até que essa tarefa específica seja concluída. Se você quiser vários ações acontecer ao mesmo tempo, você simplesmente não pode usar atraso() .

Em particular, se seu aplicativo requer que você adquira constantemente dados de sensores conectados, você deve tomar cuidado para evitar o uso do atraso() função, uma vez que faz uma pausa absoluta tudo .

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

Conheça Millis ()

o millis () função executa uma única tarefa. Quando chamado, ele retorna (como um grande tipo de dados) 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 'cronometrar' aspectos de seu programa sem afetar como ele funciona. A seguir está uma demonstração básica de como o millis () funciona. Como você verá, o programa acenderá a luz do LED por 1000 milissegundos (um segundo) e, em seguida, desligará. Mas, crucialmente, ele o faz de uma maneira que não bloqueia.

Agora vamos ver como isso funciona com o Arduino.

Este programa - que é fortemente baseado em um da documentação oficial do Arduino - funciona subtraindo a hora gravada anterior 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 atualiza o vez anterior variável para a hora atual, e liga ou desliga o LED.

como verificar qual GPU você tem Windows 10

E porque é um não-bloqueio, qualquer código localizado fora desse primeiro declaração if deve funcionar normalmente.

Simples, não é? Observe como criamos a variável hora atual como um não assinado grande. Um não assinado valor significa simplesmente que nunca pode ser negativo; fazemos isso para que o número máximo que podemos armazenar seja maior. Por padrão, as variáveis ​​de número 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. Ao especificar que será apenas positivo, temos um bit extra para brincar.

Interrupções

Até agora, aprendemos sobre uma maneira de abordar o tempo em nosso programa Arduino, que é melhor do que atraso() . Mas há outra maneira, muito melhor, mas mais complexa: interrupções . Eles têm a vantagem de permitir que você defina o tempo preciso de seu programa Arduino e responda rapidamente a uma entrada externa, mas em um assíncrono maneiras.

Isso significa que ele roda em conjunto com o programa principal, esperando constantemente a ocorrência de um evento, sem interromper o fluxo do seu código. Isso o ajuda a responder com eficiência aos eventos, sem afetar o desempenho do processador Arduino.

Quando uma interrupção é disparada, ela para o programa ou chama uma função, comumente conhecida como Manipulador de interrupção ou um Interromper a rotina de serviço . Depois de concluído, o programa volta ao que estava acontecendo.

O chip AVR que alimenta o Arduino só oferece suporte a interrupções de hardware. Eles ocorrem quando um pino de entrada vai de alto para baixo ou quando acionado pelos temporizadores integrados do Arduino.

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

Não seja bloqueado

Usando millis () reconhecidamente dá um pouco de trabalho extra em comparação com o uso atraso() . Mas acredite em mim, seus programas vão agradecer por isso, e você não pode realizar multitarefa no Arduino sem ele.

Se você quiser ver um exemplo de millis () usado em um projeto Arduino do mundo real, verifique Arduino Night Light e Sunrise Alarm de James Bruce.

Encontrou alguma outra função de bloqueio com a qual devemos ser cautelosos? Me avise nos comentários abaixo e bateremos um papo.

Créditos fotográficos: Arduino (Daniel Spiess) , Chefe (Ollie Svenson)

Compartilhado Compartilhado Tweet O email Vale a pena atualizar para o Windows 11?

O Windows foi redesenhado. Mas isso é suficiente para convencê-lo a mudar do Windows 10 para o Windows 11?

Leia a seguir
Tópicos relacionados
  • faça você mesmo
  • Programação
  • Arduino
Sobre o autor Matthew Hughes(386 artigos publicados)

Matthew Hughes é desenvolvedor e escritor de software de Liverpool, Inglaterra. Ele raramente é encontrado sem uma xícara de café forte na mão e adora seu Macbook Pro e sua câmera. Você pode ler seu blog em http://www.matthewhughes.co.uk e segui-lo no twitter em @matthewhughes.

como usar o iphone como microfone para pc
Mais de Matthew Hughes

Assine a nossa newsletter

Junte-se ao nosso boletim informativo para dicas de tecnologia, análises, e-books grátis e ofertas exclusivas!

Clique aqui para se inscrever