Menu
CoddyTech

Jogo de Reflexos: Cronômetro

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

Agora o jogo mede você. O tempo de reação é o tempo entre o LED acender e você pressionar o botão, então o sketch precisa lembrar um instante: quando o LED acendeu.

digitalWrite(ledPin, HIGH);
litAt = millis();
state = LIT;

Quando o pressionamento acontece no estado LIT, a diferença é a resposta:

unsigned long reaction = millis() - litAt;
Serial.print("Reaction: ");
Serial.print(reaction);
Serial.println(" ms");

Isso só funciona porque o sketch nunca fica parado em um delay(): loop() verifica o botão milhares de vezes por milissegundo, então o pressionamento é detectado menos de um milissegundo depois de acontecer. A maioria das pessoas precisa de 200 a 300 ms.

challenge icon

Desafio

Médio

Meça o tempo do jogador:

  • salve millis() em litAt quando o LED acender
  • quando o pressionamento acontecer em LIT, calcule millis() - litAt
  • imprima como Reaction: 250 ms

Pressione Run, jogue, leia o monitor Serial 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

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 (now - waitStart >= waitTime) {
        digitalWrite(ledPin, HIGH);
        state = LIT;
      }
      break;
    case LIT:
      if (pressed) {
        digitalWrite(ledPin, LOW);
        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