Barrera de Parking

Hola comunidad, les quería presentar mi problema por si alguien podría darme una mano.

Estoy elaborando una barrera de autos (comunes en peajes o parking, en mi caso es la de un parking) accionada por finales de carrera a un servomotor

Lo que pude hacer hasta ahora es esto:

-Aprieto el primer final de carrera y el servomotor va a 90 grados

-Una vez abierta la barrera ingresa el auto

-Y por ultimo pasa por el segundo final de carrera haciendo que la barrera baje a 0 grados

Hasta ahora bien, pero cual es el problema? El problema es que lo que acabo de hacer es el ingreso de los autos, y falta el egreso! Por mas veces que intente no encuentro la forma para que se haga de forma "inversa". No sé cómo hacerle entender al Arduino cual es el de entrada y cual el de salida

#include <Servo.h> // Librería para servos
Servo servo1; // Creamos un objeto de tipo servo
#define button 6 // definimos un primer botón
#define button2 7 // definimos un segundo botón
// Si da problemas el código, poner las var de los botones en MAYUS

void setup() {

 servo1.attach(9); // pin del servomotor en Arduino
 pinMode(button, INPUT); // se declara el botón como componente de entrada
 pinMode(button2, INPUT); // se declara el otro botón como componente de entrada
}

void loop () {

 int buttonstate1 = digitalRead(button);  // Creamos dos estados para los dos botones
 int buttonstate2 = digitalRead(button2);
if(buttonstate1 == true){ //si el estado del primer botón es true o encendido (pulsado), entonces...

servo1.write(180); // mover el servomotor 180 grados
delay(1000); // esperamos un segundo
}

if(buttonstate2 == true){ // si el estado del segundo botón es true o encendido (pulsado), entonces...

servo1.write(90); //mover el servomotor 90 grados
delay(1000); // esperamos un segundo
}




}

intente hacer eso, obviamente declarando todo correctamente previamente, pero lo que ocurre es que al precionar uno la barrera baja sube repetidas veces haciendome entender que no interpreta cual es el de salida o entrada:

void loop () {

 int buttonstate1 = digitalRead(button);  // Creamos dos estados para los dos botones
 int buttonstate2 = digitalRead(button2);
 int buttonstate3 = digitalRead(button);  // Creamos dos estados para los dos botones
 int buttonstate4 = digitalRead(button2);

if(buttonstate1 == true){ //si el estado del primer botón es true o encendido (pulsado), entonces...

servo1.write(180); // mover el servomotor 180 grados
delay(1000); // esperamos un segundo
}

if(buttonstate2 == true){ // si el estado del segundo botón es true o encendido (pulsado), entonces...

servo1.write(90); //mover el servomotor 90 grados
delay(1000); // esperamos un segundo
}

if(buttonstate3 == true){ //si el estado del primer botón es true o encendido (pulsado), entonces...

servo1.write(90); // mover el servomotor 180 grados
delay(1000); // esperamos un segundo
}

if(buttonstate4 == true){ // si el estado del segundo botón es true o encendido (pulsado), entonces...

servo1.write(180); //mover el servomotor 90 grados
delay(1000); // esperamos un segundo
}

Has visto los casos similares de este foro? Hay varios en los que he colaborado.
Maquetas con barreras usando IR o Ultrasónicos,dobles y simples.
Tal vez te de ideas.
Busca en Search (arriba derecha)

Ningun caso como el mio, ya revise

Puedes usar dos variables booleanas ,una para entrada y otra para salida que inicialmente estan a false.si se acciona primero el final de carrera de entrada ,pones a true la variable de entrada y viceversa,diferenciando asi los dos posibles estados.

Creo que ya lo intente, vos me decis que haga una de entrada con una de true y otra de false; y la de salida lo mismo pero invertido?

brunocast98:
Creo que ya lo intente, vos me decis que haga una de entrada con una de true y otra de false; y la de salida lo mismo pero invertido?

Exacto ,tienes pulsador_entrada, pulsador_salida,booleano entrando y booleano saliendo que en principio estan ambos en false .Si accionas pulsador_entrada y entrando y saliendo estan en false es que vas a entrar,variable entrando a true y levanta barrera,pero si activas pulsador_entrada y saliendo es true es que se ha pasado antes por la salida ,por lo tanto saliendo a false y se baja barrera pues el vehiculo ha salido.Idem con pulsador_salida.Si activas pulsador_salida y entrando y saliendo son falsos es que vas a salir por lo que saliendo a true y abre barrera.pero si activas pulsador_salida y entrando es true es que el vehiculo ha entrado .entrando a false y cierra barrera...es solo una manera de las muchas posibles de hacerlo (y seguro que mas elegantes que esta).

Hola brubocast98.

Prueba este sketch y nos cuentas:

#include <Servo.h> // Librería para servos
Servo servo1; // Creamos un objeto de tipo servo
#define button 6 // definimos un primer botón
#define button2 7 // definimos un segundo botón
int buttonstate1;  // switch colocado en el exterior (calle)
int buttonstate2;  // switch colocado en el interior (parking)
int sentido=0;     // Inicialmente sentido = indiferente

void setup()
{
    servo1.attach(9); // pin del servomotor en Arduino
    pinMode(button, INPUT); // se declara el botón como componente de entrada
    pinMode(button2, INPUT); // se declara el otro botón como componente de entrada
}

void loop()
{
    buttonstate1 = digitalRead(button);  // Creamos dos estados para los dos botones
    buttonstate2 = digitalRead(button2);
    if((buttonstate1)&&(sentido==0)) //Si estamos entrando,...
    {
        servo1.write(180); // Barrera subida
        delay(1000); // esperamos un segundo ???
        sentido=1;   // Sentido = entrando
    }
    else if((buttonstate1)&&(sentido==2))  // Estamos saliendo y llegamos fuera
    {
        servo1.write(90); // Barrera bajada
        delay(1000); // esperamos un segundo ???
        sentido=0;   // Sentido = indiferente
    }

    if((buttonstate2)&&(sentido==0))   // Si estamos saliendo,...
    {
        servo1.write(180);   // Barrera subida
        delay(1000); // esperamos un segundo ???
        sentido=2;  // Sentido = saliendo
    }
    else if((buttonstate2)&&(sentido==1))  // Estamos entrando y llegamos dentro
    {
        servo1.write(90); // Barrera bajadamover el servomotor 90 grados
        delay(1000); // esperamos un segundo ???
        sentido=0;   // Sentido = indiferente
    }
}

Los comentarios son explicativos.