Sistema de elevador

Elevador de 3 pisos y planta baja

...
Posteado por Amaya el 30-05-2024 a las 11:57
Categoria: Arduino
Realizado por: David Eduardo Amaya Cen Chan Tec Brayan Ricardo Yam Cetina Diego Alonso

Presentación.

Este proyecto esta diseñado para una ejecución de comandos simples con ejecución a botones donde dentro de ellos tiene un botones de menú y también por fuera para llamar al elevador   

Funcionamiento.

Es una manera fácil de utilizar se maneja con botones dentro de la cabina, los cuales son 4 para los pisos y 1 de emergencia donde emergencia no se podrá mover el elevador y por fuera también tiene botones tanto de subida como de bajada para que llame al elevador cuando el este vasillo y de esa manera sucesivamente se moverá cabe recalcar que contiene u a compuerta para que tenga el tiempo de 15segundos para abrirse y cerrar  

Realización.

Conforme al armado del proyecto utilizamos 1 motor reductor el cual tendrá la función de subir y bajar la caja del elevador, en ello esta aunado a sensores los cuales cuando detecten una bandera a cuál tiene la caja automáticamente el ascenso para, en ello está conectado el Arduino 1 el cual carga la información y también tiene un Arduino mini el cual lo tengo conectado al desplaye y con ello también se le inserto un micro por lo que él, tiene la función de abrir y cerrar las puertas. 

Programación.

display

// Declaración de las variables para los pines del Arduino

int AT = 2, B = 3, C = 4, D = 5, E = 6, F = 7, G = 8, DIP = 9;
int tiemp = 100; // Variable de tiempo para delay

// Función de configuración inicial del Arduino
void setup() {
  Serial.begin(9600); // Inicia la comunicación serial a 9600 baudios
  
  // Configura los pines como salidas
  pinMode(AT, OUTPUT);
  pinMode(B, OUTPUT);
  pinMode(C, OUTPUT);
  pinMode(D, OUTPUT);
  pinMode(E, OUTPUT);
  pinMode(F, OUTPUT);
  pinMode(G, OUTPUT);
  pinMode(DIP, OUTPUT);

  // Bucle que se ejecuta hasta que haya datos disponibles en el puerto serial
  do {
    reinicio(); // Llama a la función de reinicio que apaga todos los segmentos
    digitalWrite(DIP, LOW); // Apaga el pin DIP (Pin 9)

    // Apaga los pines de 2 a 7 (AT a G) con un retardo de 100 ms entre cada uno
    for (int i = 2; i < 8; i++) {
      digitalWrite(i, LOW);
      delay(100);
    }
  } while (!Serial.available() > 0); // Repite hasta que haya datos disponibles en el puerto serial
}

// Función principal del Arduino que se ejecuta en bucle
void loop() {
  if (Serial.available() > 0) { // Si hay datos disponibles en el puerto serial
    String receivedString = Serial.readStringUntil(' '); // Leer la cadena de caracteres hasta el salto de línea
    int receivedNumber = receivedString.toInt(); // Convertir la cadena recibida a un número entero
    
    // Llama a la función correspondiente según el número recibido
    if (receivedNumber == 1) {
      reinicio();
      uno();
    }
    if (receivedNumber == 2) {
      reinicio();
      dos();
    }
    if (receivedNumber == 3) {
      reinicio();
      tres();
    }
    if (receivedNumber == 4) {
      reinicio();
      cuatro();
    }
  }
}

// Función para mostrar el número 1 en el display de 7 segmentos
void uno() {
  digitalWrite(AT, HIGH);
  digitalWrite(B, LOW);
  digitalWrite(C, LOW);
  digitalWrite(D, HIGH);
  digitalWrite(E, HIGH);
  digitalWrite(F, HIGH);
  digitalWrite(G, HIGH);
  digitalWrite(DIP, HIGH);
}

// Función para mostrar el número 2 en el display de 7 segmentos
void dos() {
  digitalWrite(AT, LOW);
  digitalWrite(B, LOW);
  digitalWrite(C, HIGH);
  digitalWrite(D, LOW);
  digitalWrite(E, LOW);
  digitalWrite(F, HIGH);
  digitalWrite(G, LOW);
  digitalWrite(DIP, HIGH);
}

// Función para mostrar el número 3 en el display de 7 segmentos
void tres() {
  digitalWrite(AT, LOW);
  digitalWrite(B, LOW);
  digitalWrite(C, LOW);
  digitalWrite(D, LOW);
  digitalWrite(E, HIGH);
  digitalWrite(F, HIGH);
  digitalWrite(G, LOW);
  digitalWrite(DIP, HIGH);
}

// Función para mostrar el número 4 en el display de 7 segmentos
void cuatro() {
  digitalWrite(AT, HIGH);
  digitalWrite(B, LOW);
  digitalWrite(C, LOW);
  digitalWrite(D, HIGH);
  digitalWrite(E, HIGH);
  digitalWrite(F, LOW);
  digitalWrite(G, LOW);
  digitalWrite(DIP, HIGH);
}

// Función para reiniciar (apagar) todos los segmentos del display de 7 segmentos
void reinicio() {
  digitalWrite(AT, HIGH);
  digitalWrite(B, HIGH);
  digitalWrite(C, HIGH);
  digitalWrite(D, HIGH);
  digitalWrite(E, HIGH);
  digitalWrite(F, HIGH);
  digitalWrite(G, HIGH);
  digitalWrite(DIP, HIGH);
}

 

 

elevador 

#include <Servo.h>
Servo myservo;
int pos = 0;
/////variables para el menu
const int numButtons = 4; // Número de botones
const int buttonPins[numButtons] = {9, 10, 11, 12}; // Pines de los botones M1, M2, M3, M4
const char* buttonNames[numButtons] = {"M1", "M2", "M3", "M4"}; // Nombres de los botones para impresión
int pressOrder[numButtons] = {0, 0, 0, 0}; // Array para registrar el orden de presionado
int pressIndex = 0; // Índice actual en el array de orden
int direccion = 0; // Variable para el primer botón presionado

//////
int tiemp=0, espera=7000, r=0, maxV=0,minV=0, ty1=1,ty2=0, ts=1;
int S4=13,S3=4,S2=7,S1=8;///sensores
int EME=2;///menu cabina
int P4=A0, P3P=A1, P3N=A2, P2P=A3, P2N=A4, P1=A5; //MANDO PISO
int arriba=5, abajo=6; ///motor
int lugar_acensor=0,  pisoir=0, boton=0, lugar_ante=0, we=0, we2;
void motor_arriba(){
 analogWrite(arriba,180);
 analogWrite(abajo,0);
}
void motor_abajo(){
 analogWrite(arriba,0);
 analogWrite(abajo,180);
}
void motor_stop(){
 analogWrite(arriba,0);
 analogWrite(abajo,0);
}
void emergencia(){
    motor_stop();
  resetAll();
  int tg=1;
  while (tg>0){
    if (digitalRead(buttonPins[0]) == LOW){direccion=1, tg=0;}  ///lectura de botonera
    if (digitalRead(buttonPins[1]) == LOW){direccion=2, tg=0;}
    if (digitalRead(buttonPins[2]) == LOW){direccion=3, tg=0;}
    if (digitalRead(buttonPins[3]) == LOW){direccion=4, tg=0;}
    ty1=1;
    ty2=1;
  }

}
void setup()
{
  Serial.begin(9600);
   myservo.attach(3);
  attachInterrupt(digitalPinToInterrupt(2), emergencia, FALLING);
  for (int i = 0; i < numButtons; i++) {
    pinMode(buttonPins[i], INPUT_PULLUP); // Configurar pines de botones como entradas con pull-up
  }
  pinMode(S4,INPUT_PULLUP); //SENSORES DE PISO 4
  pinMode(S3,INPUT_PULLUP); //SENSORES DE PISO 3
  pinMode(S2,INPUT_PULLUP); //SENSORES DE PISO 2
  pinMode(S1,INPUT_PULLUP); //SENSORES DE PISO 1
  pinMode(EME,INPUT_PULLUP); //MENU EMERGENCIA
  pinMode(P4,INPUT_PULLUP); //BOTON PISO 4
  pinMode(P3P,INPUT_PULLUP); //BOTON PISO 3 ARRIBA
  pinMode(P3N,INPUT_PULLUP); //BOTON PISO 3 ABAJO
  pinMode(P2P,INPUT_PULLUP); //BOTON PISO 2 ARRIBA
  pinMode(P2N,INPUT_PULLUP); //BOTON PISO 2 ABAJO
  pinMode(P1,INPUT_PULLUP); //BOTON PISO 1
  pinMode(arriba ,OUTPUT); //MOTOR A
  pinMode(abajo,OUTPUT); //MOTOR B
  myservo.write(0);
  while(digitalRead(S1)>0){
      motor_abajo();
  }
  lugar_acensor=1;
  pisoir=1;
  motor_stop();
  delay(50);
}

