Esta parte no está elaborada. Presento 'en bruto' el programa que he utilizado para controlar el ascensor tal y como aparece en el vídeo. El programa tiene muchos comentarios que ayudan a interpretarlo.
//Control de un ascensor de tres plantas
//Secuencia arbitraria de movimientos entre plantas y parada prolongada, 5 minutos.
//MOTOR
#define M1 5 //pin del motor
#define M2 6 //pin del motor
#define M1On analogWrite (M1,255);//pin 1 del motor en On
#define M1Off analogWrite (M1,0);//pin 1 del motor en Off
#define M2On analogWrite (M2,255);//pin 2 del motor en On
#define M2Off analogWrite (M2,0);//pin 2 del motor en Off
//Leds
#define L0 10 //Led de la planta 0
#define Led0On digitalWrite (L0,1) // Encendido
#define Led0Off digitalWrite (L0,0) // Apagado
#define L1 11 //Led de la planta 1
#define Led1On digitalWrite (L1,1) // Encendido
#define Led1Off digitalWrite (L1,0) // Apagado
#define L2 13 //Led de la planta 2
#define Led2On digitalWrite (L2,1) // Encendido
#define Led2Off digitalWrite (L2,0) // Apagado
//LDR
#define LDR A5 //Pin de lectura del LDR
void setup() {
pinMode (M1,OUTPUT);
pinMode (M2,OUTPUT);
pinMode (L0,OUTPUT);
pinMode (L1,OUTPUT);
pinMode (L2,OUTPUT);
pinMode (LDR, INPUT);
}
int AscensorEnPlanta=1;//variable para detectar la posición de ascensor
void Sube(){//el ascensor sube
M1Off;M2On;
}
void Baja(){//el ascensor baja
M1On;M2Off;
}
void Para(){//el ascensor se detiene
M1Off;M2Off;
}
void Busca() {//busca la planta en la que está el ascensor y guarda el número de la
//planta en la variable AscensorEnPlanta
Led0On; delay (500);//enciende el led de la panta 0, medio segundo
if (analogRead(LDR)< 250) {AscensorEnPlanta = 0;}//si responde la LDR el ascensor está en esa planta
Led0Off; Led1On; delay (500);//apaga el led de la planta 0 y enciende el de la planta 1
if (analogRead(LDR)< 250) {AscensorEnPlanta = 1;}//si responde la LDR el ascensor está en esa planta
Led1Off;Led2On; delay (500);//apaga el led de la planta 1 y enciende el de la planta 2
if (analogRead(LDR)< 250) {AscensorEnPlanta = 2;}//si responde la LDR el ascensor está en esa planta
Led2Off;//apaga el led de la planta 2
}
void IrA2(){//lleva al ascensor a la planta 2
Led2On;delay (300);//enciende el led de la planta 2
if (analogRead(LDR)> 250){//para este valor de la LDR el ascensor no está en la planta 2
Sube();delay(1000);//en ese caso el ascensor sube
while (analogRead(LDR)> 250){};//mientras la LDR no responde a la presencia del led
//que coincide con la llegada del ascensor a la planta
//no se cambia nada, luego el ascensor sigue subiendo
delay (300); Para();}//retardo para ajustar el punto de parada, y parada del ascensor
Led2Off;//se apaga el led de la planta
}
void IrA0(){//ver void IrA2
Led0On;delay (300);
if (analogRead(LDR)> 250){
Baja();delay(1000);
while (analogRead(LDR)> 250){};
delay (300); Para();}
Led0Off;
}
void SubeA1(){//para ir a la planta 1 subiendo. Esta función es similar a IrA2
Led1On;delay (300);
if (analogRead(LDR)> 250){
Sube();delay(1000);
while (analogRead(LDR)> 250){};
delay (600); Para();}
Led1Off;
}
void BajaA1(){//para ir a la planta 1 bajando. Esta función es similar a IrA2
Led1On;delay (300);
if (analogRead(LDR)> 250){
Baja();delay(1000);
while (analogRead(LDR)> 250){};
delay (300); Para();}
Led1Off;
}
void IrA1(){//para ir a la planta 1
Busca();//con la función Busca se determina en que planta está el ascensor
if (AscensorEnPlanta==0){SubeA1();}//si está en la planta 0 sube a la 1
if (AscensorEnPlanta==2){BajaA1();}//si está en la planta 2 baja a la 1
if (AscensorEnPlanta==1){}//si está en la panta 1 no hace nada
}
void muevete() {//una secuencia arbitraria de movimientos del ascensor
IrA2();delay (5000);
IrA1();delay (5000);
IrA0();delay (5000);
IrA2();delay (7000);
delay (7000);
IrA0();delay (7000);
delay (7000);
IrA1();delay (7000);
delay (7000);
}
void luces(){//intermitencia de las luces de las plantas 0 y 1
Led1Off; Led0On; delay(500);
Led0Off; Led1On; delay(500);
}
void espera(){//el ascensor espera 240 segundos con una intermitencia de leds
for(int x=0;x<240;x++)
{luces();
Led0Off; Led1Off;
}
}
void loop(){
muevete();
IrA2();
espera();
IrA0();delay(5000);
}