Programa para llenar un tanque de una cisterna por medio de un control de cámara sony. el sistema puede emitir sonidos por medio de un módulo de voz de Parallax EMIC.

Dependencies:   Pulse1 mbed

Fork of Sanitario_IRDA by Gustavo Ramirez

Revision:
7:79b0dc5d537e
Parent:
6:8cc9f4849678
--- a/main.cpp	Tue Apr 26 08:58:19 2016 +0000
+++ b/main.cpp	Thu May 05 06:34:08 2016 +0000
@@ -4,12 +4,19 @@
 //control remoto sony disparo camara
 //puede convertir la trama en un entero
 //para cualquier tecla
+InterruptIn H2O(PTA13);//sensor de pulsos
 PulseInOut irda(PTD5);// en este puerto se pone el sensor infrarrojo
 Serial pc(USBTX, USBRX);
-DigitalOut led(LED1);
-DigitalOut dir(PTA1);
-DigitalOut breake(PTA2);
-DigitalOut led2(LED2);
+//DigitalOut ledrojo(LED3);
+//DigitalOut ledverde(LED2);
+//DigitalOut ledazul(LED1);
+DigitalOut LedVerde(PTE4);//leds sobre la FRDMKL25Z
+DigitalOut LedRojo(PTE2);
+DigitalOut LedAzul(PTE5);
+
+DigitalOut dir(PTD6);  //puerto dem puente H
+DigitalOut breake(PTD7);//puerto del puente H
+Timer t;  //Configura el timer
 int header =0; //tiempo de cabecera pulso abajo
 const int head_H = 2976; //+10% medida con osciloscopio en microsegundos
 const int head_L = 1984;//-10%  medida con osciloscopio
@@ -19,38 +26,73 @@
 const int num_bits = 20;//ponga su numero de bits
 int num[num_bits];//cadena para almacenar todos los tiempos que conforman los bits de datos
 int dato; // tiempo de cada dato que se lee
+int tiempo,j,f,k;
 int numero;
 int binM[20];
 int bin_max[20];
-Serial GSM(PTE0,PTE1);  //puertos del FRDM para el modem
-//GSM.printf("AT+CMGL=0\n\r"); 
+Serial GSM(PTE0,PTE1);  //puertos del FRDM para el modulo de voz Emic 2 (parallax) pasa de texto a voz
+
+//***********************configuro funciones que seran llamadas por las interupciones******************************************
+//que se disparan con los dos flancos de los pulsos del sensor de flujo de agua*****************
+
+void H2O_Cae(void)  //esta me dispara el timer iniciando en 0.0000, se llama con el flanco de caida
+{
+    t.reset();
+    t.start();
+    i=0;                 //note que si i=0 es por que se dio pulso completo
+}    
 
