Академический Документы
Профессиональный Документы
Культура Документы
h>
/*
====================================================================================================
=====================================
CONSTANTES
====================================================================================================
===================================== */
const int outServo = 3; // Salida del servo. Pendiente de ubicar. Utilizar para el control
los pines asociados al PWM
const int fCarrera = A4; // Sensor de final de carrera del motor subida bajada. Lectura de
pin analógico
const int sensorPuerta = A5; // Sensor de seguridad de la puerta. Lectura de pin analógico
/*
====================================================================================================
=====================================
VARIABLES
====================================================================================================
===================================== */
/*
====================================================================================================
=====================================
FUNCIONES
====================================================================================================
===================================== */
anteriorLeido = leido;
return pulsado;
}
if (analogRead(sensor) <= 100 && !retardo()){ // Se recoge el primer dato y cuando pasa un
tiempo mínimo 'intervalo' (filtro ruido) --> se puede volver a capturar un nuevo dato
lectura = HIGH; // Hay activación del sensor
lecturaOptico = HIGH;
}
return lectura;
}
// Indica que se ha pulsado algún botón distinto al de la planta donde está el ascensor
boolean llamadaAscensor(int planta){
boolean llamada = false;
for (int i = 0; i < PLANTAS; i++){
if (i != planta){
if (botonesAscensor[i] == HIGH || pulsadoresPlanta[i] == HIGH)
llamada = true;
}
}
return llamada;
}
/*
----------------------------------------------------------------------------------------------------
---------------------------- */
// Sensor de llegada a planta. Llama a la función de lectura del sensor, escribe en la posición
correspondiente y luego lo verifica
boolean sensorFinalCarrera(int sensor, int planta){
// finalCarrPlanta[planta] = lecturaSensorOptico(sensor); // Para cuando se dispone de un
sensor por planta
return lecturaSensorOptico(sensor) == HIGH; // Verifico si se ha activado el
sensor de final de carrera
}
/*
····································································································
···················· */
/*
----------------------------------------------------------------------------------------------------
---------------------------- */
/* ······························· Funciones para control del motor paso a paso de la puerta del
ascensor ························ */
// Indica cuando se ha terminado de cerrar la puerta, tras un tiempo, de entrada del ascensor
boolean cierrePuerta(){
/*
····································································································
··························· */
/*
====================================================================================================
=====================================
INICIALIZACIÓN Y CONFIGURACIÓN
====================================================================================================
===================================== */
void setup() {
pinMode(fCarrera, INPUT);
/*
====================================================================================================
=========================================
EJECUCIÓN DE LA APLICACIÓN
====================================================================================================
========================================== */
void loop(){
switch(estado){
/* xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ESTADO DE REPOSO EN PLANTA n
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx */
case 0:
if (botonPulsado(planta)){ // En reposo, si se pulsa para abrir la puerta
y se está en la misma planta.
// Ya sea planta de destino o para seguir
subiendo o bajando
estado = 2;
estadoReposo = ledEstadoApagado(ledReposo);
}
else if (llamadaAscensor(planta)){ // Si se pulsa un boton para subir o bajar
estado = 1;
estadoReposo = ledEstadoApagado(ledReposo);
}
else if (!estadoReposo){ // Condición de reposo en una planta. Solo
entra una vez para no sobre-escribir los puertos
estadoReposo = ledEstadoEncendido(ledReposo);
numeroPlanta(planta);
}
break;
case 1:
parpadeoLedEstado(ledEntreplanta); // Indicador de entreplanta con parpadeo
case 2:
// Si se activa el sensor de seguridad de la puerta --> Algún obstáculo
if (sensorSeguridadPuerta(sensorPuerta) && !abriendoPuerta){ // Si se activa el sensor de
seguridad y se está cerrando la puerta
detenerPuerta(); // Detiene el cierre de la puerta
aperturaEmergenciaPuerta(); // Apertura de emergencia
paradaPuerta(); // Mantiene la puerta abierta durante
3 segundos
abriendoPuerta = true;
}
// Proceso normal: apertura + espera + cierre de puerta
else { // No se activa el sensor de
seguridad
if (botonPulsado(planta)){ // Apertura de puerta // Cada
pasada, se desplaza una distancia determinada por PASO del servo
if (puertaAbierta()){
borradoRegistroPlanta(planta); // Por si alguien vuelve a pulsar el
botón de planta, se abren las puertas
paradaPuerta();
}
}
else if (puertaCerrada()){ // La puerta ya está cerrada
estadoPuerta = ledEstadoApagado(ledPuerta);
estado = 0; // Vuelve a reposo en la planta donde
se encuentra el ascensor
}
else if(!botonPulsado(planta)){ // Proceso de cierre de puerta
abriendoPuerta = false;
cierrePuerta();
}
}
break;
}