Go Down

Topic: como salir del bucle while con otros condicionantes (Read 547 times) previous topic - next topic

elcar

Hola amigos soy nuevo aqui y espero hacer bien la pregunta, disculpen si no lo hago bien. pues estoy haciendo un proyecto de un ascensor con 3 paradas y lo tengo funcionando, el problema es que tengo que añadirle una seguridades y no soy capaz. una es que si el ascensor esta en movimiento sea ascendente o descendente si pulso el boton E de emergencia debe detenerse. otra que si esta en movimiento y se abre la puerta de cabina tambien debe detenerse y la ultima que si esta en movimiento descendente y se activa el pulsador C de seguridad de cable, debe detenerse e invertir el movimiento y parar en la siguiente parada en orden ascendente. espero me haya explicado con claridad. muchas gracias
Code: [Select]
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
LiquidCrystal_I2C lcd (0x27,16,2);

const int Final_B=10; //final de carrera plantabaja pin 10
const int Final_1=8; // final de carrera 1planta pin 8
const int Final_2=11; //final de carrera 2planta pin 11
const int Pulsador_B=3; //pulsador de plantabaja pin 3
const int Pulsador_1=9; //pulsador de 1planta pin 9
const int Pulsador_2=4; //pulsador de 2planta pin 4
const int ReleSubir=12; //SUBIR pin 12
const int ReleBajar=13; //BAJAR pin 13
const int Alarma=24;     //Buzzer
const int Pulsador_P=2; //pulsador de puerta pin 2
const int Pulsador_C=25; //pulsador cables
const int Pulsador_E=5;  //pulsador parada emergencia

int Estado_Pulsador_2=0; // estado del pulsador de 2planta
int Estado_Pulsador_B=0; // estado del pulsador de plantabaja
int Estado_Pulsador_1=0; // estado del pulsador 1planta
int Estado_Pulsador_P=0; // estado del pulsador de puerta
int Estado_ReleSubir; // estado de marcha subir pin 12
int Estado_ReleBajar; // estado de marcha bajar pin 13
int Estado_Final_2=0;// estado del final de carrera planta2 pin 11
int Estado_Final_B=0;// estado del final de carrera plantabaja en el pin 10
int Estado_Final_1=0; // estado final carrera 1planta
int Estado_Pulsador_E=0; //estado del pulsador de paro emergencia
int Estado_Pulsador_C=0;  //estado del pulsador cables


void setup()
{
lcd.init();
lcd.backlight(); 
pinMode(ReleSubir,OUTPUT); //Se declara el pin 12 como salida
pinMode(ReleBajar,OUTPUT); //Se declara el pin 13 como salida
pinMode(Pulsador_E,INPUT);//Se declara el pin 5 como salida
pinMode(Pulsador_B,INPUT); //Se declara el pin 3 como entrada
pinMode(Pulsador_P,INPUT); //Se declara el pin 2 como entrada
pinMode(Final_2,INPUT);//Se declara el pin 11 como entrada
pinMode(Final_B,INPUT);//Se declara el pin 10 como entrada
pinMode(Pulsador_2,INPUT); //Se declara el pin 4 como entrada
pinMode(Alarma,OUTPUT);   //Se declara el pin 24 como salida
pinMode(Pulsador_C,INPUT); //Se declara el pin 25 como entrada
pinMode(Pulsador_1,INPUT); //Se declara el pin 9 como entrada
pinMode(Final_1,INPUT); //Se declara el pin 8 como entrada
}
       



