В общем на ардуинке сделал такой девайс. Фото к сожалению не осталось поэтому рисунок.
В основе ардуинка нано, две большие кнопки, два светодиода, пьезопищалка, и тройной 7сигментый дисплей вот и все детали.
Задействованы два таймера.
Правила игры. Вначале команды расходятся по базам. Ведущий взводит бомбу красной кнопкой(включается таймер террористов 5 минут обратный отсчёт) и прячет её. Контеры должны найти бомбу и нажать на синюю кнопку, тогда таймер террористов останавливается и включается таймер контеров, дальше им нужно удерживать позицию до окончания времени(5 мин). Если террористы захватывают зону нажимают на кнопку их таймер продолжает тикать с того же место где остановился. ПО истечении времени либо мелодия либо взрыв.
Знакомый говорит менты особенно любили играть в эту игру каждую пятницу собирались.
Потом случился ковид, ещё арендатор начал мухлевать с отоплением и электроэнергией. По итого мой знакомый свернул бизнес. А бомбу отдал мне, пришлось как донора разобрать. Всё что осталось это вот кнопка, дисплей и ардуинка.
const int btn1 = 2; const int btn2 = 3;
const int green = A3; const int red = A4;
const int disp[3] = {A0, A1, A2};
const int A = 4; const int B = 5; const int C = 6; const int D = 7;
const int E = 8; const int F = 9; const int G = 10; const int P = 12;
int segments[7] = {A, B, C, D, E, F, G};
{1, 1, 1, 1, 1, 1, 0}, //0 {0, 1, 1, 0, 0, 0, 0}, //1 {1, 1, 0, 1, 1, 0, 1}, //2 {1, 1, 1, 1, 0, 0, 1}, //3
{0, 1, 1, 0, 0, 1, 1}, //4 {1, 0, 1, 1, 0, 1, 1}, //5 {1, 0, 1, 1, 1, 1, 1}, //6 {1, 1, 1, 0, 0, 0, 0}, //7
{1, 1, 1, 1, 1, 1, 1}, //8 {1, 1, 1, 1, 0, 1, 1} //9
int zastavka[4] ={0,1,2,1};
//перечисления какие используются
enum game_state {Ready = 1, Run, End};
enum timer_state {Running = 1, Paused}; // boolean?
enum button_state {Pressed = 1, Unpressed, Locked};
//дополнительные переменные для кнопок
button_state btn1_state = button_state::Unpressed;
button_state btn2_state = button_state::Unpressed;
unsigned long prev_btn_press;
int btn_debounce_time = 100;
game_state gm_state = game_state::Ready;
unsigned long secundomer = millis(); //секундомер для таймеров
unsigned long secundomerLed = millis(); //секундомер для лампочки
unsigned long secundomerPoint = millis(); //секундомер для дисплея
int timer1 = 300; int timer2 = 300;
timer_state t1_state = timer_state::Paused;
timer_state t2_state = timer_state::Paused;
int activeTimer = 300; int activeLed; int displayMode = 1; int ledMode = 0; int z = 0;
//---btns pull-up --------
pinMode(btn1, INPUT); digitalWrite(btn1, HIGH); pinMode(btn2, INPUT); digitalWrite(btn2, HIGH);
//---leds ---------------
digitalWrite(green, LOW);
//--- displays -----------
for (int i = 0; i < 3; ++i) {
pinMode(disp[i], OUTPUT);
digitalWrite(disp[i], HIGH); //HIGH
//--- segments -----------
for (int i = 0; i < 7; ++i) {
pinMode(segments[i], OUTPUT);
digitalWrite(segments[i], LOW); //LOW
//--- point --------------
//--- other pins input ---
pinMode(13, INPUT); digitalWrite(13, HIGH);
pinMode(A5, INPUT); digitalWrite(A5, HIGH);
pinMode(A6, INPUT); digitalWrite(A6, HIGH);
pinMode(A7, INPUT); digitalWrite(A7, HIGH);
//**************************** UTILS ***************************************************
if (digitalRead(btn1) == LOW && btn1_state == button_state::Unpressed) {
prev_btn_press = millis(); btn1_state = button_state::Pressed;
if (digitalRead(btn1) == LOW && btn1_state == button_state::Pressed && millis() - prev_btn_press >= btn_debounce_time) {
ButtonPressed(0); btn1_state = button_state::Locked;
if (digitalRead(btn1) == HIGH && btn1_state != button_state::Unpressed) {
btn1_state = button_state::Unpressed;
if (digitalRead(btn2) == LOW && btn2_state == button_state::Unpressed) {
prev_btn_press = millis(); btn2_state = button_state::Pressed;
if (digitalRead(btn2) == LOW && btn2_state == button_state::Pressed && millis() - prev_btn_press >= btn_debounce_time) {
ButtonPressed(1); btn2_state = button_state::Locked;
if (digitalRead(btn2) == HIGH && btn2_state != button_state::Unpressed) {
btn2_state = button_state::Unpressed;
void ButtonPressed(boolean btn) {
if (gm_state == game_state::Ready) {
t1_state = timer_state::Paused;
t2_state = timer_state::Running;
t2_state = timer_state::Paused;
t1_state = timer_state::Running;
//************************************ TIMERS ********************************************
if (timer1 <= 0 || timer2 <= 0)//диод постоянно гореть
if (t1_state == timer_state::Running) {
if (millis() - secundomer >= 1000) {
if (t1_state == timer_state::Running) {
else if (t2_state == timer_state::Running) {
//************************************ Display ********************************************
case 0: //показывать таймер без минут
// digitalWrite(P, LOW); //выключаем точку
for (int j = 0; j < 3; j++ ) {
d = activeTimer % 100 / 10;
d = activeTimer % 1000 / 100;
for (int i = 0; i < 7; i++) {
digitalWrite(segments[i], digits[d][i]);
digitalWrite(disp[j], LOW);
digitalWrite(disp[j], HIGH);
case 0: //показывать таймер с минутами
for (int j = 0; j < 3; j++ ) {
d = (activeTimer % 60) % 10;
d = (activeTimer % 60) % 100 / 10;
for (int i = 0; i < 7; i++) {
digitalWrite(segments[i], digits[d][i]);
digitalWrite(disp[j], HIGH);
digitalWrite(disp[j],LOW );
digitalWrite(P, LOW); //выключаем точку
case 1: //заставка с тирешками
if (millis() - secundomerPoint >= 250) {
for (int i = 0; i < 7; i++) { //погасить все дисплеи
digitalWrite(segments[i], HIGH);
for (int i = 0; i < 3; i++) { //погасить все дисплеи
digitalWrite(disp[i], LOW);
digitalWrite(disp[zastavka[z]],HIGH );
secundomerPoint = millis();
//************************************ LEDS ********************************************
digitalWrite(green, LOW);
if (activeLed == green) {
digitalWrite(green, LOW);
if (millis() - secundomerLed >= 1000) {
digitalWrite(activeLed, !digitalRead(activeLed));
secundomerLed = millis();
if (activeLed == green) {
digitalWrite(green, LOW);
digitalWrite(activeLed, HIGH);
//************************************ BEEPER ********************************************
if (activeTimer == 0 && gm_state != game_state::End) {
tone(beeper, 2800, 2000);
gm_state = game_state::End;