Предлагаем собрать схему и написать программу для игры «Кто быстрее». Это игра на реакцию для двух игроков. 

В игре используется две кнопки и три светодиода. Управляет игрой микроконтроллер ATMega328 установленный на плате ARDUINO. 

Рис. 1. Принципиальная электрическая схема игры.

Питание на схему изображённую на рис. 1 может быть подано через USB разъём платы Arduino. Так же, запитать схему можно от батареи на 4,5 Вольт, подав питание на ножку VIN или +5V на плате Arduino. Если у Вас плата Arduino UNO, то можно подать напряжение питания от 7 до 12 Вольт от блока питания через разъём питания платы. 

Рис. 2. Макет схемы.

Далее, по шагам, пройдём все этапы разработки программы для нашей игры. Пишем и компилируем программу в среде разработки Arduino IDE. 

int knLeft = 2; int knRight = 3;                     // Правая и левая кнопки
int ledLeft = 4; int ledStart = 5; int ledRight = 6; // Правый и левый светодиоды, светодиод Start

void setup() {

}

void loop() {

}

Программа 1.

В программе 1 мы объявили пять переменных целого типа и присвоили им значения. В переменных knLeft и knRight мы храним номера портов на плате Arduino, к которым подключили левую и правую кнопки. В переменные ledLeft, ledStart и ledRight мы записали номера портов, к которым подключили левый и правый светодиоды и светодиод Start, который будет давать сигнал к старту соревнования. 

Программа 1 не производит ни каких действий с внешними устройствами и загрузка этой программы в микроконтроллер на плате Arduino не имеет смысла. Но, мы рекомендуем начинающим программистам выполнить компиляцию этой программы в среде программирования Arduino. В процессе компиляции в Вашей программе, возможно, будут выявлены ошибки, которые необходимо исправить. 

int knLeft = 2; int knRight = 3;                     // Правая и левая кнопки
int ledLeft = 4; int ledStart = 5; int ledRight = 6; // Правый и левый светодиоды, светодиод Start

void setup() {
  pinMode(ledLeft, OUTPUT);
  pinMode(ledStart, OUTPUT);
  pinMode(ledRight, OUTPUT);
  pinMode(knLeft, INPUT_PULLUP);
  pinMode(knRight, INPUT_PULLUP);
}

void loop() {

}

Программа 2.

int knLeft = 2; int knRight = 3;                     // Правая и левая кнопки
int ledLeft = 4; int ledStart = 5; int ledRight = 6; // Правый и левый светодиоды, светодиод Start

void setup() {
  pinMode(ledLeft, OUTPUT);
  pinMode(ledStart, OUTPUT);
  pinMode(ledRight, OUTPUT);
  pinMode(knLeft, INPUT_PULLUP);
  pinMode(knRight, INPUT_PULLUP);
}

void loop() {
  // Команда "На старт"
  digitalWrite(ledLeft, HIGH);
  digitalWrite(ledStart, LOW);
  digitalWrite(ledRight, HIGH);
  delay(4000);
}

Программа 3.

int knLeft = 2; int knRight = 3;                     // Правая и левая кнопки
int ledLeft = 4; int ledStart = 5; int ledRight = 6; // Правый и левый светодиоды, светодиод Start

void setup() {
  pinMode(ledLeft, OUTPUT);
  pinMode(ledStart, OUTPUT);
  pinMode(ledRight, OUTPUT);
  pinMode(knLeft, INPUT_PULLUP);
  pinMode(knRight, INPUT_PULLUP);
}

void loop() {
  // Команда "На старт"
  digitalWrite(ledLeft, HIGH);
  digitalWrite(ledStart, LOW);
  digitalWrite(ledRight, HIGH);
  delay(4000);
  // Команда "Внимание!"
  digitalWrite(ledLeft, LOW);
  digitalWrite(ledStart, LOW);
  digitalWrite(ledRight, LOW);
  delay(4000);
}

Программа 4.

int knLeft = 2; int knRight = 3;                     // Правая и левая кнопки
int ledLeft = 4; int ledStart = 5; int ledRight = 6; // Правый и левый светодиоды, светодиод Start

void setup() {
  pinMode(ledLeft, OUTPUT);
  pinMode(ledStart, OUTPUT);
  pinMode(ledRight, OUTPUT);
  pinMode(knLeft, INPUT_PULLUP);
  pinMode(knRight, INPUT_PULLUP);
}

void loop() {
  // Команда "На старт"
  digitalWrite(ledLeft, HIGH);
  digitalWrite(ledStart, LOW);
  digitalWrite(ledRight, HIGH);
  delay(4000);
  // Команда "Внимание!"
  digitalWrite(ledLeft, LOW);
  digitalWrite(ledStart, LOW);
  digitalWrite(ledRight, LOW);
  delay(random(2000, 3000));
  // Команда "Старт!"
  digitalWrite(ledStart, HIGH);
  delay(4000);
}

Программа 5.

int knLeft = 2; int knRight = 3;                     // Правая и левая кнопки
int ledLeft = 4; int ledStart = 5; int ledRight = 6; // Правый и левый светодиоды, светодиод Start

