Проект 12. Автофиниш

Автофиниш будет полезен любому бегуну и его тренеру! Тренеру достаточно скомандовать “На старт, внимание, марш”, и нажать кнопку старта на пульте управления. После этого автофиниш начинает считать секунды, до тех пор, пока бегун не пробежит рядом. После этого на индикаторе выводится время забега.

Программирование:

Цикл do...while

Библиотека IRremote

Практика

Разработайте систему автофиниша для бегунов. Система должна работать следующим образом: Тренер командует “На старт, внимание, марш!”, нажимает кнопку на пульте. Автофиниш получает сигнал и начинает отсчёт времени на семисегментном индикаторе. При этом датчик расстояния запоминает текущее значение расстояния, чтобы фиксировать его изменение если рядом пробегает человек. Когда бегун добегает до автофиниша и пробегает через него, датчик расстояния фиксирует изменение расстояния и останавливает время, показывая его на индикаторе.

Дополнительное задание

Реализовать систему “два бегуна”. То есть после того как пробегает первый бегун время не останавливается, но запоминаются в переменную. Система ждёт второго бегуна. После того, как пробежал второй бегун система попеременно три раза, меняя раз в секунду, выводит время первого и время второго бегуна на семисегментный индикатор.

Решение

Мы рекомендуем сначала освоить материал и попробовать сделать программу самостоятельно! А потом проверить себя, посмотрев наш вариант решения:

#include <IRremote.h>
#include <Eryoma.h>
Eryoma eryoma;

IRrecv irrecv(eryoma.getPin(ePort5, An));
decode_results results;

int distance;
long last_time;
void setup() {
  eryoma.setupConnector(ePort0, DoubleSegment);
  eryoma.setupConnector(ePort2, Ultrasonic);
  irrecv.enableIRIn();
}

void loop() {
  if (irrecv.decode(&results)) {
    if (results.value == BUTTON_PLAY_PAUSE) {
      distance = eryoma.read(ePort2);
      last_time = millis();
      do {
        eryoma.write(ePort0, (int)((millis() - last_time) / 1000));
      } while (eryoma.read(ePort2) >= distance - 3);
    }
    irrecv.resume();
  }
}

#include <IRremote.h>
#include <Eryoma.h>
Eryoma eryoma;

IRrecv irrecv(eryoma.getPin(ePort5, An));
decode_results results;

int distance;
long last_time;
int time_runner1;
int time_runner2;
void setup() {
  eryoma.setupConnector(ePort0, DoubleSegment);
  eryoma.setupConnector(ePort2, Ultrasonic);
  irrecv.enableIRIn();
  Serial.begin(9600);
}

void loop() {
  if (irrecv.decode(&results)) {
    if (results.value == BUTTON_PLAY_PAUSE) {

      distance = eryoma.read(ePort2);
      last_time = millis();
      do {
        eryoma.write(ePort0, (int)((millis() - last_time) / 1000));
      } while (eryoma.read(ePort2) >= distance - 3);
      time_runner1 = (int)(millis() - last_time) / 1000;
      delay(1000);
      do {
        eryoma.write(ePort0, (int)((millis() - last_time) / 1000));
      } while (eryoma.read(ePort2) >= distance - 3);
      time_runner2 = (int)(millis() - last_time) / 1000;
      eryoma.write(ePort0, time_runner1);
      delay(1000);
      eryoma.write(ePort0, time_runner2);
      delay(1000);
      eryoma.write(ePort0, time_runner1);
      delay(1000);
      eryoma.write(ePort0, time_runner2);
      delay(1000);
      eryoma.write(ePort0, time_runner1);
      delay(1000);
      eryoma.write(ePort0, time_runner2);
      delay(1000);
    }
    irrecv.resume();
  }
}