Actividad 4

 

El ascensor

En esta actividad se plantea  programar el microcontrolador para que el funcionamiento se asemeje al de un ascensor:

  1. El ascensor debe de ser capaz de detenerse de forma autónoma en cada uno de los pisos sin la ayuda del usuario.

  2. Se disponen de 3 pulsadores, cada uno correspondiente a un piso. Cuando se pulse un pulsador el ascensor debe ira piso indicado, encendiendo el led del piso y en caso de ser necesario, abrir la barrera (servo)

  3. Se plantea que durante el movimiento del ascensor se haga uso del zumbador para emitir un aviso sonoro.

  4. Seria conveniente disponer de un modo de ajuste manual para corregir las derivaciones en el offset de la altura.

Habrá ocasiones en las cuales sea necesario evaluar el estado de dos o mas pulsadores, esto se
puede hacer mediante la siguiente sentencia:

if(digitalRead(Boton2) == 0 && digitalRead(Boton3) == 0){...}
A veces solo queremos que se ejecute una vez una parte del código, independientemente de si
mantenemos un pulsador presionado. El siguiente código bloquea la ejecución del código hasta que
se deje de pulsar el botón. De esta forma podemos evitar que se ejecuten dos veces los mismos
comandos en el caso en el que se mantenga el botón presionado.

while(digitalRead(Boton)==1){}
Para esta actividad en concreto será necesario implementar una lógica que permita al ascensor 
identificar en que planta está. A continuación se muestra un ejemplo:

if (Planta == 2){
    if(digitalRead(boton1) == 0 && digitalRead(boton3) == 0){
        ...
    
}
    if(digitalRead(boton1)==1){
        ...
    }    
    else if(digitalRead(boton3)==1){
        ...
    }
}
// Se declaran las librerias que se van a utilizar en la practica
#include <Servo.h>

// Se definen los pines que se van a utilizar
#define BA1 13
#define BA2 12
#define BA3 3
#define vel 9
#define Gir1 10
#define Gir2 11
#define Led1 4
#define Led2 7
#define Led3 8
#define Zumbador 6
#define servo 5

Servo servoMotor;

int Planta = 1;
int Configurar = 1;

void setup() {
  // Se configuran los pines como entradas
  pinMode(BA1,INPUT);
  pinMode(BA2,INPUT);
  pinMode(BA3,INPUT);
  // Se configuran los pines como salidas  
  pinMode(vel,OUTPUT);
  pinMode(Gir1,OUTPUT);
  pinMode(Gir2,OUTPUT);
  pinMode(Zumbador,OUTPUT);
  pinMode(Led1,OUTPUT);
  pinMode(Led2,OUTPUT);
  pinMode(Led3,OUTPUT);

  servoMotor.attach(servo);

  // Se apagan todas las salidas
  digitalWrite(vel,LOW);
  digitalWrite(Gir1,LOW);
  digitalWrite(Gir2,LOW);

  digitalWrite(Zumbador,HIGH);
  digitalWrite(Led1,HIGH);
  digitalWrite(Led2,LOW);
  digitalWrite(Led3,LOW);
  delay(500);
  servoMotor.write(180);
  digitalWrite(Zumbador,LOW);
  digitalWrite(Led1,LOW);
  digitalWrite(Led2,HIGH);
  digitalWrite(Led3,LOW);
  delay(500);
  servoMotor.write(90);
  digitalWrite(Zumbador,HIGH);
  digitalWrite(Led1,LOW);
  digitalWrite(Led2,LOW);
  digitalWrite(Led3,HIGH);
  delay(500);
  servoMotor.write(180);
  digitalWrite(Zumbador,LOW);
  digitalWrite(Led1,LOW);
  digitalWrite(Led2,LOW);
  digitalWrite(Led3,LOW);
}

