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.

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
}

Olá! Bem vindo ao Forum.

Eu não testei seu programa, mas o que me parece é que você desativa o botão de emergência logo após acioná-lo. Você precisa criar uma nova condição para desativar o alarme (como por exemplo apertar novamente um botão de andar).

A título de teste faça o seguinte: troque o trecho do programa abaixo e veja se o botão de emergência funciona enquanto você o mantém 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
    }

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

Tópicos sobre o mesmo assunto foram mesclados.

muito obrigado pela dica, irei realizar o teste, e caso de certo ou não, eu volto aqui para postar o que pode ter acontecido. Porem, eu não sei se o erro realmente é na programação ou no circuito, todos os pontos apontam para que seja a programação, pois já verifiquei o circuito diversas vezes, mas posso mandar uma imagem no forum apenas por desencargo de consciência.

Qual o link desta sua biblioteca " PushButton.h"?
PS: Só encontrei biblioteca com "b" minusculo.

Por favor, use o idioma inglês nas seções em inglês do fórum.

Tópico (novamente) movido para a seção em português do fórum. Por favor, deixe-o lá.

encontrei essa biblioteca num canal no Youtube, irei deixa-la como um link para o google drive, Biblioteca PushButton

esse link agora está acessível também

Acesso negado....
Passe o link do youtube.

Link do Youtube

eu acho que esse link vai
Link da biblioteca

vou anexar a biblioteca
PushButton.zip (16,1,KB)

Estes pinos não tem pinMode() definidos no setup.
Acho que a biblioteca define o pinMode deles.

Como estão ligados estes botoes?
Os pin1 e pin2 estão definidos como INPUT e os outros 3 como INPUT_PULLUP. (na biblioteca).

Post um esquematico do seu projeto.
Assim facilita nosso entedimento do seu projeto e melhora a ajuda.

aqui está o circuito, exatamente igual ao real

Este desenho não é um esquematico.
Deixa muito a desejar, mas ...
Não entendi qual a finalidade dos resistores de 10K ligado do pino até o + V .
E porque usar um modulo para usar um reed?
Ele pode ser usado direto no pino como qq botão ou chave.

perdão não tinha entendido corretamente a parte do desenho esquemático, você quer que eu faça um desenho que mostre para que tudo isso (tanto a programação quanto o circuito) será utilizado?

eu sei MUITO pouco sobre programação e montagem de circuitos, meu professor de curso, que ajudou na montagem e posicionou os resistores assim, eu acho que seriam os resistores pull-down?, não sei se é isso, e nem o motivo de eles estarem ai.

com eu e meu grupo sabemos muito pouco sobre tudo em relação ao arduino, nosso professor recomendou a utilização desse módulo, pois iria facilitar.

sinceramente desculpe-me a falta total de informações para realizar tal projeto, porem é o que eu consigo fazer no momento.

vou tentar realizar um desenho esquemático do projeto todo, e tentar explica-lo melhor

Ok, vou simular seu projeto no Wokwi.

Simulei o seu code no Wokwi e a melhor solução foi colocando esta linha :

" if (digitalRead(pinBE) == LOW) {break;} "

dentro de cada um dos dois whiles().
( Obs: Como estes 2 whiles() são identicos, podem ser reduzidos para uma função com um só.)

ficando cada um assim:

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
      if (digitalRead(pinBE) == LOW) {break;}
    }

PS: Uma duvida sobre seu projeto:

Se um caderante estiver no elevador e o elevador estiver entre andares e o cadeirante pressionar o botão de emergencia,
ele ficará retido entre os andares sem possibilidade de mover novamente o elevador?

fiz a mesma pergunta para meus colegas de trabalho a um tempo atrás, eles me falaram que é isso mesmo, pois caso tenha alguma coisa impedindo o elevador de continuar seu trajeto, a melhor e mais viável opção seria apenas parar o elevador no local em que ele se encontra, em minha opinião o elevador poderia voltar para o andar em que ele estava, mas não sei se esse seria o correto funcionamento do botão de emergência. Se você tiver uma sugestão melhor para o funcionamento, eu estou aberto para realizar mudanças no projeto.

vou tentar fazer o desenho esquemático agr, se alguma coisa não for de acordo com o esperado, peço por favor que me corrija, para que eu possa entender melhor e refazer da maneira correta

funcionamento do elevador .zip (1,9,MB)

acho que é possível compreender um pouco de como nós queremos que funcione o elevador, esse é nosso projeto, ele está "funcionando" sendo puxado por uma corda, enquanto a programação não fica pronta, mas em resumo, nós queremos que a plataforma de acessibilidade funcione da maneira que está no vídeo, porem com o circuito integrado, funcionando ao apertar os botões e tudo mais, queremos que a plataforma vá do térreo até o subsolo, que seria a parte inferior da escada. acho que será possível compreender um pouco melhor o projeto com esse vídeo.