Проект бомба
Сразу скажу вы можете использовать мой код, если хотите в своих проектах без какого либо преследования и так далее)))
Ещё в доковидные времена знакомый взял в аренду большой ангар, купил пару десятков приводов(стреляют пластиком), а внутри соорудил имитацию вагона метро, помещение квартиры, лабиринты всякие и открытую площадь. В общем открыл Страйк бол.
Как то пригласил пострелять, нормально так жалят пульки. Так вот одна из игр была такая:
Разбиваются на 2 команды контеры и террористы. В одной из комнат стоит живая девочка с двумя секундамерами в защитной маске разумеется. Задача каждой из команд добраться до комнаты и постараться удержать её в течении 5 минут. В случае попаданию уходишь к себе на базу.
Так вот этой девочке постоянно прилетало там даже жалко её. Я предложил ему всё это дело о осовременить каким там секундомеры в 21 веке.
В общем на ардуинке сделал такой девайс. Фото к сожалению не осталось поэтому рисунок.
В основе ардуинка нано, две большие кнопки, два светодиода, пьезопищалка, и тройной 7сигментый дисплей вот и все детали.
Задействованы два таймера.
Правила игры. Вначале команды расходятся по базам. Ведущий взводит бомбу красной кнопкой(включается таймер террористов 5 минут обратный отсчёт) и прячет её. Контеры должны найти бомбу и нажать на синюю кнопку, тогда таймер террористов останавливается и включается таймер контеров, дальше им нужно удерживать позицию до окончания времени(5 мин). Если террористы захватывают зону нажимают на кнопку их таймер продолжает тикать с того же место где остановился. ПО истечении времени либо мелодия либо взрыв.
Знакомый говорит менты особенно любили играть в эту игру каждую пятницу собирались.
Потом случился ковид, ещё арендатор начал мухлевать с отоплением и электроэнергией. По итого мой знакомый свернул бизнес. А бомбу отдал мне, пришлось как донора разобрать. Всё что осталось это вот кнопка, дисплей и ардуинка.
Исходный код
// Buttons ------
const int btn1 = 2; const int btn2 = 3;
// Beeper -------
const int beeper = 11;
// Leds --------
const int green = A3; const int red = A4;
// Displays -----
const int disp[3] = {A0, A1, A2};
// Segments -----
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;
// Variables ----
int segments[7] = {A, B, C, D, E, F, G};
int digits[10][7] = {
{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;
void setup() {
//---btns pull-up --------
pinMode(btn1, INPUT); digitalWrite(btn1, HIGH); pinMode(btn2, INPUT); digitalWrite(btn2, HIGH);
//---leds ---------------
pinMode(green, OUTPUT);
digitalWrite(green, LOW);
pinMode(red, OUTPUT);
digitalWrite(red, 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 --------------
pinMode(P, OUTPUT);
digitalWrite(P, LOW);
//--- 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);
tone(beeper, 2800, 100);
}
void loop() {
ButtonsListner();
Timers();
Display(displayMode);
Timers();
Leds(ledMode);
Beeper();
}//loop
//**************************** UTILS ***************************************************
void ButtonsListner() {
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;
}
}//buttonListner
void ButtonPressed(boolean btn) {
tone(beeper, 2800, 100);
if (gm_state == game_state::Ready) {
displayMode = 0 ;
ledMode = 1;
}
if (btn) { //button2 red
t1_state = timer_state::Paused;
t2_state = timer_state::Running;
activeLed = red;
} else {//button1 green
t2_state = timer_state::Paused;
t1_state = timer_state::Running;
activeLed = green;
}
}//buttonPressed
//************************************ TIMERS ********************************************
void Timers() {
if (timer1 <= 0 || timer2 <= 0)//диод постоянно гореть
{
if (t1_state == timer_state::Running) {
activeTimer = timer1;
} else {
activeTimer = timer2;
}
ledMode = 2;
}
else {
if (millis() - secundomer >= 1000) {
if (t1_state == timer_state::Running) {
timer1 = timer1 - 1;
activeTimer = timer1;
}
else if (t2_state == timer_state::Running) {
timer2 = timer2 - 1;
activeTimer = timer2;
}
secundomer = millis();
}
}
}//Timers
//************************************ Display ********************************************
void Display(int mode) {
switch (mode) {
/*
case 0: //показывать таймер без минут
// digitalWrite(P, LOW); //выключаем точку
for (int j = 0; j < 3; j++ ) {
int d;
switch (j) {
case 0:
d = activeTimer % 10;
break;
case 1:
d = activeTimer % 100 / 10;
break;
case 2:
d = activeTimer % 1000 / 100;
break;
}
for (int i = 0; i < 7; i++) {
digitalWrite(segments[i], digits[d][i]);
}
digitalWrite(disp[j], LOW);
delay(1);
digitalWrite(disp[j], HIGH);
}
break;
*/
case 0: //показывать таймер с минутами
for (int j = 0; j < 3; j++ ) {
int d;
switch (j) {
case 0:
d = (activeTimer % 60) % 10;
break;
case 1:
d = (activeTimer % 60) % 100 / 10;
break;
case 2:
d = activeTimer / 60;
digitalWrite(P, HIGH);
break;
}
for (int i = 0; i < 7; i++) {
digitalWrite(segments[i], digits[d][i]);
}
digitalWrite(disp[j], HIGH);
delay(1);
digitalWrite(disp[j],LOW );
digitalWrite(P, LOW); //выключаем точку
}
break;
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 );
z = z + 1 ;
if (z == 4) {
z = 0;
}
secundomerPoint = millis();
}
break;
}
}//display
//************************************ LEDS ********************************************
void Leds(int mode) {
switch (mode) {
case 0://off
digitalWrite(red, LOW);
digitalWrite(green, LOW);
break;
case 1://blink
if (activeLed == green) {
digitalWrite(red, LOW);
} else {
digitalWrite(green, LOW);
}
if (millis() - secundomerLed >= 1000) {
digitalWrite(activeLed, !digitalRead(activeLed));
secundomerLed = millis();
}
break;
case 2://on
if (activeLed == green) {
digitalWrite(red, LOW);
} else {
digitalWrite(green, LOW);
}
digitalWrite(activeLed, HIGH);
break;
}
}//Leds
//************************************ BEEPER ********************************************
void Beeper() {
if (activeTimer == 60) {
tone(beeper, 2800, 500);
}
if (activeTimer == 58) {
tone(beeper, 2800, 500);
}
if (activeTimer == 5) {
tone(beeper, 2800,50);
}
if (activeTimer == 3) {
tone(beeper, 2800,50);
}
if (activeTimer == 1) {
tone(beeper, 2800,50);
}
if (activeTimer == 0 && gm_state != game_state::End) {
tone(beeper, 2800, 2000);
gm_state = game_state::End;
}
}

