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
}