Activación de válvula con control remoto

Dependencies:   Pulse1 mbed

/media/uploads/AaronGonzalez/20160520_071457.jpg

Revision:
0:46d20fd2b120
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Fri May 20 12:38:50 2016 +0000
@@ -0,0 +1,96 @@
+#include "mbed.h"
+#include <pulse1.h>
+#include <string.h>
+//Tarea de automatización de válvula para sanitario
+PulseInOut irda(PTD5);          // Entrada del sensor infrarojo
+Serial pc(USBTX, USBRX);        // módulos de transmisión y recepción
+PwmOut l0(PTD0);                // pin de activación de la válvula
+DigitalOut l1(LED1);
+ 
+int header =0;                  //Cabecera inicial en cero
+//Tiempo de cabecera de subida y bajada - 4520
+const int head_H = 5424;        //+20% medida con osciloscopio en microsegundos
+const int head_L = 3616;        //-20%  medida con osciloscopio
+int i=0;
+const int T_alto = 1680;        //ponga su tiempo de la prueba
+const int T_bajo = 560;         //ponga su tiempo de la prueba
+const int num_bits = 32;        //ponga su numero de bits
+int num[num_bits];              //cadena para almacenar todos los tiempos que conforman los bits de datos
+int aux[num_bits];              //Cadena auxiliar a comparar
+int dato,prender,flag1;           
+
+// Secuencia de encendido entregada por el botón POWER del control  
+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};
+ 
+int main(){
+ 
+    while(1){
+ 
+ini1: 
+        fflush( stdin );                //sirve para limpiar el buffer de entrada de teclado
+        header=0;                       //cabecera inicial en cero
+        l0=0;                           //LED's apagados inicialmente
+        l1=0;                           
+        header = irda.read_low_us();    //funcion para leer un pulso de caida o bajo
+        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
+        else goto ini1;                 //vuelva a la función
+ 
+seguir:
+        //leo los datos de la trama y se meten a un arreglo
+        wait_us(5000);                  //tiempo de espera 
+        for(i=0;i<(num_bits-1);++i){   // POR OSCILOSCOPIO se determina que llegan (num_bits),datos
+            dato = irda.read_high_us();   //leer un bit de datos que es un pulso arriba en este control
+            num[i]=dato;                //asignación para construir el arreglo
+            wait_us(500);   
+        }
+        
+        wait(0.5);                      //espero antes de leer todo el arreglo y ponerlo en pantalla 
+        pc.printf(",%d",header);        //imprime en pantalla el header (pulso)
+        for(i=0;i<(num_bits-1);++i){    //Lee caracter por caracter del arreglo
+            pc.printf(",%d",num[i]);     //imprime el arreglo construido
+        }
+        
+        wait(0.1);                      //espero antes de imprimir el arreglo en binario
+        pc.printf("     \n\n     ");                //imprimo en binario
+        for(i=0;i<(num_bits-1);++i){                //Ciclo para leer los datos que llegan
+            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
+                 pc.printf("1");                    //imprimo 1 en pantalla
+                 aux[i]=1;                          //Ponemos en 1 el arreglo
+            }
+            else { 
+            pc.printf("0");         //Si num[i] no cumple esta condición, se imprime 0 en pantalla
+            aux[i]=0;               //Ponemos en cero el arreglo de 32 bits
+            }
+        }
+        for(i=0;i<(num_bits-1);++i){  //Lectura de los caracteres del arreglo auxiliar
+            pc.printf("%d",aux[i]);     //imprime el arreglo auxiliar
+        }
+//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
+//de una bandera, si algún caracter es diferente...
+        flag1=1;                //Bandera en alto
+        for(i=0; i<31; ++i)     //Lectura de caracteres
+        {
+            if(aux[i]!=power[i]) //en caso de que un bit no coincida entre las dos cadenas
+            {
+                flag1=0;                    //Bandera en bajo
+            }   
+        }
+//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
+//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
+//la válvula no se activará, debido a que se presionó un botón diferente al de encendido.
+        if(flag1==1)            //Si la bandera está e alto...
+        {
+            fflush( stdin );        //Limpia el buffer
+            l0=1;                   //Activación de los LEDS, en el caso del LED de la placa FRDMKL25Z, cambiará de color
+            l1=1;                   
+            pc.printf("  ON");//Muestra en pantalla que se prendió        
+            wait(6);                //Duración de activación de la válvula
+        }
+        else { 
+            fflush( stdin );
+            l0=0;                   //LEDS desactivados (orden suministrada por otro botón)
+            l1=0;
+            pc.printf("   OFF");//Muestra en pantalla que se apagó
+        }
+    }
+}