terça-feira, 15 de maio de 2012

delay x millis no Arduino


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++;
  }

}