Boa noite. Estou com o seguinte cenário que preciso desenvolver:
Tenho um portão e uma cancela em uma eclusa. quero criar um sistema de intertravamento em que ao apertar de um botão, o portão se abra, e ao fechar a cancela abra automaticamente, só permitindo a abertura do portão novamente após a cancela estar fechada. Eis o grande problema. Quero que, se acaso no meio do processo o botão para abertura for acionado novamente, o controlador espere o ciclo terminar para disparar novamente de forma automatica a abertura do portão, recomeçando o ciclo. Exemplo: carro A aciona o botão, portão se abre e ele entra na eclusa. Antes do portão fechar por completo, carro B aciona o botão novamente. Controlador espera o portão fechar, abre a cancela após o fechamento e assim que constatar que a cancela fechou, manda abrir o portão e recomeça o ciclo.
Alguem pode me ajudar?
Se eu entendi bem, o que tu queres é uma máquina de estados em que o botão apenas "é ouvido" num determinado estado.
//definição de estados, esta parece ser a ordem correcta.
#define PARADO 0
#define ABRE_PORTAO 1
#define FECHA_PORTAO 2
#define ABRE_CANCELA 3
#define FECHA_CANCELA 4
unsigned int varEstado = 0;
void setup() {
// put your setup code here, to run once:
}
void loop() {
// put your main code here, to run repeatedly:
maquinaEstado();
}
void maquinaEstados(){
//lógica da máquina de estados.
switch(varEstado) {
//neste caso estamos à espera que alguém carregue no botão para abrir o portão.
//quando o botão for premido, saltamos para outro estado.
case PARADO:
if (digitalRead(botaoPortao) == 1)
varEstado = ABRE_PORTAO;
break;
case ABRE_PORTAO:
//neste estado temos passos, ou seja temos de abrir o portão e esperar que o carro entre.
if (digitalRead(carroPresente) == 0) //O carro não entrou.
digitalWrite(comandoAbrePortao, 1);
else {
//o carro está dentro.
digitalWrite(comandoAbrePortão, 0);
varEstado = FECHA_PORTAO;
}
break;
case FECHA_PORTAO:
//aqui, o carro está entre portão e cancela. Apenas queremos fechar o portão.
if (digitalRead(portaoFechado) == 0)
digitalWrite(comandoFechaPortao, 1);
else{
digitalWrite(comandoFechaPortao, 0);
varEstado = ABRE_CANCELA;
}
break;
case ABRE_CANCELA:
if (digitalRead(carroPresente) == 1) {
digitalWrite(comandoAbreCancela, 1);
} else {
digitalWrite(comandoAbreCancela, 0);
varEstado = FECHA_CANCELA;
}
break;
case FECHA_CANCELA:
if (digitalRead(cancelaAberta) == 1) {
digitalWrite(comandoFechaCancela, 1);
} else {
digitalWrite(comandoFechaCancela, 0);
varEstado = PARADO;
}
break;
}
}
This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.