O comando Delay(ms) interrompe o programa para o período de tempo (em milissegundos) especificado como (ms). Existem 1.000 milissegundos em um segundo.)
ms: o número de milissegundos para fazer uma pausa (unsigned long)
Exemplo:
int ledPin = 13; // LED conectado ao pino 13
void setup() {
pinMode(ledPin, OUTPUT); // determina como saida digital o pino 13
}
void loop() {
digitalWrite(ledPin, HIGH); // liga o LED
delay(1000); // espera 1 segundo
digitalWrite(ledPin, LOW); // desliga o LED
delay(1000); // espera 1 segundo
}
Embora seja fácil criar um LED piscando com a função delay(), o uso de delay() em um sketch tem desvantagens significativas.
Durante o tempo que delay está esperando, nenhuma outra leitura de sensores, cálculos matemáticos, manipulação de pino é executada. Em outras palavras, durante a execução do comando delay() o Arduino praticamente deixa de operar.
Millis()
Uma alternativa ao uso da função delay() é a função millis().
Essa função retorna o número de milissegundos desde que a placa Arduino começou a funcionar o programa atual.
Este número irá transbordar (voltar para zero), após aproximadamente 50 dias.
unsigned long time = 0; // declarar a variável associada ao millis() como unsigned long
void loop() {
time = millis(); // passa para a variável time o tempo em milisegundos desde
// que o Arduino começou a funcionar.
}
Como a função millis() retorna o tempo que passou desde que o sketch atual iniciou a sua operação, podemos passar esse valor à variáveis e fazer comparações. Assim conseguimos determinar quanto tempo passou desde que um evento iniciou e terminou.
Por exemplo:
A variável "a" recebe o valor de millis() no início de um evento. A variável "b" recebe o valor de millis() no final do evento. Suponto que "a" recebeu o valor 4500 ms e "b" recebeu o valor 6500 ms, podemos calcular o tempo decorrido durante o evento.
a = millis() // supondo 4500 ms
b = millis() // supondo agora 6500 ms
c = b - a // a variável c receberá a diferença entre "a" e "b", ou seja, 2 segundos (2000 ms)
Note que o tipo de variável para millis() é um unsigned long. Erros podem ser gerados se um programador tentar fazer contas matemáticas com outros tipos de dados, tais como variáveis inteiras (int).
Exemplo 1:
Temporizador que aciona um LED após 1 segundo do acionamento do botão e desliga após 2 segundos. Este programa é baseado no exemplo Button do Arduino.
int buttonPin = 2;
int ledPin = 13;
unsigned long tempo = 0; // variável para receber valores do millis()
int temporizador = 0; // variável para indicar quando o temporizador está operando
int buttonState = 0;
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(buttonPin, INPUT);
}
void loop(){
buttonState = digitalRead(buttonPin); // lê o estado do botão
if (buttonState == HIGH && temporizador == 0) { // se botão acionado
temporizador = 1; // inicia o temporizador
tempo = millis(); // passa à variável o valor de millis()
}
if (millis() - tempo >= 1000 && temporizador == 1){ // após 1 segundo e temporizador
// ligado
digitalWrite(ledPin, HIGH); // aciona o LED
}
if (millis() - tempo >= 2000 && temporizador == 1){ // após 2 seg. e temporizador
//desligado
digitalWrite(ledPin, LOW); // apaga o LED
temporizador = 0; // desliga o temporizador
}
}
Exemplo 2:
Blink (exemplo que vem com o Arduino) sem a utilização da função Delay().
Pisca o LED por 1 segundo.
unsigned long tempo = 0; // variável para tratar valores do millis()
int temporizador = 0; // variável de status
void setup() {
pinMode(13, OUTPUT); // inicializa o pino 13 como saída.
}
void loop() {
if (temporizador == 0) { // se temporizador em 0
digitalWrite(13, HIGH); // liga o LED
temporizador = 1; // muda o status do temporizador para 1
tempo = millis(); // passa o valor de millis() para a variável tempo
}
if (millis() - tempo >= 1000 && temporizador == 1){ // se tempo maior que 1 seg. e
// temporizador em 1
digitalWrite(13, LOW); // apaga o LED
temporizador = 2; // muda o status do temporizador para 2
}
if (millis() - tempo >= 2000 && temporizador == 2){ // se tempo maior que 1seg. e
// temporizador em 2
temporizador = 0; // muda o status do temporizador para 0
//para poder reiniciar a operação
}
}
Para poder utilizar esses exemplos, basta copiá-los ao Arduino.
Exercícios
1) Na função delay(1500), o que
representa o valor 1500?
2) A função millis() retorna o valor do tempo que passou desde que o Arduino foi iniciado, ou seja, representa um relógio interno do Arduino. Essa afirmativa é certa ou errada?
3) No programa abaixo, faça um círculo na variável de menor valor.
X = millis()
Y = millis()
4) Crie um programa utilizando a função delay() que faça acender um
LED, esperar 2 segundos e então apagar o LED.
5) Faça o mesmo programa do exercício 1
só que em vez de utilizar delay(), utilize a função millis().