Codigo para intertravamento com acumulo de pulso

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.