Sensor Fim de Curso Portão Eletronico

boa noite,
Estou com uma dúvida sobre um projeto, seguinte:
estou montando uma placa para controlar um portao eletronico,
Consiste em:
Apertar o controle 1 vez: Abre
Apertar o controle 2 vezes: Para
Apertar o controle 3 vezes: Fecha

O problema É:

Quero colocar 2 sensores de fim se curso nas extremidades do portão, mas não consigo no ARDUINO(programa) !

não sei que variáveis utilizar ! Pois quando os sensores são ativados (chega ao fim do curso do portão) ele não fecha ou abre mais !

Obs.: sou iniciante com arduino !

int cont =4; //conta os ciclos do controle/botao
int botao=12;
int fecha=4;
int abre=3;
int sensor1=5; //sensor fim de curso do portao
int sensor2=6; //sensor fim de curso do portao
int estadosensor1=0;
int estadosensor2=0;
int estadobotao=0;

void setup() {
pinMode(botao,INPUT); // indica que o pino 12 sera um botao de entrada
pinMode(fecha, OUTPUT);
pinMode(abre, OUTPUT);
pinMode(sensor1, INPUT);
pinMode(sensor2, INPUT);
}

void loop() {
estadosensor1=digitalRead(sensor1);
estadosensor2=digitalRead(sensor2);

if(digitalRead(botao)==1){ // se o botão for pressionado
cont++; // atribui +1 a variavel cont
delay(500); // da um tempo para o pressionamento, senao o arduino endoida

if(cont==5){cont=1;} // deixa o valor somente de 1 a 4

if(cont==1){
digitalWrite(fecha, HIGH); //fechando o portao
}}
if (cont==2){
digitalWrite(fecha, LOW); //abrindo o portao
}
if (cont==3){
digitalWrite(abre, HIGH);
}
if (cont==4){
digitalWrite(abre, LOW);
}
if ((estadosensor1 == 1) || (estadosensor2 == 1) && (estadobotao == 0)) {
digitalWrite(abre, LOW);
digitalWrite(fecha, LOW);

////////PAREI AQUI ME AJUDEM AI !!!! RSRSRS

Tens varios problemas...

Um dos quais e que o codigo que detecta os pulsos no botao nao detecta pulsos, mas continua a contar enquanto o botao estiver pressionado.

Nos ifs, tens de colocar a deteccao dos fins de curso... O ultimo if leva em consideracao ambos os fins de curso ao mesmo tempo... assim nao funciona.

Nota tambem que deves alterar a variavel cont consoante o sensor de fim de curso que e activado.

acho que você deveria fazer um while para definir a entrada do botão, tipo enquanto o botão pressionado ele so conta 1, e usar uma flag pra somar..

while(digitalRead(botao)){
 botaoPressionado=true;
}

aqui vc pode colocar um IF para se estiver aberto ele fechar, e se estiver fechado ele abrir(em relação aos sensores..
tipo isso:

if(botaoPressionado&&estadosensor1){//sensor para totalmente fechado.. SÓ PODE ABRIR
cont=3;}
if(botaoPressionado&&estadosensor2){//sensor para totalmente aberto.. SÓ PODE FECHAR
cont=1;}

assim se você apertar por 4 segundos ele não vai endoidar..

dai com essa flag você usa pra somar ao contador.

if(flag){ cont+=1; //somando 1 ao contador
botaoPressionado=false; //reset da flag
}

switch (cont){ //usando essa função pra simplificar..

case 1: //se o contador for 1 fecha o portão
  digitalWrite(fecha, HIGH); //fechando o portao
   digitalWrite(abre, LOW); // para não ter os dois comandos ao mesmo tempo
break;

case 2: //se o contador for 2 para o portão
  digitalWrite(fecha, LOW); //fechando o portao
   digitalWrite(abre, LOW); // para não ter os dois comandos ao mesmo tempo
break;

case 3: //se o contador for 3 Abre o portão
  digitalWrite(fecha, LOW); //fechando o portao
   digitalWrite(abre, HIGH); // para não ter os dois comandos ao mesmo tempo
break;
} // FIM DO SITCH
AQUI COLOCA UM IF PRA PARAR O PORTÃO NO FIM DE CURSO.. MANDA TODO MUNDO PRA LOW

entendi sim,

Também estou tentando por outro método, ao invés de um único botão, estou pensando em colocar dois botões,
um para abrir e outro para fechar, isso mudará o projeto, mas simplificará um pouco.
tiraria esse método de contagem e o motor pararia quando apertasse novamente o botao (fechar ou abrir).

Desde já Agradeço a todos

int motor1=3;
int motor2=4;
int botao=12; //botao Fecha
int botao2=11; //botao Abre
int var=0; // valor instantaneo enviado pelo botão
int var2=0; // valor guardado
int var3=0;
int estado=0; // guarda o valor 0 ou 1 (HIGH ou LOW)
int estado2=0;
void setup()
{
pinMode(motor1,OUTPUT);
pinMode(motor2, OUTPUT);
pinMode(botao2, INPUT);
pinMode(botao,INPUT);
}
void loop()
{
var=digitalRead(botao); // ler o valor enviado pelo botão: "HIGH" ou "LOW"

if ((var == HIGH) && (var2 == LOW)) {
estado = 1 - estado;
delay(20); // de-bouncing
}
var2=var;
if (estado == 1)

{
digitalWrite(motor1, HIGH); // liga o motor
} else {
digitalWrite(motor1, LOW); // desliga o motor
}

var3=digitalRead(botao2); // ler o valor enviado pelo botão: "HIGH" ou "LOW"

if ((var3 == HIGH) && (var2 == LOW)) {
estado2 = 1 - estado2;
delay(20); // de-bouncing
}
var2=var3;
if (estado2 == 1)

{
digitalWrite(motor2, HIGH); // liga o motor
} else {
digitalWrite(motor2, LOW); // desliga o motor
}
}

veja que seu flag muda de estado muito rápido (o tempo de um loop) seu motor pode funcionar por.. 2 segundos no máximo. Escreva no papel o que você quer fazer, e depois estabeleça as propriedades de comando.

void loop()
{
  var=digitalRead(botao); // ler o valor enviado pelo botão: "HIGH" ou "LOW"
  
  
  if ((var == HIGH) && (var2 == LOW)) {
    estado = 1 - estado;
    delay(20); // de-bouncing
  }
  var2=var;
  if (estado == 1)
  
  {
    digitalWrite(motor1, HIGH); // liga o motor
  } else {
    digitalWrite(motor1, LOW);  // desliga o motor
  } 
...

veja que na execução você ler o estado, salva e executa o comando.. motor 1 high..
mas ai no próximo loop o botão está em low, e seu motor vai para low tbm..

seu portão so abre ou fecha enquanto você segura o botão..

escreva no papel o que você quer.. e veja as condições de start e stop.. que você vai ver onde está errando..