A primeira vez que você usou uma placa Arduino, você provavelmente já fez algo parecido com isto:
- Ligado um LED de luz para o seu Arduino
- Enviado o padrão de intermitência do esboço que iria ligar e desligar o LED a cada segundo
Este é o chamado “Hello World” programa do Arduino, e mostra que, com apenas algumas linhas de código, você pode criar algo que tenha uma aplicação do mundo real.
no exemplo anterior, você usa a função delay() para definir os intervalos entre o LED ligar e desligar.
o acordo é o seguinte: enquanto o delay() é útil e funciona para exemplos básicos, você realmente não deve usá-lo no mundo real… Continue lendo para saber o porquê.
How delay () Function Works
the way the Arduino delay () function is pretty straight forward.
aceita um único inteiro como argumento. Este número representa o tempo em milissegundos que o programa tem que esperar até passar para a próxima linha de código.
quando atrasar (1000) o seu Arduino pára nessa linha durante 1 segundo.
delay() é uma função de bloqueio. Funções de bloqueio impedem um programa de fazer qualquer outra coisa até que essa tarefa particular tenha concluído. Se você precisar de várias tarefas para ocorrer ao mesmo tempo, você simplesmente não pode usar o delay().
se a sua aplicação exigir que leia/salve constantemente os dados das entradas, deve evitar usar a função delay (). Felizmente, há uma solução.
millis() Função Para O Resgate
a função millis () quando chamada, devolve o número de milisegundos que passaram desde o início do programa.Porque é que isso é útil?
porque usando alguma matemática, você pode facilmente verificar quanto tempo passou sem bloquear o seu código.
o sketch abaixo mostra como você pode usar a função millis() para criar um projeto blink. Liga a luz LED por 1000 milissegundos, e depois desliga-a. Mas fá-lo de uma forma que não é bloqueadora.
Vamos dar uma olhada mais de perto em um piscar de olhos esboço que funciona sem uma função de atraso:
/* Blink without Delay, example here: arduino.cc/en/Tutorial/BlinkWithoutDelay*/// constants won't change. Used here to set a pin number :const int ledPin = 13; // the number of the LED pin// Variables will change :int ledState = LOW; // ledState used to set the LED// Generally, you should use "unsigned long" for variables that hold time// The value will quickly become too large for an int to storeunsigned long previousMillis = 0; // will store last time LED was updated// constants won't change :const long interval = 1000; // interval at which to blink (milliseconds)void setup() { // set the digital pin as output: pinMode(ledPin, OUTPUT);}void loop() { // here is where you'd put code that needs to be running all the time. // check to see if it's time to blink the LED; that is, if the // difference between the current time and last time you blinked // the LED is bigger than the interval at which you want to // blink the LED. unsigned long currentMillis = millis(); if (currentMillis - previousMillis >= interval) { // save the last time you blinked the LED previousMillis = currentMillis; // if the LED is off turn it on and vice-versa: if (ledState == LOW) { ledState = HIGH; } else { ledState = LOW; } // set the LED with the ledState of the variable: digitalWrite(ledPin, ledState); }}
Ler matérias código
Este esboço acima podem ser encontradas aqui e funciona subtraindo-se o anterior tempo de gravação (previousMillis) a partir da hora actual (currentMillis). Se o restante for maior que o intervalo (neste caso, 1000 milissegundos), o programa atualiza a variável anteriormillis para o tempo atual, e ou liga ou desliga o LED.
e porque é um não-Bloqueio, qualquer código que está localizado fora desse primeiro se a declaração deve funcionar normalmente.
pode agora compreender que pode adicionar outras tarefas à sua função loop() e o seu código ainda estaria a piscar o LED a cada segundo.