A
função delay
é muito usada em
programas para o arduino. É uma função simples e útil quando queremos pausa a
execução de um programa pelo arduino.
O
funcionamento dela é simples:
Imagine
duas crianças brincando de esconder. A criança que conta deve ficar parada
apenas contando até cem, por exemplo, para depois procurar a outra criança. A
função delay(tempo e microssegundos) tem funcionamento similar o
microcontrolado interrompe a execução do programa até o final do tempo determinado. Nem
sempre é aceitável esperar o microcontrolador fazer a contagem de
tempo através da função delay().
A
função millis retorna
o tempo de execução do programa até o momento em que ela é chamada. Como
exemplo suponha que uma pessoa tem que falar por quinze minutos. Não seria possível
contar e falar ao mesmo tempo então ela verifica a hora de inicio em um relógio
e durante a palestra verifica novamente a hora subtrai a hora de inicio a fim
de saber se já passaram os quinze minutos. Por exemplo, se a pessoa iniciou às 17h45min
e olha o relógio às 17h55min saberá que ainda não passou 15 minutos, pois 17h55min
- 17h45min = 10 minutos menor que 15. Mas se quando olhar para o relógio o
palestrante e verificar que são 18h01min intenderá que é hora de parar já que 18h01min
- 17h45min = 16 minutos que é obviamente maior que 15. Perceba que tanto faz
verificar o tempo de inicio somar o tempo de duração do evento e verificar
periodicamente se o tempo final resultante da soma já foi alcançado
ou subtrair a cada período o tempo atual do tempo de inicio e comparar com o
tempo de duração.
A
função millis pode ser entendida como o relógio do exemplo acima. Sabendo-se
que o programa começa a rodar no tempo 0 ms, se depois de um segundo chamarmos
a função mills ela retornará 1000.
No
programa abaixo, baseado no exemplo "Blink without Delay" que
acompanha a interface de programação do arduino, enquanto aguardo o intervalo
de um segundo entre as piscada do led no pino 13 o arduino imprime na tela do
terminal "lendo sensor" o que poderia ser substituído por uma leitura
real de um sensor ou outro tipo de ação.
int ledPin = 13; // pino onde esta ligado o LED
int ledState = LOW; // ledState usado para amazena o estado atual do led aceso o apagado
long intervalo = 1000; // intervalo de um segundo
void setup()
{
pinMode(ledPin, OUTPUT);
Serial.begin(9600);
}
void loop()
{
long previousMillis = millis();
int cnt=0;
if (ledState == LOW) // se o led estava apagado
ledState = HIGH; //
else // se o led estava aceso
ledState = LOW; //
digitalWrite(ledPin, ledState);
// Mantem o led aceso ou apagado por um segundo
while(millis() - previousMillis < intervalo)
{
// pode-se fazer muita coisa dentro deste laço enquanto aguarda o final do tempo para mudar o estad do led
// ler um sensor ou algo parecido, por exemplo
if (cnt % 100 == 0)
{
Serial.print("Lendo sensor");
Serial.print(" \n ");
}
cnt++;
}
}