Programación Ascensor Tiempo Real

Dependencies:   DebouncedIn SRF05 mbed

ascensor.cpp

Committer:
AaronGonzalez
Date:
2017-06-07
Revision:
0:cbc582265222

File content as of revision 0:cbc582265222:

#include "mbed.h"
#include "SRF05.h"
#include "DebouncedIn.h"

Serial pc(USBTX, USBRX);

// Declaración de pines para las puertas
// a partir de entradas analógicas
PwmOut servo1(PTB0);    // entrada analógica servo 1 - listo
PwmOut servo2(PTB1);    // entrada analógica servo 2 - listo
PwmOut servo3(PTB2);    // sentrada analógica servo 3 - listo

int STOP=0;                     // estado detenido inicializado en 0

//servo1.period(0.025);
//servo2.period(0.025);
//servo3.period(0.025);
//servo1.pulsewidth(0.00055);
//servo2.pulsewidth(0.0022);
//servo3.pulsewidth(0.0022);

// Declaración de pines de los motores
//DigitalOut motor1(PTC16);
//DigitalOut motor2(PTC13);
//DigitalOut enable(PTB3);

int motor1;
int motor2;

// Declaración de pines para los botones
DebouncedIn boton1(PTC11);
DebouncedIn boton2b(PTC10);
DebouncedIn boton2s(PTC6);
DebouncedIn boton3(PTC5);
DebouncedIn boton1i(PTC4);
DebouncedIn boton2i(PTC3);
DebouncedIn boton3i(PTC0);
DebouncedIn boton_p(PTC7);

// Declaración pines del sensor de ultrasonido
SRF05 sensor(PTD3,PTD1);

// Declaración pines digitales para los led's
DigitalOut led1(PTE5);
DigitalOut led2(PTE4);
DigitalOut led3(PTE3);

// Declaración pines de salida para el motor principal tipo PWM 
// Entradas tipo PWM Análogas para inversión de giro
PwmOut giro1(PTC1);    
PwmOut giro2(PTC2);
DigitalOut enable(PTB3);

//giro1.period_ms(20);
//giro2.period_ms(20);
    
//A continuación se describe el número de botones a usar
// los pisos del ascensor, el botón de paro
// y las distancias entre los pisos
int botones[4],pisos[3],paro;
int bussy=0;                    
float distancia;
float dist3=8.0;
float dist2=28.0;
float dist1=47.0;

// Pulsadores 
void pulsadores(void const *args){
    
    while(1) {
        if (boton_p.read()==1){    // Lectura de boton de paro
            STOP=1;           
            paro=1; 
            }
        if (boton1.read()==1){
            botones[0]=1; //luego irá al piso 1
            }
        if (boton2b.read()==1){
            botones[1]=1; //luego irá al piso 1
            }
        if (boton2s.read()==1){
            botones[2]=1; //luego irá al piso 1
            }
        if (boton3.read()==1){
            botones[3]=1; //luego irá al piso 1
            }
        if (boton1i.read()==1){
            pisos[0]=1; //luego irá al piso 1
            }
        if (boton2i.read()==1){
            pisos[1]=1;  //luego irá al piso 2
            }
        if (boton3i.read()==1){
            pisos[2]=1; //luego irá al piso 3
            }
      // Thread::wait(1000.0*0.02);
    }
}

void sensar(void const *args){
    
    while(1) {
        
        distancia=sensor.read(); //sensar
        
        //Thread::wait(1000.0*0.02);
        
        distancia=floor(distancia); 
    }
}
void subir(void){ 

    if(motor2==0){
        giro1.period_ms(20);
        giro2.period_ms(20);
        enable=1;
        motor1=1;
        
        //giro1=1;
        //motor2=0;
        //giro2=0;
        
        giro1.pulsewidth_ms(15);
        giro2.pulsewidth_ms(0);
        }
}
void bajar(void){
    
    if(motor1==0){
        giro1.period_ms(20);
        giro2.period_ms(20);
        enable=1;
        motor1=0;
        
        //giro1=0;
        //motor2=1;
        //giro2=1;
        
        giro1.pulsewidth_ms(0);
        giro2.pulsewidth_ms(8);
        }
}
void stop(void){          

    giro1.period_ms(20);
    giro2.period_ms(20);
    enable=0;
    motor1=0;
    
    //giro1=0;
    //motor2=0;
    //giro2=0;
    
    enable=0;
    giro1.pulsewidth_ms(0);
    giro2.pulsewidth_ms(0);
}

void tercero(void){
    
    bussy=1;
    botones[3]=0;
    pisos[2]=0;
    servo1.period(0.025);   
    servo1.pulsewidth(0.0008);
    servo2.period(0.025);   
    servo2.pulsewidth(0.0055);  
    servo3.period(0.025);   
    servo3.pulsewidth(0.0055);   

    int flag1=0,flag2=0;
    subir();
    
    while(1){
        
        if (botones[2]==1 && distancia>=dist2){
            flag2=1;
            }    
        
        if (flag2==1 && distancia==dist2 && flag1==0){
            stop();
            servo2.pulsewidth(0.0008); 
            wait(5);
            servo2.pulsewidth(0.0055);    
            flag1=1; 
            subir();    
            botones[2]=0;
            }
        
        if (botones[1]==1){
            pisos[1]=1; // va luego para el piso 2
            }

        if (distancia<=dist3){
            stop();
            servo3.pulsewidth(0.0008); 
            wait(5);
            servo3.pulsewidth(0.0055);
            break;
            }
        }
        bussy=0;
}

