Освой Arduino играючи
/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000
Наткнулся на игру на Пикабу. Решил воспроизвести у себя. Правда, десять свободных светодиодов у меня не нашлось, поэтому ограничился шестью. Пришлось переписывать скетч под себя. Но изменения там минимальны.
Сначала небольшое объяснение, как работает игра. Имеется шесть светодиодов, потенциометр, кнопка для сброса. Потенциометром можно включить крайние светодиоды, они играют роль ракетки. В начале игры загорается один светодиод, который играет роль мяча. Мяч движется в одну сторону, например, влево (светодиоды поочерёдно загораются и гаснут). Вам нужно успеть включить потенциометром крайний левый светодиод. Если успели, то мяч отразится от вашей ракетки и пойдёт в обратном направлении. Вам опять нужно быстро переключиться на правый крайний светодиод и дожидаться мяча. Если не успели, то вспыхивают все светодиоды. Кнопкой можно сбросить игру и начать заново.
Общая схема представлена на рисунке (для десяти светодиодов).
Скетч (для шести светодиодов) с комментариями.
int control; // светодиод-ракетка слева или справа
int ball = 4; // начальная позиция мяча
int direction = 1; // направление
int fail = 0; // пропустили мяч
void setup() {
// светодиоды на выводах 2, 3, 4, 5, 6, 7
// включаем у них режим на вывод
for (int i = 2; i < 8; ++i)
pinMode(i, OUTPUT);
}
void loop() {
// если игра идёт, то выключаем все светодиоды
if (fail == 0) {
digitalWrite(control, LOW);
digitalWrite(ball, LOW);
}
// получаем данные с потенциометра на выводе A0
int read = analogRead(A0);
// если значение больше 512, то управляющий светодиод на выводе 2
if (read >= 512) control = 2;
// если значение меньше 512, то ракетка на выводе 7
if (read < 512) control = 7;
// включаем нужный светодиод-ракетку в зависимости от потенциометра
digitalWrite(control, HIGH);
// если двигаемся в одну сторону, то зажигаем светодиоды слева направо
if (direction == 1) ++ball;
if (direction == 2) --ball; // в обратную сторону
// если мяч является светодиодом 3 и крайний светодиод на выводе 2,
// то направление слева направо
if (ball == 3 && control == 2) {
direction = 1;
}
// если мяч на выводе 6 и крайний светодиод на выводе 7,
// то двигаемся в другую сторону
if (ball == 6 && control == 7) {
direction = 2;
}
// если мяч дошёл до светодиод 7 или 0, то проиграл
if (ball == 7 || ball == 2) fail = 1;
// если проиграл, то включаем все светодиоды
if (fail == 1) {
for (int i = 2; i < 8; ++i)
digitalWrite(i, HIGH);
}
// начинаем зажигать светодиод-мяч
digitalWrite(ball, HIGH);
delay(1000);
}
По описанию на сайте я сначала не очень понял принцип игры, но когда собрал сам, то стало понятнее. Тут главное подобрать скорость движения, чтобы нужно было быстро реагировать и переключаться крайние светодиоды.