Menu
CoddyTech

Игра на реакцию: лучшее время

Часть раздела Проекты путешествия по Arduino на Coddy. Урок 8 из 24.

Скетч хранит лучшее (наименьшее) время в переменной и выводит его после каждого раунда.

В начале лучшего времени ещё нет. Используй значение, которого не может быть ни у одного настоящего раунда, — 0, чтобы обозначить «пока нет». После каждого раунда: если лучшего времени ещё нет или этот раунд показал лучший результат, то этот раунд становится новым лучшим.

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

Помести это в состояние LIT, где раунд заканчивается реальным временем. Фальстарт никогда не доходит до этого кода, поэтому он никогда не становится рекордом.

Лучшее время хранится в памяти платы (RAM), которая очищается при отключении питания: рекорд сохраняется, пока ты снова не нажмёшь Run.

challenge icon

Задание

Средне

Веди запись:

  • переменная best, в начале равна 0
  • после каждого раунда на время, если best равна 0 или раунд прошёл быстрее, сохрани результат раунда как новый лучший
  • выводи его после каждого раунда в формате Best: 250 ms
  • фальстарты ничего не меняют

Нажми Run, попробуй побить свой рекорд, затем нажми Check.

Попробуйте сами

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

// Три состояния одного раунда
enum State { READY, WAITING, LIT };
State state = READY;

int lastButton = HIGH;       // предыдущее показание кнопки
unsigned long waitStart = 0; // когда началось ожидание
unsigned long waitTime = 0;  // сколько длится это ожидание
unsigned long litAt = 0;     // когда загорелся светодиод

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);  // кнопка только что нажата
  lastButton = button;
  unsigned long now = millis();

  switch (state) {
    case READY:
      if (pressed) {
        randomSeed(micros());  // время нажатия никогда не повторяется
        waitTime = random(1000, 3001);
        waitStart = now;
        state = WAITING;
      }
      break;
    case WAITING:
      if (pressed) {
        // Кнопка нажата до включения света: фальстарт.
        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 iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Проекты

Потренируйтесь самостоятельно: Песочница Arduino