Comments 18
Считывая кнопки по очереди да ещё и через вызов долгой процедуры вы автоматически приоритезируете одну кнопку над другой. Читерство уже встроено в аппарат и одна кнопка статистически будет выигрывать больше другой.
Действительно, недоработка есть — тесты с друзьями оказались неполными)) спасибо , скоро все доработаю)
А как оптимизировать?
Атомарный порт имеет до 8 бит. Если использовать 1 порт на обе кнопки то они легко считываются за одно атомарное чтение. Keys = PINx (где х - буквенный номер порта). Если при этом ещё и прерывания использовать, то будет вообще аппаратно. Как вариант, ещё можно использовать ICR таймера и тогда точность вырастет до максимума.
Если нажать и держать кнопку в момент подготовки победа автоматом? Плюс 20мс это много, и идет приоритезация первой кнопки, как выше заметили. Первый игрок при близком времени реакции будет по большей части побеждать.
Я тоже такую делал, Начальник попросил сделать такую штуку для нашей игры 100/1, сколхозин на ATtiny13A, сделал простую логику и разместил в светильнике из Fixprice
Скрытый текст
Да была такая же проблема что опрос одной кнопки был в приоритете над другой, но логика была на столько простой, что разница в миллисекундах отличить смог бы
В данной задаче debounce в виде таймера вообще не нужен, нам же надо зафиксировать самое первое нажатие каждой кнопки =)
Чтобы сделать потребление ещё меньше предлагаю перейти на Internal 128kHz RC oscillator. Производитель снизиться, но ее все равно должно хватить для задачи...
Не до конца понятно, что значит "без Arduino", вы же сами пользуетесь Arduino IDE и функциями вида digitalRead, pinMode, digitalWrite, а это Arduino. Аа.. понял, это потому что без отладочной платы Arduino, а на своей.
А почему не выбрали ATtiny13, кажется, что оно идеально подойдет сюда?
Еще, если хотите уменьшить потребление, можете уводить МК в сон и пробуждать его по нажатию на кнопке.
1) Сделайте прерывания на кнопки, дребезг даже не нужно ловить в вашем случае. Какое прерывание первым пришло, тот и выиграл. (Если совсем-совсем честно, то сравнивать время прихода прерывания, но это уже почти идеально: после старта игры сохранить timestamp с обоих ПЕРВЫХ по прерыванию нажатий и выдать результат). Если разница была в микросекундах, увы, INT0 имеет преимущество.
2) Использовать delay в микроконтроллерах хуже, чем GOTO в программировании. Имхо.
3) Светодиоды красиво было бы сделать RGB (чтобы совсем честно) или ws2812b (в разы проще).
4) Светодиоды можно fade даже в этом варианте (я не знаю, как это по другому сказать).
к примеру, после игры 2 секунды пауза, потом светодиод начинает пульсировать (не мигать, fade) и когда либо вспыхнул либо погас (на выбор) начинается игра.
5) В этом вашем применении спокойно делается так, что спит кристалл примерно 99% времени, даже когда горит или fade светодиод.
Дальше можно издеваться, взять tp223 вместо кнопок и выяснять расстояние, с которого дозволено подносить палец. :) Потом перепаивать конденсаторы и прочее шулерство.
P.S. Attimy13 сюда на такой проект даже просится, но по цене прямо всё равно сейчас, RP2040 стоит 1,5 евро нельзя от батарейки, Attimy13 0,5 евро.
Как там сейчас с PCBWay заказывать то кстати?
Программатор ещё хорошо подходит такой
как уже выше написали, тини13 - с головой.
Зачем резистор на ресет?
Светодиоды правильнее на + коммутировать
128кгц - хватит всем, уже сказали
Использовать прерывания - обязательно
Не развести разъем для программирования или хотя бы уарт, если ардуина... Как вы свою версию 2.1.0.4 будете заливать? Это ж не тини13, ног хватает.
Сама игра, по идее, при фальш-старте должна засчитывать поражение, а не какие-то "больше двух нажатий".
Кнопки... сюда просятся панельки для свитчей от механических клавиатур.
Плата, ну я так понимаю, auto-router. Оно ж в 1 слой спокойно разводится.

О себе
Я увлекаюсь Электроникой и люблю создавать крутые проекты.
Ну до крутых проектов еще расти. Для новичков данная статья скорее вредная.
Скрытый текст
28 долларов за 5 таких плат... тут уж утюгом сделать проще и быстрее.
Мой первый DIY-гаджет: Игра на реакцию для двух игроков на ATmega328P (без Arduino)