Emergency button/ Botão de emergência

estou fazendo um projeto de TCC, que é uma plataforma de elevação para cadeirantes, onde ela vai do térreo para o subsolo, andar 0 e andar1. Também está sendo feito um protótipo em versão reduzida da escada e da plataforma, para o devido funcionamento do protótipo é necessário realizar uma programação em que a plataforma vá do andar 0 (térreo) até o andar 1 (subsolo), foi feito um circuito com os componentes:

1 aruduino uno
1 protoboard
3 botões
2 reed switch
1 Driver Motor Ponte H - L298N
1 Micro Motor de Engrenagem DC 1:48 5V 208RPM com duplo veio
1 fonte de alimentação de 12v

Porém o botão de emergência não está funcionando, ele não é ativado quando os botões de andares são pressionados e o motor está em funcionamento, enquanto isso todo o resto da programação e circuito está funcionando perfeitamente, desde os botões pinB1 e pinB2, até o funcionamento dos sensores Reed Switch. Foi feita uma lógica reversa no circuito para que os botões funcionassem corretamente, e não permanecerem ligados o tempo todo. o único problema realmente é apenas a falta de funcionamento do botão de emergência, as ligações do circuito estão todas corretas e de acordo com a programação. Por favor me ajudem a corrigir com urgência o funcionamento desse botão.

English:
I am working on a final project, which is a lifting platform for wheelchair users, which goes from the ground floor to the basement, floor 0 and floor 1. A prototype is also being made in a reduced version of the stairs and the platform. For the prototype to work properly, it is necessary to program the platform to go from floor 0 (ground floor) to floor 1 (basement). A circuit was made with the following components:

1 Arduino Uno

1 protoboard

3 buttons

2 reed switches

1 H-Bridge Motor Driver - L298N

1 Micro DC Gear Motor 1:48 5V 208RPM with double shaft

1 12V power supply

However, the emergency button is not working. It is not activated when the floor buttons are pressed and the motor is running. Meanwhile, all the rest of the programming and circuit are working perfectly, from the pinB1 and pinB2 buttons to the operation of the Reed Switch sensors. A reverse logic was made in the circuit so that the buttons would work correctly, and not remain on all the time. The only problem is really just the lack of functioning of the emergency button, the circuit connections are all correct and according to the programming. Please help me urgently fix the functioning of this button.

Programação:

// INCLUSÃO DE BIBLIOTECAS
#include <PushButton.h>

// DEFINIÇÕES DE PINOS
#define pin1 9         // Sensor do andar 0 (térreo)
#define pin2 10        // Sensor do andar 1 (subsolo)
#define pinB1 3        // Botão para andar 0 (térreo)
#define pinB2 4        // Botão para andar 1 (subsolo)
#define pinBE 5        // Botão de emergência
#define pinMotorFWD 7  // Pino de controle para rotação horário
#define pinMotorREV 8  // Pino de controle para rotação anti-horário

// DEFINIÇÕES
#define VelUP 255  // Velocidade máxima para subir
#define VelDW 255  // Velocidade máxima para descer
#define Parado 0   // Parado (PWM)

// INSTANCIANDO OBJETOS
PushButton Botao1(pinB1);  // Botão para andar 0
PushButton Botao2(pinB2);  // Botão para andar 1
PushButton BotaoE(pinBE);  // Botão de emergência

// FLAG DE INTERRUPÇÃO DO MOTOR
volatile bool emergenciaAtiva = false;

// DECLARAÇÃO DE FUNÇÕES
void moverCabine(byte andar, byte velMaxUP, byte velMaxDown);
byte verificaAndar();
void pararMotor();  // Função para parar o motor imediatamente

// DECLARAÇÃO DE VARIÁVEIS
byte sensorAndar[] = { pin1, pin2 };  // Sensores para os andares
int delayAndar[] = { 250, 300 };      // Delay para os andares 0 e 1
byte andarAtual;

