0

Проект бомба

Сразу скажу вы можете использовать мой код, если хотите в своих проектах без какого либо преследования и так далее)))

Ещё в доковидные времена знакомый взял в аренду большой ангар, купил пару десятков приводов(стреляют пластиком), а внутри соорудил имитацию вагона метро, помещение квартиры, лабиринты всякие и открытую площадь. В общем открыл Страйк бол.

Как то пригласил пострелять, нормально так жалят пульки. Так вот одна из игр была такая:

Разбиваются на 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;

}

}

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества