[SOLUCIONADO] o es un fallo raro, o me perdí medio curso

Hola compis. Antes de nada os aviso de que lo que estoy haciendo es a base de tutoriales, cursos......

Estoy haciendo un programa para controlar un elevador de coches, de esos de los talleres.
Harto de estar harto de buscar soluciones a una serie de problemas que me surgian he decidido reducir el codigo a la minima expresión, es decir, 2 botones para subir y bajar y 4 salidas para gestionar los motores este es mi código:

antes del codigo... las entradas las tengo con pullup de 1k

const int Ibup = 13;
const int Ibdown = 12;
const int Oma = 7;
const int Omm = 6;
const int Oup = 5;
const int Odown = 4;

bool butIbup, butIbdown;
bool estsubir = false;
bool estbajar = false;


void setup() {

  // put your setup code here, to run once:
pinMode(Omm, OUTPUT);
pinMode(Oma, OUTPUT);
pinMode(Oup, OUTPUT);
pinMode(Odown, OUTPUT);

pinMode(Ibup, INPUT);
pinMode(Ibdown, INPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
  butIbup = digitalRead(Ibup);
  butIbdown = digitalRead(Ibdown);

if (butIbup == LOW) {
  estsubir = true;
}
if (butIbdown == LOW) {
  estbajar = true;
}

if (butIbup == LOW && butIbdown == LOW) {
  estsubir = false;
  estbajar = false;
}

if (estsubir){
     digitalWrite(Omm, HIGH);
     digitalWrite(Oma, HIGH); 
     delay(500);    
     digitalWrite(Oup, HIGH);
     digitalWrite(Odown, LOW);
}
   else {
     digitalWrite(Omm, LOW);
     digitalWrite(Oma, LOW);     
     digitalWrite(Oup, LOW);
     digitalWrite(Odown, LOW);
   }
if (estbajar){
     digitalWrite(Omm, HIGH);
     digitalWrite(Oma, HIGH); 
     delay(500);    
     digitalWrite(Oup, LOW);
     digitalWrite(Odown, HIGH);
}
   else {
     digitalWrite(Omm, LOW);
     digitalWrite(Oma, LOW);     
     digitalWrite(Oup, LOW);
     digitalWrite(Odown, LOW);

   } 
  }

la idea es: si pulso a subir, que me active "estsubir" si pulso bajar que me active "estbajar" y si pulso los 2 que no haga nada.

Pues bien, lo que me hace es que cuando pulso los 2 efectivamente no hace nada. Cuando pulso subir, me activa omm y oma pero la Oup, no la activa bien.cuando pulso bajar, me activa correctamente Omm y Oma pero Oup yOdown se me activan intermitentemente.

Alguan idea de donde meto la pata??

Es como ejercicio o es en serio?
Porque resulta mas fácil que SUBIR suba mientras presionas y no haga nada cuando lo sueltas
Y Bajar baje cuando lo presionas y no haga nada cuando lo sueltas.
Y la operacion SUBIR Y BAJAR simultáneo no estuviera permitida.

Ahora respondo lo que tu pides.
Prueba asi

const int Ibup = 13;
const int Ibdown = 12;
const int Oma = 7;
const int Omm = 6;
const int Oup = 5;
const int Odown = 4;

bool butIbup, butIbdown;
bool estsubir = false;
bool estbajar = false;


void setup() {

  // put your setup code here, to run once:
pinMode(Omm, OUTPUT);
pinMode(Oma, OUTPUT);
pinMode(Oup, OUTPUT);
pinMode(Odown, OUTPUT);

pinMode(Ibup, INPUT);
pinMode(Ibdown, INPUT);
}

void loop() {
	// put your main code here, to run repeatedly:
	butIbup = digitalRead(Ibup);
	butIbdown = digitalRead(Ibdown);

	if (butIbup == LOW) {
	  estsubir = true;
	}
	if (butIbdown == LOW) {
	  estbajar = true;
	}

	if (butIbup == LOW && butIbdown == LOW) {
	  estsubir = false;
	  estbajar = false;
	  digitalWrite(Omm, LOW);
	  digitalWrite(Oma, LOW);     
	  digitalWrite(Oup, LOW);
	  digitalWrite(Odown, LOW); 
	}

	if (estsubir) {
	     digitalWrite(Omm, HIGH);
	     digitalWrite(Oma, HIGH); 
	     delay(500);    
	     digitalWrite(Oup, HIGH);
	     digitalWrite(Odown, LOW);
	}

	if (estbajar) {
	     digitalWrite(Omm, HIGH);
	     digitalWrite(Oma, HIGH); 
	     delay(500);    
	     digitalWrite(Oup, LOW);
	     digitalWrite(Odown, HIGH);
	}
}

Cuando estsubir o estbajar estaban en false que hacía el programa ejecutaba lo que ahora te puse en la condición de NADA.

Esta nochge lo pruebo. Aunque la idea que planteabas de que subir y bajar no esté permitido me gusa mucho, pero no se hacerla, por o no lo planteé

Eso que planteas ni siquiera requiere un Arduino.
Electricamente usas un botón que al presionarlo da energia al motor que sube
Y lo mismo con el botón que baja.
Al soltarnos los motores no reciben energía y se detienen.
Ahora generalmente no hay dos motores sino 1. Y el sentido de giro hace que vayas hacia arriba o abajo. Pero de igual modo se puede hacer solo con dos pulsadores y sin Arduino.

Gracias surbyte. Hasta ahi llego, lo quiero hacer con arduino pq tengo que implementarle mas tarde un encoder para asegurarme de que cada columna vaya a la misma altura. El mundo de la automatizacion lo conozco bastante, los elevadores mas. Por otra parte, aunque realmente para subir y bajar no necesito mas que los 2 botones y los contactores, este elevador, igual que la mayoria de los mediamamente modernos no funciona con un solo motor y una cadena. Se usan 2 motores, uno para cada columna, por eso, la necesidad de poner el encoder.

Ok. Ahora te comprendo. Bien.
Cuando sigas con el proyecto, sigue aquí.
Sería bueno que le pongas esquemas para mejorar la información para otros que quieran hacer lo que tu estas haciendo.

Explico como sigue la cosa:

-cuando pulso los 2 a la vez, no hace nada (bien)
-cuando pulso subir, sube, pero cuando suelto sigue subiendo (mal) si ahora le doy a bajar, subir y bajar empiezan a alternarse de forma intermitente.
-lo mismo cuando empiezo con bajar

ALguna idea?

Yo programe

	if (butIbup == LOW) {
	  estsubir = true;
	}
	if (butIbdown == LOW) {
	  estbajar = true;
	}

pero pense que lo parabas presionando los dos
asi que agrega

if (butIbup == LOW) 
    estsubir = true;
else
     estsubir = false;
if (butIbdown == LOW) 
     estbajar = true;
else
     estbajar = false;

pero esto hace que presionar los dos no sirva para nada porque en cuanto sueltes SUBIR o BAJAR ya pones
en false estsubir o estbajar
asi que cuando presiones los dos botones activará la acción de los motores pero sacaría

if (butIbup == LOW && butIbdown == LOW) {
	  estsubir = false;   // retirar
	  estbajar = false;   // retirar

explico como sigue la cosa:

la funcionalidad es buena, pero (siempre debe haber un pero :frowning: ) cuando suelto alguno de los 2 botones no para la accion. Es decir, un pulso de subir por ejemplo y no para de subir

Alguna idea de que falla?

cuando sueltas los dos botones se ponen en HIGH ambos, entonces porque en tu programa preguntabas si los dos estaban en LOW?
Tus pulsadores responden a LOW cuando los presionas y pasan a HIGH cuando no
El bonton subir y el boton bajar
que es lo que queires que haga el programa porque no te comprendo.

a ver si me explico, cuando pulso tengo un low, cuando suelto tengo un high.

Lo que me está pasando es que cuando pulso cualquiera de los 2 pulsadores (low) hace la función que debe hacer, pero al soltarlo (high) sigue haciendo la misma fución, y deberia parar

agrega

if (butIbup == LOW) 
    estsubir = true;
else 
    estsubir = false;

if (butIbdown == LOW) 
    estbajar = true;
else
    estbajar = false;

este seria el esquema de la parte de control.

Esa parte de codigo ya me la pusiste y es lo que he explicado lo que me hace

este es el codigo que tengo

const int Ibup = 13;
const int Ibdown = 12;
const int Oma = 7;
const int Omm = 6;
const int Oup = 5;
const int Odown = 4;

bool butIbup, butIbdown;
bool estsubir = false;
bool estbajar = false;


void setup() {

  // put your setup code here, to run once:
pinMode(Omm, OUTPUT);
pinMode(Oma, OUTPUT);
pinMode(Oup, OUTPUT);
pinMode(Odown, OUTPUT);

pinMode(Ibup, INPUT);
pinMode(Ibdown, INPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
  butIbup = digitalRead(Ibup);
  butIbdown = digitalRead(Ibdown);

  if (butIbup == LOW) {
    estsubir = true;
  }
  else
    estsubir = false;
    
  if (butIbdown == LOW) {
    estbajar = true;
  }
  else
    estbajar = false;

  if (butIbup == LOW && butIbdown == LOW) {
    estsubir = false;
    estbajar = false;
    digitalWrite(Omm, LOW);
    digitalWrite(Oma, LOW);     
    digitalWrite(Oup, LOW);
    digitalWrite(Odown, LOW);
  }

  if (estsubir) {
       digitalWrite(Omm, HIGH);
       digitalWrite(Oma, HIGH);
       delay(500);   
       digitalWrite(Oup, HIGH);
       digitalWrite(Odown, LOW);
  }

  if (estbajar) {
       digitalWrite(Omm, HIGH);
       digitalWrite(Oma, HIGH);
       delay(500);   
       digitalWrite(Oup, LOW);
       digitalWrite(Odown, HIGH);
  }
}

Lo curioso es que si dejo el codigo solo con el codigo de un boton o el otro, cada uno, por si solo va bien, pero en cuanto los junto falla de nuevo, es decir, no se paran al soltar boton

Perdona, yo obvié la parte del código que detiene todo desde el vamos.
Esta

     digitalWrite(Omm, LOW);
     digitalWrite(Oma, LOW);     
     digitalWrite(Oup, LOW);
     digitalWrite(Odown, LOW);

Asi que replanteo el programa

const int PinUP 	= 13;
const int PinDOWN 	= 12;
const int Oma 		= 7;
const int Omm 		= 6;
const int Oup 		= 5;
const int Odown 	= 4;

bool butUP, butDOWN;
byte estado;
void setup() {

  // put your setup code here, to run once:
pinMode(Omm, OUTPUT);
pinMode(Oma, OUTPUT);
pinMode(Oup, OUTPUT);
pinMode(Odown, OUTPUT);

pinMode(PinUP, INPUT);
pinMode(PinDOWN, INPUT);
}

void loop() {
	// put your main code here, to run repeatedly:
	butUP   = digitalRead(PinUP);
	butDOWN = digitalRead(PinDOWN);

	estado = butUP << 1 | butDOWN;

    switch (estado) {
    	case 1:  // 1 si presionas up 
			digitalWrite(Omm, HIGH);
			digitalWrite(Oma, HIGH); 
			delay(500);    
			digitalWrite(Oup, HIGH);
			digitalWrite(Odown, LOW);
			break;
		case 2: // presionaste down
			 digitalWrite(Omm, HIGH);
	     		 digitalWrite(Oma, HIGH); 
	     		 delay(500);    
	     		 digitalWrite(Oup, LOW);
	     		 digitalWrite(Odown, HIGH);
	     		 break;
		case 0  : // los dos presionados
                case 3  :
			 digitalWrite(Omm, LOW);
			 digitalWrite(Oma, LOW);     
			 digitalWrite(Oup, LOW);
			 digitalWrite(Odown, LOW); 
			 break;
	}
}

Por lo que veo del código, me parece que falta indicar lo que se debe hacer cuando ambos botones están en high (sin presionar)

Prueba cambiando eso

if (butIbup == LOW && butIbdown == LOW) {

por esto otro

if ((butIbup == LOW && butIbdown == LOW) || (butIbup == HIGH && butIbdown == HIGH)) {

No me había dado cuenta que habías respondido surbyte. Por lo que veo, si están los dos botones presionados o los dos sin presionar debería estar todo detenido y sólo debería funcionar en caso de que uno de los dos botones esté presionado.

Si, volví porque me di cuenta que olvide una opción y vi que tu respondiste tmb. Bueno tiene dos alternativas.

Chicos, muchas gracias, en cuanto tenga medio hueco prueba las 2 opciones y explicó que hace

Bueno chicos.... hoy me he puesto realmente palote y me caian lagrimones de felicidad.
Antes no me iba bien y ahora me va de dos maneras diferentes y bien bien bien que va!!!!!!

MUCHAS MUCHAS MUCHAS GRACIAS

Ahora me toca decidir con cual me quedo, y seguir el programa. Tengo que implemetar un final de carrera de coche arriba y otro de coche abajo.

Para quien llegue tarde, hasta ahora los codigos son: (surbyte + gepd)

const int Ibup = 13;
const int Ibdown = 12;
const int Oma = 7;
const int Omm = 6;
const int Oup = 5;
const int Odown = 4;

bool butIbup, butIbdown;
bool estsubir = false;
bool estbajar = false;


void setup() {

  // put your setup code here, to run once:
pinMode(Omm, OUTPUT);
pinMode(Oma, OUTPUT);
pinMode(Oup, OUTPUT);
pinMode(Odown, OUTPUT);

pinMode(Ibup, INPUT);
pinMode(Ibdown, INPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
  butIbup = digitalRead(Ibup);
  butIbdown = digitalRead(Ibdown);

  if (butIbup == LOW) {
    estsubir = true;
  }
  else
    estsubir = false;
    
  if (butIbdown == LOW) {
    estbajar = true;
  }
  else
    estbajar = false;
    
if ((butIbup == LOW && butIbdown == LOW) || (butIbup == HIGH && butIbdown == HIGH)) {
    estsubir = false;
    estbajar = false;
    digitalWrite(Omm, LOW);
    digitalWrite(Oma, LOW);     
    digitalWrite(Oup, LOW);
    digitalWrite(Odown, LOW);
  }

  if (estsubir) {
       digitalWrite(Omm, HIGH);
       digitalWrite(Oma, HIGH);
       delay(500);   
       digitalWrite(Oup, HIGH);
       digitalWrite(Odown, LOW);
  }

  if (estbajar) {
       digitalWrite(Omm, HIGH);
       digitalWrite(Oma, HIGH);
       delay(500);   
       digitalWrite(Oup, LOW);
       digitalWrite(Odown, HIGH);
  }
}

o este otro: (surbyte)

const int PinUP   = 13;
const int PinDOWN   = 12;
const int Oma     = 7;
const int Omm     = 6;
const int Oup     = 5;
const int Odown   = 4;

bool butUP, butDOWN;
byte estado;
void setup() {

  // put your setup code here, to run once:
pinMode(Omm, OUTPUT);
pinMode(Oma, OUTPUT);
pinMode(Oup, OUTPUT);
pinMode(Odown, OUTPUT);

pinMode(PinUP, INPUT);
pinMode(PinDOWN, INPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
  butUP   = digitalRead(PinUP);
  butDOWN = digitalRead(PinDOWN);

  estado = butUP << 1 | butDOWN;

    switch (estado) {
      case 1:  // 1 si presionas up
      digitalWrite(Omm, HIGH);
      digitalWrite(Oma, HIGH);
      delay(500);    
      digitalWrite(Oup, HIGH);
      digitalWrite(Odown, LOW);
      break;
    case 2: // presionaste down
      digitalWrite(Omm, HIGH);
          digitalWrite(Oma, HIGH);
          delay(500);    
          digitalWrite(Oup, LOW);
          digitalWrite(Odown, HIGH);
          break;
    case 0  : // los dos presionados
                case 3  :
      digitalWrite(Omm, LOW);
      digitalWrite(Oma, LOW);    
      digitalWrite(Oup, LOW);
      digitalWrite(Odown, LOW);
      break;
  }
}

Pero no dejo de molestar. y como soy cabezon y no me conformo con copiar pegar...

Me puedes explicar esta línea, surbyte??

estado = butUP << 1 | butDOWN;