// INICIALIZAÇÃO
void setup() {
  Serial.begin(9600);
  pinMode(pinMotorFWD, OUTPUT);  // Controle para rotação horário
  pinMode(pinMotorREV, OUTPUT);  // Controle para rotação anti-horário
  pinMode(pin1, INPUT);          // Sensor de andar 0
  pinMode(pin2, INPUT);          // Sensor de andar 1

  andarAtual = verificaAndar();  // Identifica em qual andar o elevador está
  Serial.println("Fim Setup");
}

// Loop principal
void loop() {
  Botao1.button_loop();
  Botao2.button_loop();
  BotaoE.button_loop();  // Verifica o estado do botão de emergência
  
  // Verifica se o botão de emergência foi pressionado
  if (BotaoE.pressed()) {
    emergenciaAtiva = true;  // Ativa a flag de emergência
    pararMotor();            // Para o motor imediatamente
    Serial.println("Botão de emergência acionado!");

    // Aguarda até que o botão de emergência seja liberado
    while (BotaoE.pressed()) {
      delay(10);  // Atraso para evitar bloqueio excessivo
    }

    emergenciaAtiva = false; // Desativa a flag de emergência
  }

  // VERIFICA QUAL BOTÃO FOI PRESSIONADO E MOVE A CABINE ATÉ O ANDAR CHAMADO
  if (Botao1.pressed() && !emergenciaAtiva) {
    moverCabine(0, VelUP, VelDW);  // Move para o andar 0
  } else if (Botao2.pressed() && !emergenciaAtiva) {
    moverCabine(1, VelUP, VelDW);  // Move para o andar 1
  }
}

// Função para parar o motor imediatamente
void pararMotor() {
  digitalWrite(pinMotorFWD, LOW);    // Desativa rotação no sentido horário
  digitalWrite(pinMotorREV, LOW);    // Desativa rotação no sentido anti-horário
}

// IMPLEMENTAÇÃO DAS FUNÇÕES

void moverCabine(byte andar, byte velMaxUP, byte velMaxDown) {
  if (andarAtual < andar) {              // Verifica se o andar atual é menor que o andar desejado (precisa subir)
    digitalWrite(pinMotorFWD, HIGH);     // Ativa a rotação no sentido horário (subir)
    digitalWrite(pinMotorREV, LOW);      // Garante que o motor não vai rodar no sentido anti-horário
    while (digitalRead(sensorAndar[andar]) == LOW && !emergenciaAtiva) {
      // Verifica se a cabine chegou ao andar ou se emergência foi acionada
      delay(10);  // Pequeno atraso para evitar sobrecarga no processador
    }
    digitalWrite(pinMotorFWD, LOW);        // Desativa a rotação
    andarAtual = andar;                    // Atualiza o andar atual
  } else if (andarAtual > andar) {         // Verifica se o andar atual é maior que o andar desejado (precisa descer)
    digitalWrite(pinMotorREV, HIGH);       // Ativa a rotação no sentido anti-horário (descer)
    digitalWrite(pinMotorFWD, LOW);        // Garante que o motor não vai rodar no sentido horário
    while (digitalRead(sensorAndar[andar]) == LOW && !emergenciaAtiva) {
      // Verifica se a cabine chegou ao andar ou se emergência foi acionada
      delay(10);  // Pequeno atraso para evitar sobrecarga no processador
    }
    digitalWrite(pinMotorREV, LOW);    // Desativa a rotação
    andarAtual = andar;                // Atualiza o andar atual
  }
}

// Função para verificar em que andar o elevador está
byte verificaAndar() {
  for (byte i = 0; i < 2; i++) {
    if (digitalRead(sensorAndar[i]) == HIGH) {  // Se o sensor for acionado
      delay(delayAndar[i]);
      digitalWrite(pinMotorFWD, LOW);    // Garante que a rotação seja parada
      digitalWrite(pinMotorREV, LOW);    // Garante que a rotação seja parada
      return i;
    }
  }
  return -1;  // Se nenhum andar estiver ativo
}

A post was merged into an existing topic: Emergency button