Sistema de elevador
Elevador de 3 pisos y planta baja
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.