void setup() {
  pinMode(ledLeft, OUTPUT);
  pinMode(ledStart, OUTPUT);
  pinMode(ledRight, OUTPUT);
  pinMode(knLeft, INPUT_PULLUP);
  pinMode(knRight, INPUT_PULLUP);
}

void loop() {
  // Команда "На старт"
  digitalWrite(ledLeft, HIGH);
  digitalWrite(ledStart, LOW);
  digitalWrite(ledRight, HIGH);
  delay(4000);
  // Команда "Внимание!"
  digitalWrite(ledLeft, LOW);
  digitalWrite(ledStart, LOW);
  digitalWrite(ledRight, LOW);
  delay(random(2000, 3000));
  // Команда "Старт!"
  digitalWrite(ledStart, HIGH);
  int flagLeft = false; int flagRight = false;
  // Здесь в программе необходимо выявить победителя

  delay(4000);
  // Команда "Вольно!"
  digitalWrite(ledLeft, LOW);
  digitalWrite(ledStart, LOW);
  digitalWrite(ledRight, LOW);
  delay(4000);
}

Программа 6.

 

 

Рис. 3. Блок-схема алгоритма определения победителя. Проработано для левого игрока.

Описание блок-схемы алгоритма определения победителя в игре «Кто быстрее» представленной на рис. 3:

Перед стартом, каждый игрок считается не допущенным к соревнованию по причине фальстарта. Считаем  что игроки могли нажать кнопку до подачи светового сигнала старт. В программе 6 мы фиксируем этот факт присваиванием переменной flagLeft значения false. В алгоритме, см. рис. 3 до начала цикла определения победителя мы создали переменные fL и fR со значениями равными 0.

int knLeft = 2; int knRight = 3;                     // Правая и левая кнопки
int ledLeft = 4; int ledStart = 5; int ledRight = 6; // Правый и левый светодиоды, светодиод Start

void setup() {
  pinMode(ledLeft, OUTPUT);
  pinMode(ledStart, OUTPUT);
  pinMode(ledRight, OUTPUT);
  pinMode(knLeft, INPUT_PULLUP);
  pinMode(knRight, INPUT_PULLUP);
}

void loop() {
  // Команда "На старт"
  digitalWrite(ledLeft, HIGH);
  digitalWrite(ledStart, LOW);
  digitalWrite(ledRight, HIGH);
  delay(4000);
  // Команда "Внимание!"
  digitalWrite(ledLeft, LOW);
  digitalWrite(ledStart, LOW);
  digitalWrite(ledRight, LOW);
  delay(random(2000, 3000));
  // Команда "Старт!"
  digitalWrite(ledStart, HIGH);
  int flagLeft = false; int flagRight = false;
  // Здесь в программе необходимо выявить победителя
  while (true) {
    if (digitalRead(knLeft)) {            // Левая кнопка отпущена
      flagLeft = true;                    // Левый готов к соревнованию
    }
    if (not(digitalRead(knLeft)) and flagLeft) {
      digitalWrite(ledLeft, HIGH);        // Победил левый
      break;
    }
  }
  delay(4000);
  // Команда "Вольно!"
  digitalWrite(ledLeft, LOW);
  digitalWrite(ledStart, LOW);
  digitalWrite(ledRight, LOW);
  delay(4000);
}

Программа 7.

int knLeft = 2; int knRight = 3;                     // Правая и левая кнопки
int ledLeft = 4; int ledStart = 5; int ledRight = 6; // Правый и левый светодиоды, светодиод Start

void setup() {
  pinMode(ledLeft, OUTPUT);
  pinMode(ledStart, OUTPUT);
  pinMode(ledRight, OUTPUT);
  pinMode(knLeft, INPUT_PULLUP);
  pinMode(knRight, INPUT_PULLUP);
}

void loop() {
  // Команда "На старт"
  digitalWrite(ledLeft, HIGH);
  digitalWrite(ledStart, LOW);
  digitalWrite(ledRight, HIGH);
  delay(4000);
  // Команда "Внимание!"
  digitalWrite(ledLeft, LOW);
  digitalWrite(ledStart, LOW);
  digitalWrite(ledRight, LOW);
  delay(random(2000, 3000));
  // Команда "Старт!"
  digitalWrite(ledStart, HIGH);
  int flagLeft = false; int flagRight = false;
  // Здесь в программе необходимо выявить победителя
  while (true) {
    if (digitalRead(knLeft)) {            // Левая кнопка отпущена
      flagLeft = true;                    // Левый готов к соревнованию
    }
    if (digitalRead(knRight)) {           // Правая кнопка отпущена
      flagRight = true;                   // Правый готов к соревнованию
    }
    if (not(digitalRead(knLeft)) and flagLeft) {
      digitalWrite(ledLeft, HIGH);        // Победил левый
      break;
    }
    if (not(digitalRead(knRight)) and flagRight) {
      digitalWrite(ledRight, HIGH);       // Победил правый
      break;
    }
  }
  delay(4000);
  // Команда "Вольно!"
  digitalWrite(ledLeft, LOW);
  digitalWrite(ledStart, LOW);
  digitalWrite(ledRight, LOW);
  delay(4000);
}

Программа 8.