void loop() {
  /*
  Se añade un pequeño apartado para configurar el offset de la altura del ascensor
  y corregir las desviaciones provocadas por diferentes cargas y/o tensiones de alimentacion
  */
  if (Configurar == 1){

    //El pulsador de la Planta 3 sube el ascensor
    if(digitalRead(BA3)==1){
      digitalWrite(Gir1, HIGH);
      digitalWrite(Gir2, LOW);
      analogWrite(vel, 255);
    }

    //El pulsador de la Planta 1 baja el ascensor
    if(digitalRead(BA1)==1){
      digitalWrite(Gir1, LOW);
      digitalWrite(Gir2, HIGH);
      analogWrite(vel, 255);
    }

    //Si no pulsamos nigún pulsador el ascensor se para
    if(digitalRead(BA1) == 0 && digitalRead(BA3) == 0){
      digitalWrite(vel,LOW);
      digitalWrite(Gir1,LOW);
      digitalWrite(Gir2,LOW);
    }

    // Si pulsamos el boton central se sale del modo de configuracion
    if(digitalRead(BA2) == 1){
      // Esperamos a que se deje de pulsar el boton
      while (digitalRead(BA2) == 1){}
      Configurar = 0;
    }
  }

  // Entramos en el modo de funcionamiento normal
  if (Configurar == 0){

    // Si estamos en la primera planta
    if (Planta == 1){
      // Si no se pulsa el boton de ninguna otra planta
      if(digitalRead(BA2) == 0 && digitalRead(BA3) == 0){

        digitalWrite(Led1,HIGH); // Encender led de planta 1
        digitalWrite(Led2,LOW);  // Apagar el led de la planta 2
        digitalWrite(Led3,LOW);  // Apagar el led de la planta 3

        //servoMotor.write(180);
        // El motor DC no se mueve
        digitalWrite(vel,LOW);
        digitalWrite(Gir1,LOW);
        digitalWrite(Gir2,LOW);

        // El zumbador no pita
        delay(250);
        digitalWrite(Zumbador,LOW);

      }
      // Si se pulsa el boton de planta 2
      if(digitalRead(BA2)==1){
        // Esperar a que se deje de pulsar el boton 2
        while(digitalRead(BA2)==1){}

        // Apagar todos los leds
        digitalWrite(Led1,LOW);
        digitalWrite(Led2,LOW);
        digitalWrite(Led3,LOW);

        // Encender el motor DC
        digitalWrite(Gir1,HIGH);
        digitalWrite(Gir2,LOW);
        analogWrite(vel, 255);
        Planta = 2;
        // Hacer sonido con el zumbador
        digitalWrite(Zumbador,HIGH);
        delay(435);
        digitalWrite(Zumbador,LOW);
        delay(435);
        digitalWrite(Zumbador,HIGH);
        //Parar el motor DC
        digitalWrite(vel,LOW);
        digitalWrite(Gir1,LOW);
        digitalWrite(Gir2,LOW);
      }    
      // Si se pulsa el boton de planta 3
      else if(digitalRead(BA3)==1){
        // Esperar a que se deje de pulsar el boton 3
        while(digitalRead(BA3)==1){}
        // Apagar todos los leds
        digitalWrite(Led1,LOW);
        digitalWrite(Led2,LOW);
        digitalWrite(Led3,LOW);
        // Encender el motor DC
        digitalWrite(Gir1,HIGH);
        digitalWrite(Gir2,LOW);
        analogWrite(vel, 255 );
        Planta = 3;
        // Hacer sonido con el zumbador
        digitalWrite(Zumbador,HIGH);
        delay(430);
        digitalWrite(Zumbador,LOW);
        delay(430);
        digitalWrite(Zumbador,HIGH);
        delay(430);
        digitalWrite(Zumbador,LOW);
        delay(430);
        digitalWrite(Zumbador,HIGH);
        delay(215);
        digitalWrite(Zumbador,LOW);
        //Parar el motor DC
        digitalWrite(vel,LOW);
        digitalWrite(Gir1,LOW);
        digitalWrite(Gir2,LOW);
      }
    }
    // Si estamos en la segunda planta
    if (Planta == 2){
      // Si no se pulsa el boton de ninguna otra planta
      if(digitalRead(BA1) == 0 && digitalRead(BA3) == 0){
        digitalWrite(Led2,HIGH); // Se encoiende el led del piso 2
        digitalWrite(Led1,LOW); // Se apaga el led del piso 1
        digitalWrite(Led3,LOW); // Se apaga el led del piso 3
        // El motor DC no se mueve
        digitalWrite(vel,LOW);
        digitalWrite(Gir1,LOW);
        digitalWrite(Gir2,LOW);
        // El zumbador no pita
        delay(250);
        digitalWrite(Zumbador,LOW);
        // Se sube la barrera del servo
        servoMotor.write(90);
      }
      // Si se pulsa el boton de planta 1
      if(digitalRead(BA1)==1){
        // Esperar a que se deje de pulsar el boton 1
        while(digitalRead(BA1)==1){}
        // Bajar la barrera del servo
        delay(100);
        servoMotor.write(180);
        delay(100);
        // Apagar todos los leds
        digitalWrite(Led1,LOW);
        digitalWrite(Led2,LOW);
        digitalWrite(Led3,LOW);
        // Encender el motor DC
        digitalWrite(Gir1,LOW);
        digitalWrite(Gir2,HIGH);
        analogWrite(vel, 255 );
        Planta = 1;
        // Hacer sonido con el zumbador
        digitalWrite(Zumbador,HIGH);
        delay(200);
        digitalWrite(Zumbador,LOW);
        delay(200);
        digitalWrite(Zumbador,HIGH);
        delay(200);
        digitalWrite(Zumbador,LOW);
        delay(220);
        digitalWrite(Zumbador,HIGH);
        //Parar el motor DC
        digitalWrite(vel,LOW);
        digitalWrite(Gir1,LOW);
        digitalWrite(Gir2,LOW);
      }    
      // Si se pulsa el boton de planta 3
      else if(digitalRead(BA3)==1){
        // Esperar a que se deje de pulsar el boton 3
        while(digitalRead(BA3)==1){}
        // Bajar la barrera del servo
        delay(100);
        servoMotor.write(180);
        delay(100);
        // Apagar todos los leds
        digitalWrite(Led1,LOW);
        digitalWrite(Led2,LOW);
        digitalWrite(Led3,LOW);
        // Encender el motor DC
        digitalWrite(Gir1,HIGH);
        digitalWrite(Gir2,LOW);
        analogWrite(vel, 255 );
        Planta = 3;
        // Hacer sonido con el zumbador
        digitalWrite(Zumbador,HIGH);
        delay(440);
        digitalWrite(Zumbador,LOW);
        delay(440);
        //Parar el motor DC
        digitalWrite(Zumbador,HIGH);
        digitalWrite(vel,LOW);
        digitalWrite(Gir1,LOW);
        digitalWrite(Gir2,LOW);
      }    
    }

    if (Planta == 3){
      // Si no se pulsa el boton de ninguna otra planta
      if(digitalRead(BA2) == 0 && digitalRead(BA3) == 0){
        digitalWrite(Led3,HIGH);  // Se encoiende el led del piso 3
        digitalWrite(Led1,LOW);   // Se apaga el led del piso 1
        digitalWrite(Led2,LOW);   // Se apaga el led del piso 2
        // El motor DC no se mueve
        digitalWrite(vel,LOW);
        digitalWrite(Gir1,LOW);
        digitalWrite(Gir2,LOW);
        // El zumbador no pita
        delay(250);
        digitalWrite(Zumbador,LOW);
      }
      // Si se pulsa el boton de planta 1
      if(digitalRead(BA1)==1){
        // Esperar a que se deje de pulsar el boton 1
        while(digitalRead(BA1)==1){}
        // Apagar todos los leds
        digitalWrite(Led1,LOW);
        digitalWrite(Led2,LOW);
        digitalWrite(Led3,LOW);
        // Encender el motor DC
        digitalWrite(Gir1,LOW);
        digitalWrite(Gir2,HIGH);
        analogWrite(vel, 255 );
        Planta = 1;
        // Hacer sonido con el zumbador
        digitalWrite(Zumbador,HIGH);
        delay(200);
        digitalWrite(Zumbador,LOW);
        delay(200);
        digitalWrite(Zumbador,HIGH);
        delay(200);
        digitalWrite(Zumbador,LOW);
        delay(200);
        digitalWrite(Zumbador,HIGH);
        delay(200);
        digitalWrite(Zumbador,LOW);
        delay(200);
        digitalWrite(Zumbador,HIGH);
        delay(200);
        digitalWrite(Zumbador,LOW);
        delay(200);
        digitalWrite(Zumbador,HIGH);
        delay(220);
        digitalWrite(Zumbador,LOW);
        //Parar el motor DC
        digitalWrite(vel,LOW);
        digitalWrite(Gir1,LOW);
        digitalWrite(Gir2,LOW);
      }    
      // Si se pulsa el boton de planta 2
      else if(digitalRead(BA2)==1){
        // Esperar a que se deje de pulsar el boton 2
        while(digitalRead(BA2)==1){}
        // Apagar todos los leds
        digitalWrite(Led1,LOW);
        digitalWrite(Led2,LOW);
        digitalWrite(Led3,LOW);
        // Encender el motor DC
        digitalWrite(Gir1,LOW);
        digitalWrite(Gir2,HIGH);
        analogWrite(vel, 255 );
        Planta = 2;
        // Hacer sonido con el zumbador
        digitalWrite(Zumbador,HIGH);
        delay(200);
        digitalWrite(Zumbador,LOW);
        delay(200);
        digitalWrite(Zumbador,HIGH);
        delay(200);
        digitalWrite(Zumbador,LOW);
        delay(220);
        digitalWrite(Zumbador,HIGH);
        //Parar el motor DC
        digitalWrite(vel,LOW);
        digitalWrite(Gir1,LOW);
        digitalWrite(Gir2,LOW);
      }    
    }
  }
}
Vistas
1 Número de vistas
1 Vistas de miembros
0 Vistas públicas
Acciones
0 Gustos
0 No me gusta
0 Comentarios
Compartir en redes sociales
Compartir enlace
Compartir por correo

Por favor iniciar sesión para compartir esto webpage por correo.