Проект 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();
}
}