Menu
CoddyTech

Jogo de Reflexos: Melhor Tempo

Parte da seção Projetos do Journey de Arduino da Coddy. Lição 8 de 24.

O sketch mantém o melhor tempo (o menor) em uma variável e o exibe após cada rodada.

No início, ainda não há um melhor tempo. Use um valor que nenhuma rodada real pode ter, 0, para significar “nenhum ainda”. Após cada rodada: se ainda não houver um melhor tempo ou se esta rodada tiver superado o melhor tempo, esta rodada será o novo melhor tempo.

if (best == 0 || reaction < best) {
  best = reaction;
}
Serial.print("Best: ");
Serial.print(best);
Serial.println(" ms");

Coloque isso no estado LIT, onde uma rodada termina com um tempo real. Uma falsa largada nunca chega a esse código, então nunca se torna o recorde.

O melhor tempo fica na memória da placa (RAM), que é apagada quando a energia é desligada: o recorde dura até você pressionar Run novamente.

challenge icon

Desafio

Médio

Mantenha um registro:

  • uma variável best, 0 no início
  • após cada rodada cronometrada, se best for 0 ou a rodada for mais rápida, salve a rodada como o novo melhor tempo
  • imprima-o após cada rodada como Best: 250 ms
  • falsas partidas não alteram nada

Pressione Run, tente superar seu melhor tempo e, em seguida, Check.

Experimente você mesmo

const int ledPin = 12;
const int buttonPin = 2;

// Os três estados de uma rodada
enum State { READY, WAITING, LIT };
State state = READY;

int lastButton = HIGH;       // a leitura anterior do botão
unsigned long waitStart = 0; // quando a espera começou
unsigned long waitTime = 0;  // quanto tempo dura esta espera
unsigned long litAt = 0;     // quando o LED acendeu

void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(buttonPin, INPUT_PULLUP);
  Serial.begin(9600);
  Serial.println("Press the button to start");
}

void loop() {
  int button = digitalRead(buttonPin);
  bool pressed = (button == LOW && lastButton == HIGH);  // pressionado agora mesmo
  lastButton = button;
  unsigned long now = millis();

  switch (state) {
    case READY:
      if (pressed) {
        randomSeed(micros());  // o instante em que o botão é pressionado nunca é o mesmo duas vezes
        waitTime = random(1000, 3001);
        waitStart = now;
        state = WAITING;
      }
      break;
    case WAITING:
      if (pressed) {
        // Pressionado antes de a luz acender: largada falsa.
        Serial.println("Too soon!");
        state = READY;
      } else if (now - waitStart >= waitTime) {
        digitalWrite(ledPin, HIGH);
        litAt = now;
        state = LIT;
      }
      break;
    case LIT:
      if (pressed) {
        digitalWrite(ledPin, LOW);
        unsigned long reaction = now - litAt;
        Serial.print("Reaction: ");
        Serial.print(reaction);
        Serial.println(" ms");
        state = READY;
      }
      break;
  }
}
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Projetos

Pratique por conta própria: Playground de Arduino