void loop() {
  ubicacion();
  soli_piso();
  menu();
  if (direccion>lugar_acensor && direccion>0 && ty1==1 ){
    pisoir=maxV;
    ty2=0;
  }
  if (direccion<lugar_acensor && direccion>0 && ty2==1){
    pisoir=minV;
    ty1=0;
  }
  ubicacion();
  movimiento();
}
void movimiento(){
  if (pisoir>lugar_acensor){
    ts=1;
    motor_arriba();
    if (lugar_ante<lugar_acensor){
      lugar_ante=lugar_acensor;
       we=1;
    }
      for (int i = 0; i < numButtons; i++) { ///orden
        if(pressOrder[i]<pisoir && pressOrder[i]>0 && we==1 && pressOrder[i]==lugar_acensor){
          we=0;
            tiemp=millis();
            myservo.write(90);
            do {
                r=millis()-tiemp;
                motor_stop();
                menu();
                soli_piso();
                } while (r<=espera);
                myservo.write(0);
              motor_arriba();
        }
      }
  }
  if (pisoir<lugar_acensor){
    ts=1;
    motor_abajo();
    if (lugar_ante>lugar_acensor){
      lugar_ante=lugar_acensor;
       we2=1;
    }
      for (int i = 0; i < numButtons; i++) { ///orden
        if(pressOrder[i]>pisoir && pressOrder[i]>0 && we2==1 && pressOrder[i]==lugar_acensor){
          we2=0;
          myservo.write(90);
            tiemp=millis();
            do {
                r=millis()-tiemp;
                motor_stop();
                menu();
                soli_piso();
                } while (r<=espera);
              myservo.write(0);
              motor_arriba();
        }
      }
  }
  if (pisoir==lugar_acensor && ts==1){
    ts=0;
    resetAll();
    pisoir=lugar_acensor;
    lugar_ante=lugar_acensor;
    ty1=1;
    ty2=1;
    myservo.write(90);
    tiemp=millis();
      do {
                r=millis()-tiemp;
                motor_stop();
                menu();
                soli_piso();
                } while (r<=espera);
              myservo.write(0);
  }
}

