Codigo para el control del flujo de una lavadora para luego llenar el tanque de un baño teniendo en cuenta el nivel de este y si hay o no flujo de la lavadora

Dependencies:   DebouncedIn PinDetect Pulse mbed

/media/uploads/gjusecheo/lavadorasaver.aia

main.cpp

Committer:
gjusecheo
Date:
2016-06-01
Revision:
0:1b3bf9dd7bbb

File content as of revision 0:1b3bf9dd7bbb:

#include "mbed.h"
#include <Pulse.h>
#include "DebouncedIn.h"
#define off 1
#define on 0

Serial pc(USBTX,USBRX); // Abre puerto serial
Serial GSM(PTE0,PTE1);

DigitalOut LedVerde(LED2,off);
DigitalOut LedRojo(LED1,off);

AnalogIn input(PTC2);
InterruptIn sw2(PTA13);

Timer t;  //Configura el timer

int tiempo;
int cPulsos; // Cuenta los pulsos
int Bmax = 1; // Límite de agua máximo del recipiente de la bomba
int i, j, k, m, num;
bool saver = true; // Para terminar el programa.

void sw2_release(void)  //esta me dispara el timer iniciando en 0.0000
{
    t.reset();
    t.start();
    i=0;                 //note que si i=0 es por que se dio pulso completo
}    
 
void sw2_pull(void)  //esta detiene el timer (primero) y luego lee el valor en microsegundos, con tiempo en valor entero
{
    t.stop();
    tiempo=t.read_us();
    
}

void sendData(float input)
{
    wait(1);
    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()
{
    GSM.baud(9600);   // asigno baudios y configuro puerto serie de la usart
    GSM.format(8,Serial::None,1);
    wait(1);
    pc.printf(" Iniciando WaterSaver\r\n");
 
    // Inicia el ciclo
    while(saver) {
waitPulse: // en esta parte se identifican los tiempo de los pulsos

          sw2.fall(&sw2_release);
          sw2.rise(&sw2_pull);
          wait(0.5);
          pc.printf("tiempo = %i\r\n",tiempo); 
          pc.printf("Esperando flujo de la lavadora...\r\n");
            if ((5000<=tiempo)) {
                goto comenzar;
            } else {
        goto waitPulse;
        }
comenzar:
          sw2.fall(&sw2_release);
          sw2.rise(&sw2_pull);
          pc.printf("tiempo = %i\r\n",tiempo); 
        if(tiempo<5000) {
            goto waitPulse;
        } else {
            cPulsos = 0;
            pc.printf("\r\n");
            pc.printf("Se detecta flujo.\r\n");
            LedVerde = on;
            goto llenar;
        }

llenar: // envia flujo a donde se encuentra la bomba para desplazar el agua al tanque principal
        int j = 0;
        while(j <= Bmax) { // Ciclo de en envio de fluido a la bomba principal
        
            if(j == Bmax) {
                pc.printf("Se debe prender la bomba.\r\n");
                goto Tanque;
            } else {
                pc.printf("Enviando flujo\r\n");
                wait(1);
            }
            j++;
        }

Tanque:
        float limax = 1;
        for(float l = 0; l <= limax; l += 0.033333333) {
            sw2.fall(&sw2_release); 
          sw2.rise(&sw2_pull);
          pc.printf("tiempo = %i\r\n",tiempo); 
        if(tiempo<5000) {
            goto waitPulse;
        }         
            
            
            if (l == limax) { // Significa que se ha llenado el tanque y se debe alertar.
                pc.printf("Se ha llenado el tanque. Favor abrir la valvula del desague.\r\n");
                goto desague;
            } else {
                sendData(l); // Enviar dato a la aplicación de llenado de tanque
            }
        }


desague:
        LedRojo = on;
        wait(1);
        LedRojo = off;
        wait(1);

pc.printf("tiempo = %i\r\n",tiempo); 

        pc.printf("presione 'v' 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");

        LedRojo = on;
               
        if(c == 'v') {
            float limTmin = 0;
            for(float l1 = 1; l1 >= limTmin; l1 -= 0.033333333) {
                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 llenar;
                } else {
                    sendData(l1); // Enviar dato a la aplicación de llenado de tanque
                }
            }
        }
    }
}