+void H2O_Sube(void)  //esta detiene el timer (primero) y luego lee el valor en microsegundos, con tiempo en valor entero
+{
+    t.stop();
+    tiempo=t.read_us();
+    
+}
+
+//*********************************************Inicia el programa principal****************************************************
 int main(){
+LedAzul=1;
+LedVerde=1;
+LedRojo=1;
+LedAzul=0;
+__disable_irq();  // inabilito interupciones 
 GSM.baud(9600);
-GSM.format(8,Serial::None,1);     
-breake=0;
-dir=0;
-wait(4);  
-breake=1;  
+GSM.format(8,Serial::None,1);//formato de la comunicacion serie     
+breake=0;  //cero es moverse (sin freno)
+dir=0;    //direccion de cerrado
+wait(5);  //hay que esperar 
+breake=1; //frenarse
+LedAzul=1;
+LedRojo=0; 
+//*************se indaga por las posibles interupciones********************************************************************
+    H2O.fall(&H2O_Cae);
+    H2O.rise(&H2O_Sube);
+//************************************se configura la parte ciclica del programa puede ser un ciclo inutil***idle cycle****
+    GSM.printf("N1\r\n"); //comando del modulo emic2
+    wait(1);//espero un poco
+    GSM.printf("W230\r\n");//comando del modulo emic2
+    wait(1);
+    GSM.printf("L2\r\n");//comando del moduloemic2
+    wait(1);          
+    tiempo=0; //hacerlo cero para, evitar releerlo
+    
 while(1){
-ini1: fflush( stdin );
-      header=0;
-      led2=1;
-      led=1;
+      
+ini1: fflush( stdin ); //borrar bufer serial por si toca leer cadenas
+      header=0;//cabecera en cero
       header = irda.read_low_us();    //funcion para leer un pulso de caida o bajo en header
       if (header > head_L && header < head_H) goto seguir;//verificar que este en la tolerancia +-20%
-      else goto ini1;
-      
+      goto ini1;  
 seguir:
-       //leo los datos de la trama y se meten a un arreglo
+      LedVerde=0;
+      //leo los datos de la trama y se meten a un arreglo
       wait_us(40);// ES EL TIEMPO DE HEADER QUE NO SE Lee O EL ALTO 
-      led2=1;
       for(i=0;i<(num_bits-1);++i){ // POR OSCILOSCOPIO se determina que llegan (num_bits),datos
       dato = irda.read_low_us(); //leer un bit de datos que es pulso arriba en este control
       num[i]=dato;
-      wait_us(400);   
+      wait_us(400);//insero algo de tiempo entre bits para rechazar ruido   
       }
-      wait(0.5); //espero un poquito luego de leer todo el arreglo y ponerlo en pantalla 
+      wait(0.1); //espero un poquito luego de leer todo el arreglo y ponerlo en pantalla 
       //pc.printf(",%d",header);
       for(i=0;i<(num_bits-1);++i){  
       //pc.printf(",%d",num[i]);
@@ -78,42 +120,86 @@
              
       }
       pc.printf("numero=%d",numero);
-      if (numero==466221){
-          led2=0;
-          wait(1);
-          led2=1;
-          GSM.printf("N1\r\n");
-          wait(1);
-          GSM.printf("W230\r\n");
-          wait(1);
-          GSM.printf("L2\r\n");
-          wait(1);          
-          breake=0;
+      if (numero==466221){//si el codigo es el esperado inicio apertura de la valvula y mensajes de voz
+          LedVerde=0;
+          LedRojo=1;
+          breake=0; //abro la valvula
           dir=1;//abrir
-          wait(4);//esperar que abra
-          breake=1;//parar
-          GSM.printf("S se inicia llenado del tanque\r\n"); 
-          wait(70);//espera que llene
-          dir=0;//CERRAR
-          breake=0;
-          wait(4);//esperar que cierre
+          wait(4);//esperar que abra y paro la valvula
           breake=1;//parar
-          GSM.printf("Sel tanque esta lleno\r\n");           
-          wait(3);
-          GSM.printf("Spuede vaciar el sanitario\r\n");  
-          wait(3);         
-          GSM.printf("Sno olvide\r\n");  
-          wait(4);
-          GSM.printf("Srecuerde que JA JA JA JA JA\r\n");  
-          wait(2);         
-          wait(2);         
+          GSM.printf("S se inicia llenado del tanque\r\n");
+          wait(6); // espero un poco la respuesta estable del sensor de flujo 
+          __enable_irq();  // Habilito interupciones  
+                  
+          //*****en esta situacion hay que esta indagando por los pulsos de flujo para dar 
+          // alarma si estos faltan que es indicio de que no pasa agua al tanque o eñll agua se ha acabado
+          // en este caso toca cerar la valvula de inmediato.
+          
+lop2:     i++;  //usa la variable i para detectar perdida de pulsos si i crece es por que se perdieron
+          wait_ms(400);
+          pc.printf("Tus=%d,Perdidos=%d\n",tiempo,i);//para hacer debugging con la pc
+               if(i>4){//umbral de reaccion de perdida de pulsos
+                       //si no hay pulsos y la valvula esta ompletamente abierta es por que 
+                       //se acabo el agua o no baja del tanque
+                       //cerrar la valvula inmediaramente y emitir mensaje de voz
+                       GSM.printf("Shay problemas\r\n");
+                       wait(2);
+                       GSM.printf("Shay problemas\r\n");
+                       wait(2);
+                       GSM.printf("Sel agua se ha agotado   o   hay taponamiento\r\n");
+                       wait(5);
+                       GSM.printf("se va a cerrar la valvula de nuevo\r\n");
+                       breake=0;
+                       dir=0;//direccion de cerrado
+                       LedVerde=1;
+                       LedRojo=0;
+                       wait(5);  //esperamos a que se cierre y inabilitamos las interupciones para dar cabida 
+                       //sin molestias de los pulsos IRDA          
+                       breake=1;
+                       i=4;
+                       __disable_irq();  // desabilito interupciones    
+                       tiempo=0;
+                       goto ini1;
+                       
+                      }
+                      
+                      else{  //no hacer nada todo esta normal
+                      LedVerde=0;
+                      LedRojo=1;
+                      LedAzul=1;
+                      k++;// cuenta ciclos de 1 ms para ajustar temporizacion
+                      wait_ms(450);//espera que llene
+                      if (k>70) goto cerrarOK;
+                      LedVerde=0;
+                      LedRojo=1;
+                      goto lop2;
+            cerrarOK: __disable_irq();    // Disable Interrupts
+                      dir=0;//CERRAR
+                      k=0;
+                      breake=0;
+                      LedVerde=1;
+                      LedRojo=0;
+                      wait(5);//esperar que cierre
+                      breake=1;//parar
+                      GSM.printf("Sel tanque esta lleno\r\n");           
+                      wait(3);
+                      GSM.printf("Spuede vaciar el sanitario\r\n");  
+                      wait(3);         
+                      GSM.printf("Sno olvide limpiarse muy bien su trasero\r\n");  
+                      wait(4);
+                      GSM.printf("Srecuerde que lo estoy viendo ja ja ja ja ja ja ja ja\r\n");  
+                      goto ini1;
+                      } //i>3
+          }//chequeo numero
+          
+          //chequeo el oro numero
+      if (numero==466231){
+          LedAzul=0;
+          wait(2);
+          LedAzul=1;
           goto ini1;
-          }
-      if (numero==466231){
-          led=0;
-          wait(2);
-          led=1;
-          goto ini1;
-          }    
-      }
-      }
\ No newline at end of file
+                         }
+                             
+      //*****************************************
+      }  // while
+      } //main
\ No newline at end of file