void ubicacion(){
  if (digitalRead(S1)==0){lugar_acensor=1, Serial.println(lugar_acensor);}
  if (digitalRead(S2)==0){lugar_acensor=2, Serial.println(lugar_acensor);}
  if (digitalRead(S3)==0){lugar_acensor=3, Serial.println(lugar_acensor);}
  if (digitalRead(S4)==0){lugar_acensor=4, Serial.println(lugar_acensor);}
}
void soli_piso(){
  int jk=0, kj=0;
  if (digitalRead(P4)==0){ boton=4, jk=1;}
  if (digitalRead(P3P)==0){boton=3, jk=1;}
  if (digitalRead(P3N)==0){boton=3, kj=1;}
  if (digitalRead(P2P)==0){boton=2, jk=1;}
  if (digitalRead(P2N)==0){boton=2, kj=1;}
  if (digitalRead(P1)==0){ boton=1, kj=1;}

  if (pressIndex>0 && ty1==jk){
    if (!alreadyPressed(boton)) {
      pressOrder[pressIndex] = boton;
      pressIndex++;
    }
  } else if (pressIndex>0 && ty2==kj){
    if (!alreadyPressed(boton)) {
      pressOrder[pressIndex] = boton;
      pressIndex++;
    }
  }  else if(boton==lugar_acensor && pisoir==lugar_acensor){
    myservo.write(90);
    tiemp=millis();
    do {
        r=millis()-tiemp;
        motor_stop();
        menu();
    } while (r<=espera);
    myservo.write(0);
  }else if( pressOrder[0]==0 && boton>0){
     pressOrder[0]=boton;
     direccion=boton;
  }

  boton=0;
}
void menu(){
   for (int i = 0; i < numButtons; i++) {
    if (digitalRead(buttonPins[i]) == LOW) { // Si el botón está presionado
      if (!alreadyPressed(i + 1)) { // Verificar si ya fue registrado
        pressOrder[pressIndex] = i + 1; // Registrar el botón presionado
        pressIndex++;
        if (direccion == 0) { // Guardar el primer botón presionado en "direccion"
          direccion = i + 1;
        }
      }
    }
  }

  // Encontrar e imprimir el menor y mayor botón presionado
  int minPressed = findMinPressed();
  minV=findMinPressed();
  int maxPressed = findMaxPressed();
  maxV=findMaxPressed();

}
// Función para verificar si un botón ya fue registrado
bool alreadyPressed(int button) {
  for (int i = 0; i < pressIndex; i++) {
    if (pressOrder[i] == button) {
      return true;
    }
  }
  return false;
}

// Función para reiniciar todas las variables y arrays
void resetAll() {
  pressIndex = 0;
  direccion = 0;
  for (int i = 0; i < numButtons; i++) {
    pressOrder[i] = 0;
  }
}

// Función para encontrar el menor botón presionado
int findMinPressed() {
  int minVal = 5; // Valor mayor que cualquier botón posible
  bool found = false;
  for (int i = 0; i < numButtons; i++) {
    if (pressOrder[i] != 0 && pressOrder[i] < minVal) {
      minVal = pressOrder[i];
      found = true;
    }
  }
  return found ? minVal : -1; // Retorna -1 si no se encontró ningún botón presionado
}

// Función para encontrar el mayor botón presionado
int findMaxPressed() {
  int maxVal = 0; // Valor menor que cualquier botón posible
  bool found = false;
  for (int i = 0; i < numButtons; i++) {
    if (pressOrder[i] != 0 && pressOrder[i] > maxVal) {
      maxVal = pressOrder[i];
      found = true;
    }
  }
  return found ? maxVal : -1; // Retorna -1 si no se encontró ningún botón presionado
}

Utilización.

una vez con todo conectado la manera en la cual se sabra que ya esta encendido todo es cuando el asensor este en el pisos uno , la compuerta se puueda abrir de manera automatica y este en verde todos los sensores de esa manera ya puedes empesar a tocar los botones dentro del menu del asensor o en su parte tocarlo desde afuera una vez ya cerrada la compuerta y picar desde afuera por p 

Conclusiones.

por parte de una conclusion pues es que fue un proyecto del elevador de 3 pisos y planta baja ofrece unacontrol de un elevador mediante botones internos y externos. Utilizando un motor reductor y sensores para junto con un sistema de apertura y cierre de puertas manejado por microcontroladores Arduino, se asegura un funcionamiento algo rapiddo y pues la inclusion de un botón de emergencia añade una capa adicional de seguridad, haciendo de este proyecto una implementación robusta y fácil de usar.

Referencias.

  • Documentación Oficial de Arduino

    • Sitio web: Documentación de Arduino
    • Descripción: La página oficial de Arduino proporciona tutoriales completos sobre cómo conectar y programar varios componentes, incluyendo botones y displays.
  • "Arduino para Principiantes" de Enrique Plaza García

    • Libro: Plaza García, E. (2016). Arduino para Principiantes. Starbook Editorial.
    • Descripción: Este libro ofrece una introducción accesible al mundo de Arduino, explicando cómo conectar y utilizar componentes básicos como botones y displays.

Para comentar debes acceder Acceder

Comentarios


No hay comentarios en este post