Código del Ascensor. Oswaldo Andrés Giraldo Giraldo. Héctor Andrés Hoyos Ceballos. Jose Fernando Montoya Vargas. María Fernanda Villa Tamayo. Sistemas en Tiempo Real.

Dependencies:   SRF05 mbed-rtos mbed

main.cpp

Committer:
joshema216
Date:
2017-06-09
Revision:
0:ac92624618d0

File content as of revision 0:ac92624618d0:

#include "mbed.h"
#include "SRF05.h" // Librería del sensor de nivel.
#include "rtos.h" // Librería de tiempo real.

// PUERTAS.
PwmOut servo1(PTB0); // Declaración del servomotor de la puerta del piso 1.
PwmOut servo2(PTB1); // Declaración del servomotor de la puerta del piso 2.
PwmOut servo3(PTB2); // Declaración del servomotor de la puerta del piso 3.
    // Ejemplo:
    /*servo1.period(0.025); 
    servo2.period(0.025);
    servo3.period(0.025);
    servo1.pulsewidth(0.00055);
    servo2.pulsewidth(0.0022);
    servo3.pulsewidth(0.0022);*/
    
// MOTOR.
PwmOut giro1(PTC1);
PwmOut giro2(PTC2);
DigitalOut enable(PTB3);
    // Ejemplo:
    // giro1.period_ms(20);
    // giro2.period_ms(20);

// PULSADORES.
/*DebouncedIn boton1(PTC11); // Botones de la parte frontal del ascensor.
DebouncedIn boton2b(PTC10);  // En este caso no se va a utilizar.
DebouncedIn boton2s(PTC6);
DebouncedIn boton3(PTC5);*/

// Botones de la parte de abajo del ascensor.
DigitalIn boton1i(PTC4); // Piso 1.
DigitalIn boton2i(PTC3); // Piso 2.
DigitalIn boton3i(PTC0); // Piso 3.
DigitalIn botonp(PTC7); // Paro de emergencia.

// SENSOR DE NIVEL.
SRF05 sensor(PTD3, PTD1); // Declaración del sensor de nivel. objeto de tipo SRF05

// LEDS.
DigitalOut led1(PTE5);
DigitalOut led2(PTE4);
DigitalOut led3(PTE3);

// VARIABLES AUXILIARES.
float med = 0; // Medida actual del sensor de nivel (distancia).
float piso1; // Valor de distancia del sensor al piso 1.
float piso2; // Valor de distancia del sensor al piso 2.
float piso3; // Valor de distancia del sensor al piso 3.

int llamada1 = 0; // Variable que indica que se llamó el ascensor desde el piso 1.
int llamada2 = 0; // Variable que indica que se llamó el ascensor desde el piso 2.
int llamada3 = 0; // Variable que indica que se llamó el ascensor desde el piso 3.
int pAbiertas = 0; // Variable que indica que las puertas se encuentran abiertas.

// HILOS Y SEMÁFOROS.
Thread t1; // Hilo del sensor.
Thread t2; // Hilo de los servomotores.
Thread t3; // Hilo del movimiento del motor.
Semaphore sem(1); // Semáforo.

void medida(){ // Función de la medida del sensor de nivel.
    while(1){
        med = sensor.read(); // Realiza la lectura de la posición actual del ascensor. SRF05
    }
}

void puertas(){ // Función de la apertura y cierre de puertas.
    while(1){
        if(med == piso1 && llamada1 == 1){
            sem.wait();
            servo1.period(0.02);
            servo1.pulsewidth(0.002); // Activar el servo 1 moviéndolo a 90°.
            pAbiertas = 1;
            Thread::wait(5000); // Esperar 5 segundos.
            servo1.period(0.02);
            servo1.pulsewidth(0.0015); // Activar el servo 1 moviéndolo a 0°.
            pAbiertas = 0;
            llamada1 = 0;
            sem.release();
        }
        if(med == piso2 && llamada2 == 1){
            sem.wait();
            servo2.period(0.02);
            servo2.pulsewidth(0.002); // Activar el servo 2 moviéndolo a 90°.
            pAbiertas = 1;
            Thread::wait(5000); // Esperar 5 segundos.
            servo2.period(0.02);
            servo2.pulsewidth(0.0015); // Activar el servo 2 moviéndolo a 0°.
            llamada2 = 0;
            sem.release();
        }
        if(med == piso3 && llamada3 == 1){
            sem.wait();
            servo3.period(0.02);
            servo3.pulsewidth(0.002); // Activar el servo 3 moviéndolo a 90° (abrir).
            pAbiertas = 1;
            Thread::wait(5000); // Esperar 5 segundos.
            servo3.period(0.02);
            servo3.pulsewidth(0.0015); // Activar el servo 3 moviéndolo a 0° (cerrar).
            pAbiertas = 0;
            llamada3 = 0;
            sem.release();
        }
    }
}

