Ошибка в коде для игровых принадлежностей

,

Занимаюсь сборкой игровых принадлежностей для страйкбола и пейнбола, и недавно столкнулся с проблемой, После ввода кода для закладки, пишет Бомба активирована! (как и задумывалось) а потом вместо таймера сразу перекидывает на Boom, тоесть, бомба взорвана. Раньше, код был на другую распиновку, провода для разминирования были на аналогах, т.к. не хватало пинов на Arduino Uno, но потом, решил поменять, потомучто аналоги “шумные”, но проблема не изменилась, я уже пробовал закидывать код в нейросети, но проблема всё тажа, я надеюсь, ктото мне поможет

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>

// Настройки экрана
LiquidCrystal_I2C lcd(0x27, 20, 4);

// Настройки клавиатуры
const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
  {'1', '2', '3', 'A'},
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'*', '0', '#', 'D'}
};
byte rowPins[ROWS] = {9, 10, 11, 12};
byte colPins[COLS] = {A0, A1, A2, A3};
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);

// Пины
const int buzzer = 8;
const int ledPin = 13;
const int toggleSwitch = 2;
const int correctWire = 3;
const int incorrectWire1 = 4;
const int incorrectWire2 = 5;
const int neutralWire = 6;

// Переменные состояния
bool toggleActivated = false; // Состояние тумблера
bool bombActivated = false; // Состояние бомбы
String enteredCode = ""; // Введённый код
const String activationCode = "7355608"; // Код активации
unsigned long countdownStartTime;
int countdownTime = 40000; // 40 секунд в миллисекундах

void setup() {
  pinMode(buzzer, OUTPUT);
  pinMode(ledPin, OUTPUT);
  pinMode(toggleSwitch, INPUT_PULLUP);
  pinMode(correctWire, INPUT_PULLUP);
  pinMode(incorrectWire1, INPUT_PULLUP);
  pinMode(incorrectWire2, INPUT_PULLUP);
  pinMode(neutralWire, INPUT_PULLUP);

  lcd.begin();
  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.print("Activate toggle");
}

void loop() {
  // Проверяем состояние тумблера
  if (!toggleActivated && digitalRead(toggleSwitch) == LOW) {
    toggleActivated = true;
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Enter code:");
    lcd.setCursor(0, 1);
  }

  // Обработка ввода кода
  if (toggleActivated && !bombActivated) {
    char key = keypad.getKey();
    if (key) {
      handleCodeInput(key);
    }
  }

  // Если бомба активирована, запустить обратный отсчёт
  if (bombActivated) {
    unsigned long elapsedTime = millis() - countdownStartTime;
    int remainingTime = countdownTime - elapsedTime;

    if (remainingTime <= 0) {
      detonateBomb();
    } else {
      displayCountdown(remainingTime);
      checkWires();
    }
  }
}

void handleCodeInput(char key) {
  if (key == '#') { // Проверка кода
    if (enteredCode == activationCode) {
      activateBomb();
    } else {
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Wrong code!");
      tone(buzzer, 1000, 500); // Ошибка
      delay(2000);
      resetCodeEntry();
    }
  } else if (key == '*') { // Сброс кода
    resetCodeEntry();
  } else {
    enteredCode += key;
    lcd.print(key);
    tone(buzzer, 2000, 100); // Пик при вводе символа
  }
}

void activateBomb() {
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Bomb activated!");
  tone(buzzer, 3000, 500); // Громкий сигнал
  delay(2000);
  lcd.clear();

  bombActivated = true;
  countdownStartTime = millis();
}

void displayCountdown(int remainingTime) {
  int seconds = remainingTime / 1000;
  int millisLeft = (remainingTime % 1000) / 10;

  lcd.setCursor(0, 0);
  lcd.print("Timer: ");
  lcd.print(seconds);
  lcd.print(".");
  lcd.print(millisLeft);

  if (millisLeft % 10 == 0) { // Пик каждую секунду
    tone(buzzer, 2000, 100);
    digitalWrite(ledPin, HIGH);
    delay(100);
    digitalWrite(ledPin, LOW);
  }
}

void checkWires() {
  if (digitalRead(correctWire) == LOW) {
    defuseBomb();
  } else if (digitalRead(incorrectWire1) == LOW || digitalRead(incorrectWire2) == LOW) {
    countdownTime -= 10000; // Ускорение таймера на 10 секунд
    lcd.setCursor(0, 1);
    lcd.print("Faster countdown!");
  } else if (digitalRead(neutralWire) == LOW) {
    lcd.setCursor(0, 1);
    lcd.print("Neutral wire!");
  }
}

void defuseBomb() {
  bombActivated = false;
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Bomb defused!");
  tone(buzzer, 1000, 1000);
  delay(5000);
  lcd.clear();
  lcd.print("Activate toggle");
  toggleActivated = false;
}
void detonateBomb() {
  bombActivated = false;
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("BOOM!");
  for (int i = 0; i < 10; i++) {
    tone(buzzer, 4000, 500);
    digitalWrite(ledPin, HIGH);
    delay(500);
    digitalWrite(ledPin, LOW);
    delay(500);
  }
  lcd.clear();
  lcd.print("Activate toggle");
  toggleActivated = false;
}

void resetCodeEntry() {
  enteredCode = "";
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Enter code:");
  lcd.setCursor(0, 1);
}

Шел бы ты с такими игрушками с этого форума.
Сейчас время такое, что подобным лучше не заниматься.

2 лайка

Ошибка в строке 36

2 лайка

ух, глазастый))

1 лайк

А не «переобутый» ли случаем тот самый, что мины делать недавно хотел?)

Я тут впервый раз, так что нет

Я продаю только организациям по страйкболу. Проблем не будет, поверь.

Ты имеешь ввиду что ошибка с библиотеками?

какие библиотеки?
назвали номер строки где допущена ошибка.

Ну так допущена ошибка, в чём? Что именно там не так? В синтаксисе или в написании?

в выборе типа переменной.

предлагаю протестировать следующий код и удивится

void setup()
{
  Serial.begin(115200);

  int i = 40000;
  Serial.println(i);
}
void loop()
{};

int | Аппаратная платформа Arduino

На чём, простите? Аналоги - это что?

Они ещё и шумные? Дети что ли?

Для начала, попробуйте внятно объяснить проблему. Кто там у Вам на ком стоял и кто шумел.

Если бы только в ней.

Етить-колотить. Не стрёмно?

я просто поменял int на unsigned long и всё заработало, но всё же, спасибо вам огромное!

Неа, не стрёмно ХD

это не мне, отметьте вопрос решен пост от @MMM

Покажи хоть фото))

Уже отметил, и тебе спасибо!