Aarón González Benaissa
/
control_remoto
Activación de válvula con control remoto
main.cpp@0:46d20fd2b120, 2016-05-20 (annotated)
- Committer:
- AaronGonzalez
- Date:
- Fri May 20 12:38:50 2016 +0000
- Revision:
- 0:46d20fd2b120
Activaci?n de v?lvula por control remoto
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
AaronGonzalez | 0:46d20fd2b120 | 1 | #include "mbed.h" |
AaronGonzalez | 0:46d20fd2b120 | 2 | #include <pulse1.h> |
AaronGonzalez | 0:46d20fd2b120 | 3 | #include <string.h> |
AaronGonzalez | 0:46d20fd2b120 | 4 | //Tarea de automatización de válvula para sanitario |
AaronGonzalez | 0:46d20fd2b120 | 5 | PulseInOut irda(PTD5); // Entrada del sensor infrarojo |
AaronGonzalez | 0:46d20fd2b120 | 6 | Serial pc(USBTX, USBRX); // módulos de transmisión y recepción |
AaronGonzalez | 0:46d20fd2b120 | 7 | PwmOut l0(PTD0); // pin de activación de la válvula |
AaronGonzalez | 0:46d20fd2b120 | 8 | DigitalOut l1(LED1); |
AaronGonzalez | 0:46d20fd2b120 | 9 | |
AaronGonzalez | 0:46d20fd2b120 | 10 | int header =0; //Cabecera inicial en cero |
AaronGonzalez | 0:46d20fd2b120 | 11 | //Tiempo de cabecera de subida y bajada - 4520 |
AaronGonzalez | 0:46d20fd2b120 | 12 | const int head_H = 5424; //+20% medida con osciloscopio en microsegundos |
AaronGonzalez | 0:46d20fd2b120 | 13 | const int head_L = 3616; //-20% medida con osciloscopio |
AaronGonzalez | 0:46d20fd2b120 | 14 | int i=0; |
AaronGonzalez | 0:46d20fd2b120 | 15 | const int T_alto = 1680; //ponga su tiempo de la prueba |
AaronGonzalez | 0:46d20fd2b120 | 16 | const int T_bajo = 560; //ponga su tiempo de la prueba |
AaronGonzalez | 0:46d20fd2b120 | 17 | const int num_bits = 32; //ponga su numero de bits |
AaronGonzalez | 0:46d20fd2b120 | 18 | int num[num_bits]; //cadena para almacenar todos los tiempos que conforman los bits de datos |
AaronGonzalez | 0:46d20fd2b120 | 19 | int aux[num_bits]; //Cadena auxiliar a comparar |
AaronGonzalez | 0:46d20fd2b120 | 20 | int dato,prender,flag1; |
AaronGonzalez | 0:46d20fd2b120 | 21 | |
AaronGonzalez | 0:46d20fd2b120 | 22 | // Secuencia de encendido entregada por el botón POWER del control |
AaronGonzalez | 0:46d20fd2b120 | 23 | int power[]={1,0,1,1,0,1,0,0,1,0,1,1,0,1,0,0,0,0,0,0,1,1,0,0,1,1,1,1,0,0,1}; |
AaronGonzalez | 0:46d20fd2b120 | 24 | |
AaronGonzalez | 0:46d20fd2b120 | 25 | int main(){ |
AaronGonzalez | 0:46d20fd2b120 | 26 | |
AaronGonzalez | 0:46d20fd2b120 | 27 | while(1){ |
AaronGonzalez | 0:46d20fd2b120 | 28 | |
AaronGonzalez | 0:46d20fd2b120 | 29 | ini1: |
AaronGonzalez | 0:46d20fd2b120 | 30 | fflush( stdin ); //sirve para limpiar el buffer de entrada de teclado |
AaronGonzalez | 0:46d20fd2b120 | 31 | header=0; //cabecera inicial en cero |
AaronGonzalez | 0:46d20fd2b120 | 32 | l0=0; //LED's apagados inicialmente |
AaronGonzalez | 0:46d20fd2b120 | 33 | l1=0; |
AaronGonzalez | 0:46d20fd2b120 | 34 | header = irda.read_low_us(); //funcion para leer un pulso de caida o bajo |
AaronGonzalez | 0:46d20fd2b120 | 35 | if (header > head_L && header < head_H) goto seguir; //verificar que este en la tolerancia +-20%, si el header es mayor que el tiempo en alto, y si el header es menor que el tiempo en bajo |
AaronGonzalez | 0:46d20fd2b120 | 36 | else goto ini1; //vuelva a la función |
AaronGonzalez | 0:46d20fd2b120 | 37 | |
AaronGonzalez | 0:46d20fd2b120 | 38 | seguir: |
AaronGonzalez | 0:46d20fd2b120 | 39 | //leo los datos de la trama y se meten a un arreglo |
AaronGonzalez | 0:46d20fd2b120 | 40 | wait_us(5000); //tiempo de espera |
AaronGonzalez | 0:46d20fd2b120 | 41 | for(i=0;i<(num_bits-1);++i){ // POR OSCILOSCOPIO se determina que llegan (num_bits),datos |
AaronGonzalez | 0:46d20fd2b120 | 42 | dato = irda.read_high_us(); //leer un bit de datos que es un pulso arriba en este control |
AaronGonzalez | 0:46d20fd2b120 | 43 | num[i]=dato; //asignación para construir el arreglo |
AaronGonzalez | 0:46d20fd2b120 | 44 | wait_us(500); |
AaronGonzalez | 0:46d20fd2b120 | 45 | } |
AaronGonzalez | 0:46d20fd2b120 | 46 | |
AaronGonzalez | 0:46d20fd2b120 | 47 | wait(0.5); //espero antes de leer todo el arreglo y ponerlo en pantalla |
AaronGonzalez | 0:46d20fd2b120 | 48 | pc.printf(",%d",header); //imprime en pantalla el header (pulso) |
AaronGonzalez | 0:46d20fd2b120 | 49 | for(i=0;i<(num_bits-1);++i){ //Lee caracter por caracter del arreglo |
AaronGonzalez | 0:46d20fd2b120 | 50 | pc.printf(",%d",num[i]); //imprime el arreglo construido |
AaronGonzalez | 0:46d20fd2b120 | 51 | } |
AaronGonzalez | 0:46d20fd2b120 | 52 | |
AaronGonzalez | 0:46d20fd2b120 | 53 | wait(0.1); //espero antes de imprimir el arreglo en binario |
AaronGonzalez | 0:46d20fd2b120 | 54 | pc.printf(" \n\n "); //imprimo en binario |
AaronGonzalez | 0:46d20fd2b120 | 55 | for(i=0;i<(num_bits-1);++i){ //Ciclo para leer los datos que llegan |
AaronGonzalez | 0:46d20fd2b120 | 56 | if(num[i] >((T_alto+T_bajo)/2)){ //si el arreglo es mayor que el promedio de tiempo de las cabeceras del arreglo del botón de encendido |
AaronGonzalez | 0:46d20fd2b120 | 57 | pc.printf("1"); //imprimo 1 en pantalla |
AaronGonzalez | 0:46d20fd2b120 | 58 | aux[i]=1; //Ponemos en 1 el arreglo |
AaronGonzalez | 0:46d20fd2b120 | 59 | } |
AaronGonzalez | 0:46d20fd2b120 | 60 | else { |
AaronGonzalez | 0:46d20fd2b120 | 61 | pc.printf("0"); //Si num[i] no cumple esta condición, se imprime 0 en pantalla |
AaronGonzalez | 0:46d20fd2b120 | 62 | aux[i]=0; //Ponemos en cero el arreglo de 32 bits |
AaronGonzalez | 0:46d20fd2b120 | 63 | } |
AaronGonzalez | 0:46d20fd2b120 | 64 | } |
AaronGonzalez | 0:46d20fd2b120 | 65 | for(i=0;i<(num_bits-1);++i){ //Lectura de los caracteres del arreglo auxiliar |
AaronGonzalez | 0:46d20fd2b120 | 66 | pc.printf("%d",aux[i]); //imprime el arreglo auxiliar |
AaronGonzalez | 0:46d20fd2b120 | 67 | } |
AaronGonzalez | 0:46d20fd2b120 | 68 | //Se usará una interrupción, la cual determinará si existen caracteres distintos entre las dos cadenas (encendido y cadena enviada por el control) por medio de la desactivación |
AaronGonzalez | 0:46d20fd2b120 | 69 | //de una bandera, si algún caracter es diferente... |
AaronGonzalez | 0:46d20fd2b120 | 70 | flag1=1; //Bandera en alto |
AaronGonzalez | 0:46d20fd2b120 | 71 | for(i=0; i<31; ++i) //Lectura de caracteres |
AaronGonzalez | 0:46d20fd2b120 | 72 | { |
AaronGonzalez | 0:46d20fd2b120 | 73 | if(aux[i]!=power[i]) //en caso de que un bit no coincida entre las dos cadenas |
AaronGonzalez | 0:46d20fd2b120 | 74 | { |
AaronGonzalez | 0:46d20fd2b120 | 75 | flag1=0; //Bandera en bajo |
AaronGonzalez | 0:46d20fd2b120 | 76 | } |
AaronGonzalez | 0:46d20fd2b120 | 77 | } |
AaronGonzalez | 0:46d20fd2b120 | 78 | //Se evaluará el estado de la bandera, si está en alto es porque la cadena enviada por el control es la correspondiente al botón de encendido |
AaronGonzalez | 0:46d20fd2b120 | 79 | //por tanto el LED se encenderá, esta salida representa la válvula que se desea abrir por 6 segundos. De lo contrario, si la bandera está en bajo |
AaronGonzalez | 0:46d20fd2b120 | 80 | //la válvula no se activará, debido a que se presionó un botón diferente al de encendido. |
AaronGonzalez | 0:46d20fd2b120 | 81 | if(flag1==1) //Si la bandera está e alto... |
AaronGonzalez | 0:46d20fd2b120 | 82 | { |
AaronGonzalez | 0:46d20fd2b120 | 83 | fflush( stdin ); //Limpia el buffer |
AaronGonzalez | 0:46d20fd2b120 | 84 | l0=1; //Activación de los LEDS, en el caso del LED de la placa FRDMKL25Z, cambiará de color |
AaronGonzalez | 0:46d20fd2b120 | 85 | l1=1; |
AaronGonzalez | 0:46d20fd2b120 | 86 | pc.printf(" ON");//Muestra en pantalla que se prendió |
AaronGonzalez | 0:46d20fd2b120 | 87 | wait(6); //Duración de activación de la válvula |
AaronGonzalez | 0:46d20fd2b120 | 88 | } |
AaronGonzalez | 0:46d20fd2b120 | 89 | else { |
AaronGonzalez | 0:46d20fd2b120 | 90 | fflush( stdin ); |
AaronGonzalez | 0:46d20fd2b120 | 91 | l0=0; //LEDS desactivados (orden suministrada por otro botón) |
AaronGonzalez | 0:46d20fd2b120 | 92 | l1=0; |
AaronGonzalez | 0:46d20fd2b120 | 93 | pc.printf(" OFF");//Muestra en pantalla que se apagó |
AaronGonzalez | 0:46d20fd2b120 | 94 | } |
AaronGonzalez | 0:46d20fd2b120 | 95 | } |
AaronGonzalez | 0:46d20fd2b120 | 96 | } |