Arduino - Aula 5 - Temporizadores


 Delay()  
 
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().