Bomba sin recierres
Dependencies: DebouncedIn PinDetect Pulse mbed
main.cpp
- Committer:
- sago104
- Date:
- 2016-05-31
- Revision:
- 2:fd581b4c5c70
- Parent:
- 1:8171657a1bcb
File content as of revision 2:fd581b4c5c70:
#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); DigitalOut LedAzul(LED3,off); //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 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, 200000); // 200 ms tiempo bajo cPulsos++; // Cuenta cuando hay un flanco de bajada pulseIn.write_us(1, 50000); // 50 ms arriba } 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("Ahorrador de agua\r\n"); pc.printf("El programa se esta iniciando\r\n"); 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); // Inicia el ciclo while(control) { waitPulse: // Acá leeríamos los pulsos for(i = 0; i <= 3; i++) { pulsos(); pc.printf("Esperando senal de flujo...\r\n"); if (cPulsos == 3) { goto seguir; } else goto waitPulse; } seguir: 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 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); } 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 el 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"); while(1){ LedRojo = on; wait(0.2); LedRojo = off; wait(0.2); } break; } llenarTanque: float limTmax = 1; for(float l = 0; l <= limTmax; l += 0.033333333) { 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; } else { sendData(l); // Enviar dato a la aplicación de llenado de tanque } } final: 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.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 llenarBalde; } else { sendData(l1); // Enviar dato a la aplicación de llenado de tanque } } } } }