void segundo(void){
    
    botones[1]=0; 
    botones[2]=0;
    pisos[1]=0; 
    bussy=1;
    servo1.period(0.025);   
    servo1.pulsewidth(0.0008);
    servo2.period(0.025);   
    servo2.pulsewidth(0.0055);  
    servo3.period(0.025);   
    servo3.pulsewidth(0.0055);   

    if (distancia>(dist2+2.0)){
        subir(); 
        }
    else{
        
        if (distancia<(dist2-2.0)){
            bajar();}
            }
         
        while(1){
            if (distancia==dist2){
                stop();
                servo2.pulsewidth(0.0008); 
                wait(5);
                servo2.pulsewidth(0.0055);    
                break;
                }
        }
    bussy=0;
}

void primero(void){
        
        botones[0]=0;
        pisos[0]=0;
        bussy=1;
        servo1.period(0.025);   
        servo1.pulsewidth(0.0008);
        servo2.period(0.025);   
        servo2.pulsewidth(0.0055);  
        servo3.period(0.025);   
        servo3.pulsewidth(0.0055);   
        int flag1=0,flag2=0;
        bajar();
        
        while(1){
            
            if (botones[1]==1 && distancia<=dist2){
                flag2=1;
                }
            if (flag2==1 && distancia==dist2 && flag1==0){
                stop();
                servo2.pulsewidth(0.0008);
                wait(5);
                servo2.pulsewidth(0.0055);      
                flag1=1;  
                bajar();  
                botones[1]=0;
                }
            if(botones[2]==1){
                pisos[1]=1;
                }
            if (distancia>=dist1){
                stop();
                servo1.pulsewidth(0.0022);
                wait(5);
                servo1.pulsewidth(0.0008);
                break;
                }
        }
        bussy=0;
}

void bombillos(void const *args){
   
    while(1){
        
        if (motor2==1){
            if (distancia>=dist3 && distancia<dist2){
                led3=1;
                led2=0;
                led1=0;  
                }
            if (distancia>=dist2 && distancia<dist1){
                led3=0;
                led2=1;
                led1=0;     
                }  
            if (distancia>=dist1){
                led3=0;
                led2=0;
                led1=1;     
                }
        }
        if (motor1==1 || (motor1==0 && motor2==0)){
            
            if (distancia<=dist1 && distancia>dist2){
                led3=0;
                led2=0;
                led1=1;  
                }
            if (distancia<=dist2 && distancia>dist3){
                led3=0;
                led2=1;
                led1=0;     
                }
            if (distancia<=dist3){
                led3=1;
                led2=0;
                led1=0;     
                }
        }
        
        //Thread::wait(1000.0*0.02);
        
    }
}

void parar(void){

    servo1.period(0.025);   
    servo1.pulsewidth(0.0008);
    servo2.period(0.025);   
    servo2.pulsewidth(0.0055);  
    servo3.period(0.025);   
    servo3.pulsewidth(0.0055); 
    bajar();
    
    while(1) {
        if (distancia>=dist1){
            stop();
            servo1.pulsewidth(0.0008);
            botones[0]=0;
            botones[1]=0;
            botones[2]=0;
            botones[3]=0;
            pisos[0]=0;
            pisos[1]=0;
            pisos[2]=0;
            STOP=0;
            paro=0;
            break;
           }
    }
}

int main() {
    
    giro1.period_ms(20);
    giro2.period_ms(20);
    giro1.pulsewidth_ms(0);
    giro2.pulsewidth_ms(0);
    
    enable=0;
    motor1=0;
    motor2=0;
    led1=0;
    led2=0;
    led3=0;
    
    //Thread thread2(pulsadores);
    //Thread thread4(sensar);
    //Thread thread5(bombillos);
    
    botones[0]=0;
    botones[1]=0;
    botones[2]=0;
    botones[3]=0;
    pisos[0]=0;
    pisos[1]=0;
    pisos[2]=0;
    
    while(1) {
        if (paro==1 ){
            botones[0]=0;
            botones[1]=0;
            botones[2]=0;
            botones[3]=0;
            pisos[0]=0;
            pisos[1]=0;
            pisos[2]=0;
            STOP=0;
            paro=0;
            primero();
            }
        if (STOP==0 && bussy==0){
            
            if (pisos[0]==1){
                pisos[0]=0;
                primero();
                }
            if ( pisos[1]==1){
                pisos[1]=0;
                segundo();
                }
            if (pisos[2]==1){
                pisos[2]=0;
                tercero();
                }   
            if (botones[0]==0 && botones[1]==0 && botones[2]==0 && botones[3]==0){
                }
            if ( botones[3]==1){
                botones[3]=0; 
                tercero();
                }
            if (botones[1]==1 || botones[2]==1){
                botones[1]=0; 
                botones[2]=0; 
                segundo();
                }
            if (botones[0]==1 ){
                botones[0]=0;    
                primero();  
                }
        }
        
        //Thread::wait(1000.0*0.2);
        //myled = 0;
        //Thread::wait(1000.0*0.2);     
    }
}