Activación de válvula con control remoto

Dependencies:   Pulse1 mbed

/media/uploads/AaronGonzalez/20160520_071457.jpg

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?

UserRevisionLine numberNew 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 }