Cronômetro

Abaixo, um esboço que demonstra como fazer duas coisas ao mesmo tempo baseado na função millis().

/* Cronômetro
 * Paul Badger 2008
 * Demonstra o uso de millis(), resistores pull-up, 
 * como fazer duas coisas acontecerem ao mesmo tempo,
 * imprime frações
 *
 * Montagem física: interruptor momentâneo ao pino 4 e ao
 * terra, e o LED com um resistor em série entre o pino 13  
 * e o terra
 */

#define ledPin  13                  // LED ao pino digital 13
#define buttonPin 4                 // botão ao pino 4

int value = LOW;                    // valor anterior do LED
int buttonState;                    // variável a guardar estado do botão
int lastButtonState;                // variável a guardar o último estado do botão
int blinking;                       // condição para piscamento - o cronômetro venceu
long interval = 100;                // intervalo de piscamento - mude à vontade
long previousMillis = 0;            // variável a guardar o último momento de atualização do LED
long startTime ;                    // momento de partida do cronômetro
long elapsedTime ;                  // tempo decorrido no cronômetro
int fractional;                     // variável a guardar parte fracionária do tempo

void setup()
{
   Serial.begin(9600);

   pinMode(ledPin, OUTPUT);       // ajuste o pino digital como saída
   pinMode(buttonPin, INPUT);     // linha não muito necessária, já que os pinos são por padrão entradas
   digitalWrite(buttonPin, HIGH); // ligue resistores de pull-up
}

void loop()
{
    // aguarde pressionamento do botão
   buttonState = digitalRead(buttonPin); // leia e guarde estado do botão

   if (buttonState == LOW && lastButtonState == HIGH  &&  blinking == false){
    // veja se houve transição de HIGH para LOW
    // em caso positivo, então trata-se de um novo pressionamento enquanto o relógio não corre: parta o relógio

      startTime = millis();    // guarde o tempo de partida
      blinking = true;         // ligue o piscar enquanto corre o relógio
      delay(5);                // pequena pausa para filtrar ruído mecânico do botão
      lastButtonState = buttonState;  // guarde buttonState em lastButtonState, para que possa comparar mais tarde
   }

   else if (buttonState == LOW && lastButtonState == HIGH && blinking == true){
    // veja se houve transição de HIGH para LOW
    // em caso positivo, trata-se de um novo pressionamento enquanto o relógio corre: pare o relógio e exiba mensagem

        elapsedTime = millis() - startTime;  // guarde tempo decorrido
        blinking = false;                    // desligue o pisca-pisca
        lastButtonState = buttonState;       // guarde buttonState em lastButtonState, para comparar mais tarde
       // rotina para exibir tempo decorrido 
        Serial.print( (int)(elapsedTime / 1000L));         // divida por 1000 para converter a segundos - e então converta a inteiro
        Serial.print(".");                   // imprima ponto decimal

       // use operador módulo para obter parte fracionária part do tempo 
       fractional = (int)(elapsedTime % 1000L);

       // preencha com zeros à esquerda - não seria ótimo se 
       // a linguage Arduino tivesse algo específico para tratar disso? :)
       if (fractional == 0)
          Serial.print("000");      // inclua 3 zeros
       else if (fractional < 10)
          Serial.print("00");       // inclua 2 zeros
       else if (fractional < 100)
          Serial.print("0");        // inclua 1 zero

       Serial.println(fractional);  // imprima parte fracionária do tempo
   }

   else{
      lastButtonState = buttonState;                        // guarde buttonState em lastButtonState, para comparar mais tarde
   }

   // rotina de piscamento - pisca LED enquanto conta o tempo
   // verifique se já é hora de piscar LED; isto é, a diferença
   // entre o tempo atual e o último momento em que piscamos o LED é maior que
   // o intervalo ao qual queremos piscá-lo?

   if ( (millis() - previousMillis > interval) ) {

      if (blinking == true){
         previousMillis = millis();  // lembre-se da última vez que piscou-se o LED

         // se LED está desligado, ligue-o e vice-versa
         if (value == LOW)
            value = HIGH;
         else
            value = LOW;
         digitalWrite(ledPin, value);
      }
      else{
         digitalWrite(ledPin, LOW);  // desligue o LED caso não esteja a piscar
      }
   }
}

Share