Bomba sin recierres
Dependencies: DebouncedIn PinDetect Pulse mbed
Diff: main.cpp
- 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 + } + } } } }