Hola, os cuento mi situación, tengo entre manos un proyecto para grado superior que en la board me funcionaba pero en la maqueta ya no, y en la simulación nunca funciono.
El proyecto es un montacargas controlado por arduino de cuatro plantas, con 16 pulsadores, cuatro en cada planta, uno para llamar y el resto para enviar a una planta destino, y otros cuatro pulsadores que activa la cabina del montacargas.
En el código lo que hago es darle valores de 1 a 4 a las llamadas (para la llamada del bajo seria valor 1 , para el primero valor 2 y así.) , y a los pulsadores les doy el mismo valor de 1 a 4, con estos valores lo que hago es compararlos para activar el puente H, por ejemplo si la cabina está en la primera planta, nos dará un valor de 2, y la llamada la hacemos desde la planta 3, que tiene un valor de 4, el programara me debería de hacer un 2<4 por lo tanto activo el motor para que suba.
En resumen es muy sencillo, pero en la maqueta se me queda en bucle de subir y bajar cada vez que toca un pulsador la cabina.
Enlazo el código en texto y una captura de la simulación (en el proyecto a los pulsadores les precede una resistencia de 220ohm)
// pulsadores llamada
const int llamada1 = 2;
const int llamada2 = 3;
const int llamada3 = 4;
const int llamada4 = 5;
//sensores de planta
const int final1 = 6;
const int final2 = 7;
const int final3 = 8;
const int final4 = 9;
//moviento motor
const int bajar = 10;
const int subir = 11;
//variable para ascenso o descenso
int pisoactual;
int pisodestino;
void setup() {
//PIN DE LLAMADAS COMO ENTRADAS
pinMode(llamada1, INPUT);
pinMode(llamada2, INPUT);
pinMode(llamada3, INPUT);
pinMode(llamada4, INPUT);
//PIN DE FINAL DE CARRERA COMO ENTRADAS
pinMode(final1, INPUT);
pinMode(final2, INPUT);
pinMode(final3, INPUT);
pinMode(final4, INPUT);
//PINES DE MOVIMIENTO DE MOTOR SALIDAS
pinMode(subir, OUTPUT);
pinMode(bajar, OUTPUT);
}
void loop() {
if(digitalRead(final1)==HIGH) //asigadores de valor nuemerico para cada final de carrera
{pisoactual=1;} //cambio el nombre a pisoactual
if(digitalRead(final2)==HIGH)
{pisoactual=2;}
if(digitalRead(final3)==HIGH)
{pisoactual=3;}
if(digitalRead(final4)==HIGH)
{pisoactual=4;}
if(digitalRead(llamada1)==HIGH) //asigadores de valor nuemerico para cada final de llamada
{pisodestino=1;} //cambio el nombre a pisodestino
if(digitalRead(llamada2)==HIGH)
{pisodestino=2;}
if(digitalRead(llamada3)==HIGH)
{pisodestino=3;}
if(digitalRead(llamada4)==HIGH)
{pisodestino=4;}
switch(pisodestino){
case 1: //caso para la llamada desde el bajo
if (pisoactual>1) //si el piso en el que esta el montacargas es mayor a 1, esto hara descender al motor
{digitalWrite (bajar, HIGH);}
if(digitalRead(final1)==HIGH) //cuando el final de carrera de la planta baja se active significa que ya esta el montacargas en la planta baja y detendra el motor
{digitalWrite (subir, LOW);
digitalWrite (bajar, LOW);}
break;
case 2: //caso para la llamada desde la primera planta
if (pisoactual>2)
{digitalWrite (bajar, HIGH);}
else if (pisoactual<2)
{digitalWrite (subir, HIGH);}
if(digitalRead(final2)==HIGH)
{digitalWrite (subir, LOW);
digitalWrite (bajar, LOW);}
break;
case 3: //caso para la llamada desde la segunda planta
if (pisoactual> 3)
{digitalWrite (bajar, HIGH);}
else if(pisoactual<3)
{digitalWrite (subir, HIGH);}
if(digitalRead(final3)==HIGH)
{digitalWrite (subir, LOW);
digitalWrite (bajar, LOW);}
break;
case 4: //caso para la llamada desde la tercera planta
if (pisoactual<4)
{digitalWrite (subir, HIGH);}
if(digitalRead(final4)==HIGH)
{digitalWrite (subir, LOW);
digitalWrite (bajar, LOW);}
break;
}
}// pulsadores llamada
const int llamada1 = 2;
const int llamada2 = 3;
const int llamada3 = 4;
const int llamada4 = 5;
//sensores de planta
const int final1 = 6;
const int final2 = 7;
const int final3 = 8;
const int final4 = 9;
//moviento motor
const int bajar = 10;
const int subir = 11;
//variable para ascenso o descenso
int pisoactual;
int pisodestino;
void setup() {
//PIN DE LLAMADAS COMO ENTRADAS
pinMode(llamada1, INPUT);
pinMode(llamada2, INPUT);
pinMode(llamada3, INPUT);
pinMode(llamada4, INPUT);
//PIN DE FINAL DE CARRERA COMO ENTRADAS
pinMode(final1, INPUT);
pinMode(final2, INPUT);
pinMode(final3, INPUT);
pinMode(final4, INPUT);
//PINES DE MOVIMIENTO DE MOTOR SALIDAS
pinMode(subir, OUTPUT);
pinMode(bajar, OUTPUT);
}
void loop() {
if(digitalRead(final1)==HIGH) //asigadores de valor nuemerico para cada final de carrera
{pisoactual=1;} //cambio el nombre a pisoactual
if(digitalRead(final2)==HIGH)
{pisoactual=2;}
if(digitalRead(final3)==HIGH)
{pisoactual=3;}
if(digitalRead(final4)==HIGH)
{pisoactual=4;}
if(digitalRead(llamada1)==HIGH) //asigadores de valor nuemerico para cada final de llamada
{pisodestino=1;} //cambio el nombre a pisodestino
if(digitalRead(llamada2)==HIGH)
{pisodestino=2;}
if(digitalRead(llamada3)==HIGH)
{pisodestino=3;}
if(digitalRead(llamada4)==HIGH)
{pisodestino=4;}
switch(pisodestino){
case 1: //caso para la llamada desde el bajo
if (pisoactual>1) //si el piso en el que esta el montacargas es mayor a 1, esto hara descender al motor
{digitalWrite (bajar, HIGH);}
if(digitalRead(final1)==HIGH) //cuando el final de carrera de la planta baja se active significa que ya esta el montacargas en la planta baja y detendra el motor
{digitalWrite (subir, LOW);
digitalWrite (bajar, LOW);}
break;
case 2: //caso para la llamada desde la primera planta
if (pisoactual>2)
{digitalWrite (bajar, HIGH);}
else if (pisoactual<2)
{digitalWrite (subir, HIGH);}
if(digitalRead(final2)==HIGH)
{digitalWrite (subir, LOW);
digitalWrite (bajar, LOW);}
break;
case 3: //caso para la llamada desde la segunda planta
if (pisoactual> 3)
{digitalWrite (bajar, HIGH);}
else if(pisoactual<3)
{digitalWrite (subir, HIGH);}
if(digitalRead(final3)==HIGH)
{digitalWrite (subir, LOW);
digitalWrite (bajar, LOW);}
break;
case 4: //caso para la llamada desde la tercera planta
if (pisoactual<4)
{digitalWrite (subir, HIGH);}
if(digitalRead(final4)==HIGH)
{digitalWrite (subir, LOW);
digitalWrite (bajar, LOW);}
break;
}
}
montacargas funcional v1.0 (sin lcd).txt (3.01 KB)