/* Este é um exemplo de uso da função millis() onde um led deve
 acender por 500ms e ficar apagado  por 100 ms.
 A função millis() atua como um contador que atualiza automaticamente
 o seu valor a cada 1 mili segundo a partir do início do funcionamento do 
 microcontrolador até que ele seja desligado ou o valor de millis()
 alcance um valor maior do que o reservado para a variável.
 A variável do tipo unsigned long armazenar valores
 de 0 a 4,294,967,295 (2^32 - 1).
 A variável tempo1 que será utilizada no código para "contar o tempo e "
 mostrará o valor do millis.
 A variável tempo2 do tipo int será utilizada para demosntrar que o tipo
 int não deve ser utilizado para estes casos.
*/
unsigned long tempo1 = millis();
int tempo2 = millis();
unsigned int tempo3 = millis();

// Iniciação
void setup(){
  // Inicia comunicação na porta serial
  Serial.begin(9600);
  // Define pinos dos led como saída
  pinMode(8, OUTPUT);
}
void loop(){
/*
 Se a diferença entre os valores de millis() - tempo1 for menor do que 500,
 o LED acenderá.
*/
if((millis() - tempo1) < 500){
    // Acende o led do pino 8
    digitalWrite(8, HIGH);
    //Serial.println("ACESO");   
  }
/*
 Quando a diferença passa de 500, o if torna-se 
 falso e portanto o código "anda" e incia o else
 que apaga o LED .
*/
  else{
    // Apaga o led do pino 8
    digitalWrite(8, LOW);
   // Serial.println("APAGADO");
  }
/*
 Este é o tempo que o LED ficará apagado por 100ms.
 Para chegar no tempo 100ms somou-se 100ms (tempo apagado) com 500ms
 que é o tempo que o LED permanece aceso.
 Quando a diferença de millis menos tempo1 for maior
 do que 600 (500 + 100) o if é verdadeiro.
 Então faz a leitura atual do millis e guarda o novo valor em tempo1.
 Esse novo valor vai ser utilizado lá no primeiro if
 reiniciando todo o processo.
*/

  if((millis() - tempo1) > 600){
    tempo1 = millis();
    tempo2 = millis();
    tempo3 = millis();
  }
/*
 tempo1 mostra o valor do contador millis() porém em uma variável do tipo 
 unsigned long.
 tempo2 mostra o valor do contador millis() porém em uma variável do tipo int
 tempo3 mostra o valor do contador millis() porém em uma variável do tipo
 unsigned int
*/
  Serial.print ("Valor de millis = ");
  Serial.println(millis());
  Serial.print ("Valor tempo1 = ");
  Serial.println(tempo1);
  Serial.print("Valor tempo2 = ");
  Serial.println(tempo2);
  Serial.print("Valor tempo3 = ");
  Serial.println(tempo3);
}