Подскажите как доделать задуманный код

Ник 326

✩✩✩✩✩✩✩
29 Сен 2023
1
0
Здравствуйте!
И так, делаю я мотоциклетную сигнализацию.
В основе лежит NodeMCU
И такие компоненты как: пара модульных реле, датчик наклона, и модуль с пультом на 4 кнопки и соотвественно 4 вывода(использоваться будет только 3).

В чем задача: Нажимаю на кнопку

A, ставится режим сигнализации, размыкается реле номер 1(цепь зажигания) и ведется наблюдение за датчиком наклона, при любом изменении на выводе начинает замыкаться и размыкаться с задержкой в 1 секунду в течении 20, реле номер 2(сигнал)

Нажимаю на кнопку

B, режим охраны отключается и замыкается реле номер 1

Нажимаю на кнопку

D, замыкается реле номер 2(подать сигнал удаленно, например из окна)

В чем проблема: не выходит сделать режим включенной охраны, а именно таймер, и в целом на датчик реакция не такая как хотелось бы

Делал через нейросетку, так как в коде не разбираюсь.
Если кто может помочь буду очень благодарен ибо сам мучаюсь с этим уже 4-й вечер
C++:
#include <Bounce2.h>

const int relay1Pin = D6;
const int relay2Pin = D7;
const int buttonAPin = D1;
const int buttonBPin = D2;
const int buttonDPin = D5;
const int tiltSensorPin = D3;

Bounce buttonA = Bounce();
Bounce buttonB = Bounce();
Bounce buttonD = Bounce();
Bounce tiltSensor = Bounce();

bool alarmArmed = false;
bool alarmTriggered = false;
bool buttonDPressed = false;
bool tiltSensorActive = false;
unsigned long tiltSensorChangeTime = 0;
unsigned long relay2LastChangeTime = 0;
bool relay2State = LOW;

void setup() {
  pinMode(relay1Pin, OUTPUT);
  pinMode(relay2Pin, OUTPUT);

  pinMode(buttonAPin, INPUT_PULLUP);
  pinMode(buttonBPin, INPUT_PULLUP);
  pinMode(buttonDPin, INPUT_PULLUP);

  pinMode(tiltSensorPin, INPUT_PULLUP);

  buttonA.attach(buttonAPin);
  buttonA.interval(5);

  buttonB.attach(buttonBPin);
  buttonB.interval(5);

  buttonD.attach(buttonDPin);
  buttonD.interval(5);

  tiltSensor.attach(tiltSensorPin);
  tiltSensor.interval(5);

  digitalWrite(relay1Pin, HIGH); // Изначально цепь зажигания включена
  digitalWrite(relay2Pin, LOW); // Изначально реле 2 выключено
}

void loop() {
  buttonA.update();
  buttonB.update();
  buttonD.update();
  tiltSensor.update();

  if (buttonA.fell()) {
    if (!alarmArmed) {
      digitalWrite(relay1Pin, LOW); // Режим 1: включено реле 1
      digitalWrite(relay2Pin, LOW); // Режим 1: выключено реле 2
      alarmArmed = true;
      alarmTriggered = false;
    }
  }

  if (buttonB.fell()) {
    if (alarmArmed) {
      digitalWrite(relay1Pin, HIGH); // Режим 2: выключено реле 1
      alarmArmed = false;
      alarmTriggered = false;
      digitalWrite(relay2Pin, LOW); // Режим 2: выключено реле 2
    }
  }

  if (buttonD.fell()) {
    buttonDPressed = true; // Режим 3: кнопка D нажата, замыкаем реле 2
    digitalWrite(relay2Pin, HIGH);
  }

  if (buttonD.rose()) {
    buttonDPressed = false; // Режим 3: кнопка D отпущена, размыкаем реле 2
    digitalWrite(relay2Pin, LOW);
  }

  // Проверяем состояние датчика наклона
  if (tiltSensor.fell() && alarmArmed) {
    if (!tiltSensorActive) {
      tiltSensorActive = true;
      tiltSensorChangeTime = millis(); // Запоминаем время начала изменения наклона
    }
  }

  if (tiltSensor.rose() && alarmArmed) {
    if (tiltSensorActive) {
      unsigned long currentTime = millis();
      unsigned long elapsedTime = currentTime - tiltSensorChangeTime;

      if (elapsedTime < 20000) { // Проверяем, прошло ли менее 20 секунд с начала изменения наклона
        if (elapsedTime % 2000 < 1000) {
          // Изменяем состояние реле 2 с задержкой в 1 секунду
          if (currentTime - relay2LastChangeTime >= 1000) {
            relay2State = !relay2State;
            digitalWrite(relay2Pin, relay2State);
            relay2LastChangeTime = currentTime;
          }
        }
      } else {
        tiltSensorActive = false; // Сбрасываем флаг активации датчика наклона
        digitalWrite(relay2Pin, LOW); // Выключаем реле 2
      }
    }
  }
}