Bomba sin recierres

Dependencies:   DebouncedIn PinDetect Pulse mbed

Revision:
1:8171657a1bcb
Parent:
0:2fd9acdd9076
Child:
2:fd581b4c5c70
--- a/main.cpp	Mon May 23 20:07:21 2016 +0000
+++ b/main.cpp	Fri May 27 02:09:54 2016 +0000
@@ -10,45 +10,49 @@
 DigitalOut LedVerde(LED2,off);
 DigitalOut LedRojo(LED1,off);
 DigitalOut LedAzul(LED3,off);
-DigitalOut bomba(PTA17); // Pin para activar la bomba
+//DigitalOut bomba(PTA17); // Pin para activar la bomba
 PulseInOut pulseIn(PTD4); // Generamos los pulsos
 
-DebouncedIn levelBalde(PTC17); // Sensor de nivel del balde
-DebouncedIn levelTanque(PTC16); // Sensor de nivel en el tanque de almacenamiento
+//DebouncedIn levelBalde(PTC17); // Sensor de nivel del balde
+//DebouncedIn levelTanque(PTC16); // Sensor de nivel en el tanque de almacenamiento
 AnalogIn input(PTC2);
 
 int cPulsos; // Cuenta los pulsos
 int limBmax = 5; // Límite de agua máximo en el balde. 50 cm.
 //int limBmin = 1; // Límite de agua mínimo en el balde. 10 cm
 int i, j, k, m, num;
+int bomba = 0; // Vamos a generar 3 ciclos de llenado del tanque. Al tercer ciclo, el balde quedará vacío y se deberá detectar de nuevo flujo.
+bool control = true; // Para terminar el programa.
 
 void pulsos() // Generación de pulsos
 {
-    pulseIn.write_us(0, 3000000);  // 3 segundos tiempo bajo
+    pulseIn.write_us(0, 200000);  // 200 ms tiempo bajo
     cPulsos++; // Cuenta cuando hay un flanco de bajada
-    pulseIn.write_us(1, 1000000); // 1 segundo arriba
+    pulseIn.write_us(1, 50000); // 50 ms  arriba
 }
 