void mover(){ // Función del movimiento del ascensor.
    while(1){
        if(!boton1i && med != piso1 && med < piso1 && pAbiertas != 1){ // Pulsar el botón de piso 1.
            sem.wait();
            llamada1 = 1;
            while(med <= piso1){ // Bajar al piso 1 desde cualqueira de los demás pisos.
                giro1.period(0.02); // Activar giro1 (bajar).
                giro1.pulsewidth(0.01);
                giro2.period(0.02);
                giro2.pulsewidth(0);
                if(!botonp){ // Si se pulsa el botón de paro de emergencia se para el ascensor.
                    break;
                }
            }
            giro1.period(0.02); // Parar.
            giro1.pulsewidth(0);
            sem.release();
        }
        if(!boton2i && med != piso2 && med < piso2 && pAbiertas != 1){ // Pulsar el botón de piso 2.
            sem.wait();
            llamada2 = 1;
            while(med <= piso2){ // Bajar al piso 2 desde el tercer piso.
                giro1.period(0.02); // Activar giro1 (bajar).
                giro1.pulsewidth(0.01);
                giro2.period(0.02);
                giro2.pulsewidth(0);
                if(!botonp){ // Si se pulsa el botón de paro de emergencia se para el ascensor.
                    break;
                }
            }
            giro1.period(0.02); // Parar.
            giro1.pulsewidth(0);
            sem.release();
        }
        if(!boton2i && med != piso2 && med > piso2 && pAbiertas != 1){ // Pulsar el botón de piso 2.
            sem.wait();
            llamada2 = 1;
            while(med >= piso2){ // Subir al piso 2 desde el primer piso.
                giro1.period(0.02); // Activar giro2 (subir).
                giro1.pulsewidth(0);
                giro2.period(0.02);
                giro2.pulsewidth(0.01);
                if(!botonp){ // Si se pulsa el botón de paro de emergencia se para el ascensor.
                    break;
                }
            }
            giro2.period(0.02); // Parar.
            giro2.pulsewidth(0);
            sem.release();
        }
        if(!boton3i && med != piso2 && med > piso3 && pAbiertas != 1){ // Pulsar el botón de piso 3.
            sem.wait();
            llamada3 = 1;
            while(med >= piso3){ // Subir al piso 2 desde el primer piso.
                giro1.period(0.02); // Activar giro2 (subir).
                giro1.pulsewidth(0);
                giro2.period(0.02);
                giro2.pulsewidth(0.01);
                if(!botonp){ // Si se pulsa el botón de paro de emergencia se para el ascensor.
                    break;
                }
            }
            giro2.period(0.02); // Parar.
            giro2.pulsewidth(0);
            sem.release();
        }
        if(!boton1i && med == piso1){ // Pulsar el botón de piso 1 en el primer piso.
            sem.wait();
            llamada1 = 1;
            sem.release();
        }
        if(!boton2i && med == piso2){ // Pulsar el botón de piso 2 en el segundo piso.
            sem.wait();
            llamada2 = 1;
            sem.release();
        }
        if(!boton3i && med == piso3){ // Pulsar el botón de piso 3 en el tercer piso.
            sem.wait();
            llamada3 = 1;
            sem.release();
        }   
    }   
}

int main(){ // Función principal.
    t1.start(medida);
    t2.start(puertas);
    t3.start(mover);
    enable = 1; // Habilitar el Puente H.
}