Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: SRF05 mbed-rtos mbed
main.cpp
00001 #include "mbed.h" 00002 #include "SRF05.h" // Librería del sensor de nivel. 00003 #include "rtos.h" // Librería de tiempo real. 00004 00005 // PUERTAS. 00006 PwmOut servo1(PTB0); // Declaración del servomotor de la puerta del piso 1. 00007 PwmOut servo2(PTB1); // Declaración del servomotor de la puerta del piso 2. 00008 PwmOut servo3(PTB2); // Declaración del servomotor de la puerta del piso 3. 00009 // Ejemplo: 00010 /*servo1.period(0.025); 00011 servo2.period(0.025); 00012 servo3.period(0.025); 00013 servo1.pulsewidth(0.00055); 00014 servo2.pulsewidth(0.0022); 00015 servo3.pulsewidth(0.0022);*/ 00016 00017 // MOTOR. 00018 PwmOut giro1(PTC1); 00019 PwmOut giro2(PTC2); 00020 DigitalOut enable(PTB3); 00021 // Ejemplo: 00022 // giro1.period_ms(20); 00023 // giro2.period_ms(20); 00024 00025 // PULSADORES. 00026 /*DebouncedIn boton1(PTC11); // Botones de la parte frontal del ascensor. 00027 DebouncedIn boton2b(PTC10); // En este caso no se va a utilizar. 00028 DebouncedIn boton2s(PTC6); 00029 DebouncedIn boton3(PTC5);*/ 00030 00031 // Botones de la parte de abajo del ascensor. 00032 DigitalIn boton1i(PTC4); // Piso 1. 00033 DigitalIn boton2i(PTC3); // Piso 2. 00034 DigitalIn boton3i(PTC0); // Piso 3. 00035 DigitalIn botonp(PTC7); // Paro de emergencia. 00036 00037 // SENSOR DE NIVEL. 00038 SRF05 sensor(PTD3, PTD1); // Declaración del sensor de nivel. objeto de tipo SRF05 00039 00040 // LEDS. 00041 DigitalOut led1(PTE5); 00042 DigitalOut led2(PTE4); 00043 DigitalOut led3(PTE3); 00044 00045 // VARIABLES AUXILIARES. 00046 float med = 0; // Medida actual del sensor de nivel (distancia). 00047 float piso1; // Valor de distancia del sensor al piso 1. 00048 float piso2; // Valor de distancia del sensor al piso 2. 00049 float piso3; // Valor de distancia del sensor al piso 3. 00050 00051 int llamada1 = 0; // Variable que indica que se llamó el ascensor desde el piso 1. 00052 int llamada2 = 0; // Variable que indica que se llamó el ascensor desde el piso 2. 00053 int llamada3 = 0; // Variable que indica que se llamó el ascensor desde el piso 3. 00054 int pAbiertas = 0; // Variable que indica que las puertas se encuentran abiertas. 00055 00056 // HILOS Y SEMÁFOROS. 00057 Thread t1; // Hilo del sensor. 00058 Thread t2; // Hilo de los servomotores. 00059 Thread t3; // Hilo del movimiento del motor. 00060 Semaphore sem(1); // Semáforo. 00061 00062 void medida(){ // Función de la medida del sensor de nivel. 00063 while(1){ 00064 med = sensor.read(); // Realiza la lectura de la posición actual del ascensor. SRF05 00065 } 00066 } 00067 00068 void puertas(){ // Función de la apertura y cierre de puertas. 00069 while(1){ 00070 if(med == piso1 && llamada1 == 1){ 00071 sem.wait(); 00072 servo1.period(0.02); 00073 servo1.pulsewidth(0.002); // Activar el servo 1 moviéndolo a 90°. 00074 pAbiertas = 1; 00075 Thread::wait(5000); // Esperar 5 segundos. 00076 servo1.period(0.02); 00077 servo1.pulsewidth(0.0015); // Activar el servo 1 moviéndolo a 0°. 00078 pAbiertas = 0; 00079 llamada1 = 0; 00080 sem.release(); 00081 } 00082 if(med == piso2 && llamada2 == 1){ 00083 sem.wait(); 00084 servo2.period(0.02); 00085 servo2.pulsewidth(0.002); // Activar el servo 2 moviéndolo a 90°. 00086 pAbiertas = 1; 00087 Thread::wait(5000); // Esperar 5 segundos. 00088 servo2.period(0.02); 00089 servo2.pulsewidth(0.0015); // Activar el servo 2 moviéndolo a 0°. 00090 llamada2 = 0; 00091 sem.release(); 00092 } 00093 if(med == piso3 && llamada3 == 1){ 00094 sem.wait(); 00095 servo3.period(0.02); 00096 servo3.pulsewidth(0.002); // Activar el servo 3 moviéndolo a 90° (abrir). 00097 pAbiertas = 1; 00098 Thread::wait(5000); // Esperar 5 segundos. 00099 servo3.period(0.02); 00100 servo3.pulsewidth(0.0015); // Activar el servo 3 moviéndolo a 0° (cerrar). 00101 pAbiertas = 0; 00102 llamada3 = 0; 00103 sem.release(); 00104 } 00105 } 00106 } 00107 00108 void mover(){ // Función del movimiento del ascensor. 00109 while(1){ 00110 if(!boton1i && med != piso1 && med < piso1 && pAbiertas != 1){ // Pulsar el botón de piso 1. 00111 sem.wait(); 00112 llamada1 = 1; 00113 while(med <= piso1){ // Bajar al piso 1 desde cualqueira de los demás pisos. 00114 giro1.period(0.02); // Activar giro1 (bajar). 00115 giro1.pulsewidth(0.01); 00116 giro2.period(0.02); 00117 giro2.pulsewidth(0); 00118 if(!botonp){ // Si se pulsa el botón de paro de emergencia se para el ascensor. 00119 break; 00120 } 00121 } 00122 giro1.period(0.02); // Parar. 00123 giro1.pulsewidth(0); 00124 sem.release(); 00125 } 00126 if(!boton2i && med != piso2 && med < piso2 && pAbiertas != 1){ // Pulsar el botón de piso 2. 00127 sem.wait(); 00128 llamada2 = 1; 00129 while(med <= piso2){ // Bajar al piso 2 desde el tercer piso. 00130 giro1.period(0.02); // Activar giro1 (bajar). 00131 giro1.pulsewidth(0.01); 00132 giro2.period(0.02); 00133 giro2.pulsewidth(0); 00134 if(!botonp){ // Si se pulsa el botón de paro de emergencia se para el ascensor. 00135 break; 00136 } 00137 } 00138 giro1.period(0.02); // Parar. 00139 giro1.pulsewidth(0); 00140 sem.release(); 00141 } 00142 if(!boton2i && med != piso2 && med > piso2 && pAbiertas != 1){ // Pulsar el botón de piso 2. 00143 sem.wait(); 00144 llamada2 = 1; 00145 while(med >= piso2){ // Subir al piso 2 desde el primer piso. 00146 giro1.period(0.02); // Activar giro2 (subir). 00147 giro1.pulsewidth(0); 00148 giro2.period(0.02); 00149 giro2.pulsewidth(0.01); 00150 if(!botonp){ // Si se pulsa el botón de paro de emergencia se para el ascensor. 00151 break; 00152 } 00153 } 00154 giro2.period(0.02); // Parar. 00155 giro2.pulsewidth(0); 00156 sem.release(); 00157 } 00158 if(!boton3i && med != piso2 && med > piso3 && pAbiertas != 1){ // Pulsar el botón de piso 3. 00159 sem.wait(); 00160 llamada3 = 1; 00161 while(med >= piso3){ // Subir al piso 2 desde el primer piso. 00162 giro1.period(0.02); // Activar giro2 (subir). 00163 giro1.pulsewidth(0); 00164 giro2.period(0.02); 00165 giro2.pulsewidth(0.01); 00166 if(!botonp){ // Si se pulsa el botón de paro de emergencia se para el ascensor. 00167 break; 00168 } 00169 } 00170 giro2.period(0.02); // Parar. 00171 giro2.pulsewidth(0); 00172 sem.release(); 00173 } 00174 if(!boton1i && med == piso1){ // Pulsar el botón de piso 1 en el primer piso. 00175 sem.wait(); 00176 llamada1 = 1; 00177 sem.release(); 00178 } 00179 if(!boton2i && med == piso2){ // Pulsar el botón de piso 2 en el segundo piso. 00180 sem.wait(); 00181 llamada2 = 1; 00182 sem.release(); 00183 } 00184 if(!boton3i && med == piso3){ // Pulsar el botón de piso 3 en el tercer piso. 00185 sem.wait(); 00186 llamada3 = 1; 00187 sem.release(); 00188 } 00189 } 00190 } 00191 00192 int main(){ // Función principal. 00193 t1.start(medida); 00194 t2.start(puertas); 00195 t3.start(mover); 00196 enable = 1; // Habilitar el Puente H. 00197 }
Generated on Sun Jul 31 2022 12:02:31 by
1.7.2