¡Hola a todos!
Estoy intentando realizar un ascensor de 3 pisos (no físico, solo simulación en Proteus), el cual tendrá un botón en cada piso para llamar al elevador y de la cabina lleva 3 botones para presionar dependiendo del piso al cual se desea ir, además contara con una luz en cada piso con su respectivo apagador y una luz en la cabina que siempre estará encendida.
El elevador estará funcionando con un motor simple de 9VCD conectado a un L293D para el cambio de giro, tendra sus botones pulsadores y sus leds.
La parte del codigo que controla las luces me funciona como yo esperaba, mi problema es que en el control del motor, éste se queda funcionando, no se detiene (el arranque y paro del motor es por tiempos), intente cambiar los tiempos y cambiar el orden de los pisos dentro del codigo, pero no funciono.
Adjunto mi codigo, diagrama de conexion y archivo de Proteus.
#define B1 22 //CABINA IR A PISO 1
#define B2 23 //CABINA IR A PISO 2
#define B3 24 //CABINA IR A PISO 3
#define B4 25 //LLAMAR ELEVADOR DESDE PISO 1
#define B5 26 //LLAMAR ELEVADOR DESDE PISO 2
#define B6 27 //LLAMAR ELEVADOR DESDE PISO 3
#define B7 28 //LUCES PISO 1
#define B8 29 //LUCES PISO 2
#define B9 30 //LUCES PISO 3
#define M1 31 //ON-OFF ARRIBA
#define M2 32 //MOTOR ABAJO
#define M0 33 //ON-OFF MOTOR
#define L1 34 //LUZ PISO 1
#define L2 35 //LUZ PISO 2
#define L3 36 //LUZ PISO 3
#define L4 37 //LUZ CABINA
//LUZ CABINA
const int LED4 = 37;
//LUZ PISO 1
int BOTON7 = 28; //BOTON
int LED1 = 34; //LED
int B7ON = 0; //ENCENDER
int B7PREVIOUS = 0; //ESTADO ANTERIOR
int B7STATE = 0; //ESTADO
//LUZ PISO 2
int BOTON8 = 29; //BOTON
int LED2 = 35; //LED
int B8ON = 0; //ENCENDER
int B8PREVIOUS = 0; //ESTADO ANTERIOR
int B8STATE = 0; //ESTADO
//LUZ PISO 3
int BOTON9 = 30; //BOTON
int LED3 = 36; //LED
int B9ON = 0; //ENCENDER
int B9PREVIOUS = 0; //ESTADO ANTERIOR
int B9STATE = 0; //ESTADO
//MOTOR
int MOTOR1 = 31; //ARRIBA
int MOTOR2 = 32; //ABAJO
int MOTOR0 = 33; //ON-OFF MOTOR
//CABINA
int BOTON1 = 22; //IR AL PISO 1
int BOTON2 = 23; //IR AL PISO 2
int BOTON3 = 24; //IR AL PISO 3
//LLAMAR ELEVADOR
int BOTON4 = 25; //LLAMAR DESDE PISO 1
int BOTON5 = 26; //LLAMAR DESDE PISO 2
int BOTON6 = 27; //LLAMAR DESDE PISO 3
int PISO_ACTUAL = 2; //PISO DONDE COMIENZA EL ELEVADOR
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
pinMode(BOTON1, INPUT);
pinMode(BOTON2, INPUT);
pinMode(BOTON3, INPUT);
pinMode(BOTON4, INPUT);
pinMode(BOTON5, INPUT);
pinMode(BOTON6, INPUT);
pinMode(BOTON7, INPUT);
pinMode(BOTON8, INPUT);
pinMode(BOTON9, INPUT);
pinMode(MOTOR0, OUTPUT);
pinMode(MOTOR1, OUTPUT);
pinMode(MOTOR2, OUTPUT);
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT);
pinMode(LED4, OUTPUT);
}
void loop()
{
// put your main code here, to run repeatedly:
digitalWrite(37, HIGH); //ENCENDER LUZ DE CABINA
//LUZ DEL PISO 1
B7STATE = digitalRead(BOTON7); //LEER ESTADO DEL BOTON DE LA LUZ DEL PISO 1
if (B7STATE && B7PREVIOUS == 0)
{
B7ON = 1 - B7ON;
}
B7PREVIOUS = B7STATE;
if (B7ON)
{
digitalWrite(LED1, HIGH);
}
else
{
digitalWrite(LED1, LOW);
}
//LUZ DEL PISO 2
B8STATE = digitalRead(BOTON8); //LEER ESTADO DEL BOTON DE LA LUZ DEL PISO 2
if (B8STATE && B8PREVIOUS == 0)
{
B8ON = 1 - B8ON;
}
B8PREVIOUS = B8STATE;
if (B8ON)
{
digitalWrite(LED2, HIGH);
}
else
{
digitalWrite(LED2, LOW);
}
//LUZ DEL PISO 3
B9STATE = digitalRead(BOTON9); //LEER ESTADO DEL BOTON DE LA LUZ DEL PISO 3
if (B9STATE && B9PREVIOUS == 0)
{
B9ON = 1 - B9ON;
}
B9PREVIOUS = B9STATE;
if (B9ON)
{
digitalWrite(LED3, HIGH);
}
else
{
digitalWrite(LED3, LOW);
}
BOTON1 = digitalRead(22); //LEER ESTADO DEL BOTON DEL PISO 1 DENTRO DE LA CABINA
BOTON2 = digitalRead(23); //LEER ESTADO DEL BOTON DEL PISO 2 DENTRO DE LA CABINA
BOTON3 = digitalRead(24); //LEER ESTADO DEL BOTON DEL PISO 3 DENTRO DE LA CABINA
BOTON4 = digitalRead(25); //LEER ESTADO DEL BOTON PARA LLAMAR ELEVADOR DESDE EL PISO 1
BOTON5 = digitalRead(26); //LEER ESTADO DEL BOTON PARA LLAMAR ELEVADOR DESDE EL PISO 2
BOTON6 = digitalRead(27); //LEER ESTADO DEL BOTON PARA LLAMAR ELEVADOR DESDE EL PISO 3
if (BOTON1 || BOTON4 == HIGH) //SI SE PRESIONA EL BOTON DEL PISO 1 DENTRO O FUERA DE LA CABINA
{
if (PISO_ACTUAL == 2) //SI EL PISO ACTUAL ES EL 2
{
digitalWrite(MOTOR0, HIGH); //ENCENDER MOTOR
digitalWrite(MOTOR1, LOW); //ARRANCAMOS MOTOR PARA BAJAR
digitalWrite(MOTOR2, HIGH);
delay(1000); //TIEMPO DE BAJADA DEL ASCENSOR DEL PISO 2 AL PISO 1
digitalWrite(MOTOR0, LOW); //SE DETIENE EL MOTOR
PISO_ACTUAL == 1; //AHORA EL PISO ACTUAL ES EL 1
}
if (PISO_ACTUAL == 3) //SI EL PSIO ACTUAL ES EL 3
{
digitalWrite(MOTOR0, HIGH); //ENCENDER MOTOR
digitalWrite(MOTOR1, LOW); //ARRANCAMOS MOTOR PARA BAJAR
digitalWrite(MOTOR2, HIGH);
delay(2000); //TIEMPO DE BAJADA DEL ASCENSOR DEL PISO 3 AL PISO 1
digitalWrite(MOTOR0, LOW); //SE DETIENE EL MOTOR
PISO_ACTUAL == 1; //AHORA EL PISO ACTUAL ES EL 1
}
}
else if (BOTON2 || BOTON5 == HIGH) //SI SE PRESIONA EL BOTON DEL PISO 2 DENTRO O FUERA DE LA CABINA
{
if (PISO_ACTUAL == 1) //SI EL PISO ACTUAL ES EL 1
{
digitalWrite(MOTOR0, HIGH); //ENCENDER MOTOR
digitalWrite(MOTOR1, HIGH); //ARRANCAMOS EL MOTOR PARA SUBIR
digitalWrite(MOTOR2, LOW);
delay(1000); //TIEMPO DE SUBIDA DEL PISO 1 AL PISO 2
digitalWrite(MOTOR0, LOW); //SE DETIENE EL MOTOR
PISO_ACTUAL == 2; //AHORA EL PISO ACTUAL ES 2
}
if (PISO_ACTUAL == 3) //SI EL PISO ACTUAL ES EL 3
{
digitalWrite(MOTOR0, HIGH); //ENCENDER MOTOR
digitalWrite(MOTOR1, LOW); //ARRANCAMOS EL MOTOR PARA BAJAR
digitalWrite(MOTOR2, HIGH);
delay(1000); //TIEMPO DE BAJADA DEL PISO 3 AL PISO 2
digitalWrite(MOTOR0, LOW); //SE DETIENE EL MOTOR
PISO_ACTUAL == 2; //AHORA EL PISO ACTUAL ES 2
}
}
else if (BOTON3 || BOTON6 == HIGH) //SI SE PRESIONA EL BOTON DEL PISO 3 DENTRO O FUERA DE LA CABINA
{
if (PISO_ACTUAL == 1) //SI EL PISO ACTUAL ES EL 1
{
digitalWrite(MOTOR0, HIGH); //ENCENDER MOTOR
digitalWrite(MOTOR1, HIGH); //ARRANCAMOS EL MOTOR PARA SUBIR
digitalWrite(MOTOR2, LOW);
delay(2000); //TIEMPO DE SUBIDA DEL PISO 1 AL PISO 3
digitalWrite(MOTOR0, LOW); //SE DETIENE EL MOTOR
PISO_ACTUAL == 3; //AHORA EL PISO ACTUAL ES 3
}
if (PISO_ACTUAL == 2) //SI EL PISO ACTUAL ES EL 2
{
digitalWrite(MOTOR0, HIGH); //ENCENDER MOTOR
digitalWrite(MOTOR1, HIGH); //ARRANCAMOS EL MOTOR PARA SUBIR
digitalWrite(MOTOR2, LOW);
delay(1000); //TIEMPO DE SUBIDA DEL PISO 2 AL PISO 3
digitalWrite(MOTOR0, LOW); //SE DETIENE EL MOTOR
PISO_ACTUAL == 3; //AHORA EL PISO ACTUAL ES 3
}
}
}
proteus.zip (71.4 KB)