void loop(){
           
Estado_Pulsador_2=digitalRead(Pulsador_2); //Lee el valor del pin 4. Sera 1 pulsado y 0 reposo
Estado_Pulsador_B=digitalRead(Pulsador_B); //Lee el valor del pin 3. Sera 1 pulsado y 0 reposo
Estado_Pulsador_1=digitalRead(Pulsador_1); //Lee el valor del pin 9. Sera 1 pulsado y 0 reposo
Estado_Pulsador_P=digitalRead(Pulsador_P); //Lee el valor del pin 2.Sera 0 pulsado y 1 reposo
Estado_Pulsador_E=digitalRead(Pulsador_E); //Lee el valor del pin 5. Sera 1 pulsado 0 reposo
Estado_Pulsador_C=digitalRead(Pulsador_C); //Lee el valor del pin 25.Sera 0 pulsado 1 reposo

Estado_Final_2=digitalRead(Final_2);//Lee el valor del pin 11
Estado_Final_B=digitalRead(Final_B);//Lee el valor del pin 10
Estado_Final_1=digitalRead(Final_1);//Lee el valor del pin 8
Estado_ReleSubir=digitalRead(ReleSubir); //Lee el valor de la salida del pin 12
Estado_ReleBajar=digitalRead(ReleBajar);//Lee el valor de la salida del pin 13 

if (Estado_Final_2==1){  //segun esten accionados los finales muestra donde se encuentra
 
     
     lcd.begin(16,2);
      lcd.setCursor(0,0);
      lcd.print("ASCENSOR");
      lcd.setCursor(0,1);
      lcd.print("EN PLANTA 2");
      delay(100);
  }

 if (Estado_Final_1==1){

     
     lcd.begin(16,2);
      lcd.setCursor(0,0);
      lcd.print("ASCENSOR");
      lcd.setCursor(0,1);
      lcd.print("EN PLANTA 1");
      delay(100);
  }



  if (Estado_Final_B==1){

     lcd.begin(16,2);
      lcd.setCursor(0,0);
      lcd.print("ASCENSOR");
      lcd.setCursor(0,1);
      lcd.print("EN PLANTA BAJA");
      delay(100);
  }

if (Estado_Pulsador_P ==0){  //mientras no se cierre la puerta de cabina entra en bucle y no hace nada
digitalWrite(ReleSubir,0);//Poner en nivel bajo en el pin 12
digitalWrite(ReleBajar,0);//Poner en nivel bajo en el pin 13
{
      lcd.begin(16,2);
      lcd.setCursor(0,0);
      lcd.print("PUERTA");
      lcd.setCursor(0,1);
      lcd.print("ABIERTA");
     
      }
   delay(200);
   funcionpuerta();
}


           
if (Estado_Pulsador_2==0 && Estado_Final_2==0 && Estado_Final_B==0 &&  Estado_ReleBajar==0 && Estado_ReleSubir==0 &&Estado_Pulsador_P ==1 && Estado_Final_1==0)
        //si no esta accionado nngun final muestra error de posicion y activa alarma
{
digitalWrite(ReleSubir,0);//Poner en nivel bajo en el pin 12
digitalWrite(ReleBajar,0);//Poner en nivel bajo en el pin 13

      lcd.begin(16,2);
      lcd.setCursor(0,0);
      lcd.print("ERROR");
      lcd.setCursor(0,1);
      lcd.print("DE POSICION");
     
   delay(100);
   digitalWrite(Alarma, HIGH);
    delay(100);
    digitalWrite(Alarma,LOW);
    delay(100);
 }

 if(Estado_Pulsador_B==1){  //pulsador de planta baja y va a funcion de planta baja
  delay(100);
  while(Estado_Pulsador_B==1){
   Estado_Pulsador_B=digitalRead(Pulsador_B);
   delay(10);
  }
  delay(500);
  funcionB();
 }

  else if(Estado_Pulsador_1==1){  //pulsador de primera planta y va a funcion de primera planta
    delay(100);
    while(Estado_Pulsador_1==1){
    Estado_Pulsador_1=digitalRead(Pulsador_1);
    delay(10); 
    }
    delay(500);
    funcion1();
  }

else if(Estado_Pulsador_2==1){  //pulsador de segunda planta y va a funcion de segunda planta
  delay(100);
  while(Estado_Pulsador_2==1){
  Estado_Pulsador_2=digitalRead(Pulsador_2);
  delay(10); 
  }
  delay(500);
  funcion2();
}
 
  digitalWrite(ReleSubir,0);
  digitalWrite(ReleBajar,0);
   delay(10);
}
 void funcionpuerta(){  //bucle de puerta de cabina abierta
 
  if(Estado_Pulsador_P !=1){
    while(Estado_Pulsador_P==0){
      digitalWrite(ReleSubir,0);//Poner en nivel bajo en el pin 12
      digitalWrite(ReleBajar,0);//Poner en nivel bajo en el pin 13
      Estado_Pulsador_P=digitalRead(Pulsador_P);
      delay(10);
    }
  }
}         

 void funcionB(){  //funcion de ir a planta baja

      if(Estado_Final_B !=1){
        while(Estado_Final_B==0){
          digitalWrite(ReleBajar,1);
        lcd.begin(16,2);
      lcd.setCursor(0,0);
      lcd.print("ASCENSOR");
      lcd.setCursor(0,1);
      lcd.print("BAJANDO");
        Estado_Final_B=digitalRead(Final_B);
        delay(10);
       }
    }
  }
 void funcion1(){  //funcion de ir a primera planta

   if(Estado_Final_2==1){
    while(Estado_Final_1==0){
      digitalWrite(ReleBajar,1);
      lcd.begin(16,2);
      lcd.setCursor(0,0);
      lcd.print("ASCENSOR");
      lcd.setCursor(0,1);
      lcd.print("BAJANDO");
     Estado_Final_1=digitalRead(Final_1);
     delay(10);
    }
   }

 else if(Estado_Final_B==1){
  while(Estado_Final_1==0){
    digitalWrite(ReleSubir,1);
    lcd.begin(16,2);
      lcd.setCursor(0,0);
      lcd.print("ASCENSOR");
      lcd.setCursor(0,1);
      lcd.print("SUBIENDO");
    Estado_Final_1=digitalRead(Final_1);
    delay(10); 
  }
 }
}
void funcion2(){  //funcion de ir a segunda planta

  if(Estado_Final_1==1 || Estado_Final_B==1){
    while(Estado_Final_2==0){
      digitalWrite(ReleSubir,1);
       lcd.begin(16,2);
      lcd.setCursor(0,0);
      lcd.print("ASCENSOR");
      lcd.setCursor(0,1);
      lcd.print("SUBIENDO");
      Estado_Final_2=digitalRead(Final_2);
      delay(10);
    }
  }
 
}

surbyte

Y para comenzar:
porqué en cada secuencia pones

Code: [Select]
lcd.begin(16,2);

Eso se usa una sola vez y en el setup!!
Ve corrigiendo y eliminando eso de cada if en los que lo encuentres.

Iré comentando a medida que vea otros fallos.

Bueno, la respuesta es simple. En un código que tiene delay() lo que pides no se puede hacer como tu quieres o pretendes.
Se debe aguardar a que termine la tarea y entonces si se podrá detener en la siguiente acción pero por ejemplo si tu le dices que vaya a un piso como por ejemplo ir a Planta Baja

Code: [Select]
void funcionB(){  //funcion de ir a planta baja

  if (Estado_Final_B !=1){
      while (Estado_Final_B==0){
            digitalWrite(ReleBajar,1);
            lcd.setCursor(0,0);
            lcd.print("ASCENSOR");
            lcd.setCursor(0,1);
            lcd.print("BAJANDO");
            Estado_Final_B = digitalRead(Final_B);
            delay(10);
      }
  }
}


Hasta que Final_B no este en 1 lo que se traduce en que no responderá a nada.
para que exista un botón de emergencia hay que ponerlo en cada función similar a esta o sea en cada piso o acción similar.

Go Up