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
#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);
}
}
}