-void sendData(float input){
+void sendData(float input)
+{
     wait(1);
-       num = input*1000;      //agrando el numero de cero a mil
-       GSM.putc(num);
-       pc.printf("num %d,data %f \r\n", num, input);
-       if(num < 256){           //debo generar dos casos a APP inventor solo me recibe hex asi: 0xhhhh (4 cifras)    
-           GSM.putc(0);     //si el numero es hasta 255 se le ponen dos ceros adelante a la secuencia de bits
-           GSM.putc(i);     //luego la cifra menos significativa
-           pc.printf("Cero: %d\r\n", 0);
-           pc.printf("m: %d\r\n", m);
-       }
-       if(num >255){          //pero si es mayor a 255 las cifras deben ser convertidas a un hex de dos bytes de la siguiente forma   
-          j = num/256;       //calculo la cifra mas significativa
-           k = num - j*256;     //calculo la cifra menos significativa
-           GSM.putc(j);   //las envio a la usart para que se las ponga al modulo bluetooth y la lleve al android
-           GSM.putc(k);   //mas significativa primero, menos despues si no no funciona!!! y con la orden PUTC solo asi le envia binarios
-           pc.printf("j: %d\r\n", j);
-           pc.printf("k: %d\r\n", k);
-       }
+    num = input*1000;      //agrando el numero de cero a mil
+    GSM.putc(num);
+    pc.printf("Nivel del tanque: %f [m].\r\n", input);
+    if(num < 256) {          //debo generar dos casos a APP inventor solo me recibe hex asi: 0xhhhh (4 cifras)
+        GSM.putc(0);     //si el numero es hasta 255 se le ponen dos ceros adelante a la secuencia de bits
+        GSM.putc(i);     //luego la cifra menos significativa
+        //pc.printf("Cero: %d\r\n", 0);
+        //pc.printf("m: %d\r\n", m);
     }
+    if(num >255) {         //pero si es mayor a 255 las cifras deben ser convertidas a un hex de dos bytes de la siguiente forma
+        j = num/256;       //calculo la cifra mas significativa
+        k = num - j*256;     //calculo la cifra menos significativa
+        GSM.putc(j);   //las envio a la usart para que se las ponga al modulo bluetooth y la lleve al android
+        GSM.putc(k);   //mas significativa primero, menos despues si no no funciona!!! y con la orden PUTC solo asi le envia binarios
+        //pc.printf("j: %d\r\n", j);
+        //pc.printf("k: %d\r\n", k);
+    }
+}
+
 
 int main()
 {
@@ -57,24 +61,25 @@
     wait(1);
     pc.printf("Ahorrador de agua\r\n");
     pc.printf("El programa se esta iniciando\r\n");
-    wait(1);
+    wait(0.2);
     LedVerde = on;
-    wait(1);
+    wait(0.2);
     LedVerde = off;
-    wait(1);
+    wait(0.2);
     LedRojo = on;
-    wait(1);
+    wait(0.2);
     LedRojo = off;
-    wait(1);
+    wait(0.2);
     LedAzul = on;
-    wait(1);
+    wait(0.2);
     LedAzul = off;
-    wait(1);
+    wait(0.2);
 
 
     // Inicia el ciclo
-    while(1) {
+    while(control) {
 waitPulse: // Acá leeríamos los pulsos
+
         for(i = 0; i <= 3; i++) {
             pulsos();
             pc.printf("Esperando senal de flujo...\r\n");
@@ -83,33 +88,74 @@
             } else goto waitPulse;
         }
 seguir:
-        cPulsos = 0;
-        pc.printf("\r\n");
-        pc.printf("El programa ha iniciado.\r\n");
-        LedVerde = on;
-        wait(1);
-        LedVerde = off;
-        //printf("Accionamos la bomba.\n");
-        //LedAzul = on; // Puede ser la bomba
-        goto llenarBalde;
+        bomba++;
+        if(bomba == 3) {
+            goto recierre;
+        } else {
+            cPulsos = 0;
+            pc.printf("\r\n");
+            pc.printf("Se detecta flujo.\r\n");
+            LedVerde = on;
+            wait(1);
+            LedVerde = off;
+            goto llenarBalde;
+        }
+
+
 
 llenarBalde: // Llenar balde donde está la bomba
-        i = 0;
-        while(i <= limBmax) { // Ciclo para llenar el balde
-            if(i == limBmax) {
+        int ii = 0;
+        while(ii <= limBmax) { // Ciclo para llenar el balde
+            if(ii == limBmax) {
                 pc.printf("El balde de almacenamiento se ha llenado. Se inicia el bombeo.\r\n");
                 goto llenarTanque;
-                
             } else {
                 pc.printf("Llenando balde\r\n");
                 wait(1);
-                i++;
             }
+            ii++;
         }
 
+
+recierre:
+        pc.printf("No hay agua para bombear al tanque.\r\n");
+        LedRojo = on;
+        wait(2);
+        LedRojo = off;
+        wait(2);
+
+        pc.printf("Digite f para detectar flujo, s para salir: ");
+        char v = pc.getc();
+
+        switch(v) {
+            case 'f':
+                bomba = 0;
+                goto waitPulse;
+                break;
+            case 's':
+                pc.printf("La bomba se apagara por seguridad.\r\n");
+                LedRojo = on;
+                wait(0.2);
+                LedVerde = on;
+                wait(0.2);
+                LedVerde = off;
+                wait(0.2);
+                LedRojo = on;
+                wait(0.2);
+                LedRojo = off;
+                wait(0.2);
+                LedAzul = on;
+                wait(0.2);
+                LedAzul = off;
+                wait(0.2);
+                control = false;
+                break;
+        }
+
+
 llenarTanque:
         float limTmax = 1;
-        for(float l = 0; l <= limTmax; l += 0.016666667) {
+        for(float l = 0; l <= limTmax; l += 0.1) {
             if (l == limTmax) { // Significa que se ha llenado el tanque y se debe alertar.
                 pc.printf("Se ha llenado el tanque. Abra la valvula del desague.\r\n");
                 goto final;
@@ -117,13 +163,36 @@
                 sendData(l); // Enviar dato a la aplicación de llenado de tanque
             }
         }
+
+
 final:
-        pc.printf("Salir.");
-        while(1) {
-            LedRojo = on;
-            wait(1);
-            LedRojo = off;
-            wait(1);
+        LedRojo = on;
+        wait(1);
+        LedRojo = off;
+        wait(1);
+
+        pc.printf("Digite 'a' para abrir la valvula del tanque: ");
+        //char c = pc.getc();
+        char c = 'a'; // Agilidad
+        pc.printf("\r\n");
+        pc.printf("Se inicia la descarga del tanque. \r\n");
+
+        LedVerde = on;
+        wait(1);
+        LedVerde = off;
+        wait(1);
+        
+        if(c == 'a') {
+            float limTmin = 0;
+            for(float l1 = 1; l1 >= limTmin; l1 -= 0.1) {
+                if (l1 == 0) { // Significa que se ha llenado el tanque y se debe alertar.
+                    pc.printf("Se ha liberado el tanque. Comprobando flujo...\r\n");
+                    wait(1);
+                    goto llenarBalde;
+                } else {
+                    sendData(l1); // Enviar dato a la aplicación de llenado de tanque
+                }
+            }
         }
     }
 }