Bomba sin recierres

Dependencies:   DebouncedIn PinDetect Pulse mbed

Committer:
sago104
Date:
Tue May 31 16:50:45 2016 +0000
Revision:
2:fd581b4c5c70
Parent:
1:8171657a1bcb
Programa para ahorrar aguas grises.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sago104 0:2fd9acdd9076 1 #include "mbed.h"
sago104 0:2fd9acdd9076 2 #include <Pulse.h>
sago104 0:2fd9acdd9076 3 #include "DebouncedIn.h"
sago104 0:2fd9acdd9076 4 #define off 1
sago104 0:2fd9acdd9076 5 #define on 0
sago104 0:2fd9acdd9076 6
sago104 0:2fd9acdd9076 7 Serial pc(USBTX,USBRX); // Abre puerto serial
sago104 0:2fd9acdd9076 8 Serial GSM(PTE0,PTE1);
sago104 0:2fd9acdd9076 9
sago104 0:2fd9acdd9076 10 DigitalOut LedVerde(LED2,off);
sago104 0:2fd9acdd9076 11 DigitalOut LedRojo(LED1,off);
sago104 0:2fd9acdd9076 12 DigitalOut LedAzul(LED3,off);
sago104 1:8171657a1bcb 13 //DigitalOut bomba(PTA17); // Pin para activar la bomba
sago104 0:2fd9acdd9076 14 PulseInOut pulseIn(PTD4); // Generamos los pulsos
sago104 0:2fd9acdd9076 15
sago104 1:8171657a1bcb 16 //DebouncedIn levelBalde(PTC17); // Sensor de nivel del balde
sago104 1:8171657a1bcb 17 //DebouncedIn levelTanque(PTC16); // Sensor de nivel en el tanque de almacenamiento
sago104 0:2fd9acdd9076 18 AnalogIn input(PTC2);
sago104 0:2fd9acdd9076 19
sago104 0:2fd9acdd9076 20 int cPulsos; // Cuenta los pulsos
sago104 0:2fd9acdd9076 21 int limBmax = 5; // Límite de agua máximo en el balde. 50 cm.
sago104 0:2fd9acdd9076 22 //int limBmin = 1; // Límite de agua mínimo en el balde. 10 cm
sago104 0:2fd9acdd9076 23 int i, j, k, m, num;
sago104 1:8171657a1bcb 24 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.
sago104 1:8171657a1bcb 25 bool control = true; // Para terminar el programa.
sago104 0:2fd9acdd9076 26
sago104 0:2fd9acdd9076 27 void pulsos() // Generación de pulsos
sago104 0:2fd9acdd9076 28 {
sago104 1:8171657a1bcb 29 pulseIn.write_us(0, 200000); // 200 ms tiempo bajo
sago104 0:2fd9acdd9076 30 cPulsos++; // Cuenta cuando hay un flanco de bajada
sago104 1:8171657a1bcb 31 pulseIn.write_us(1, 50000); // 50 ms arriba
sago104 0:2fd9acdd9076 32 }
sago104 0:2fd9acdd9076 33
sago104 1:8171657a1bcb 34 void sendData(float input)
sago104 1:8171657a1bcb 35 {
sago104 0:2fd9acdd9076 36 wait(1);
sago104 1:8171657a1bcb 37 num = input*1000; //agrando el numero de cero a mil
sago104 1:8171657a1bcb 38 GSM.putc(num);
sago104 1:8171657a1bcb 39 pc.printf("Nivel del tanque: %f [m].\r\n", input);
sago104 1:8171657a1bcb 40 if(num < 256) { //debo generar dos casos a APP inventor solo me recibe hex asi: 0xhhhh (4 cifras)
sago104 1:8171657a1bcb 41 GSM.putc(0); //si el numero es hasta 255 se le ponen dos ceros adelante a la secuencia de bits
sago104 1:8171657a1bcb 42 GSM.putc(i); //luego la cifra menos significativa
sago104 1:8171657a1bcb 43 //pc.printf("Cero: %d\r\n", 0);
sago104 1:8171657a1bcb 44 //pc.printf("m: %d\r\n", m);
sago104 0:2fd9acdd9076 45 }
sago104 1:8171657a1bcb 46 if(num >255) { //pero si es mayor a 255 las cifras deben ser convertidas a un hex de dos bytes de la siguiente forma
sago104 1:8171657a1bcb 47 j = num/256; //calculo la cifra mas significativa
sago104 1:8171657a1bcb 48 k = num - j*256; //calculo la cifra menos significativa
sago104 1:8171657a1bcb 49 GSM.putc(j); //las envio a la usart para que se las ponga al modulo bluetooth y la lleve al android
sago104 1:8171657a1bcb 50 GSM.putc(k); //mas significativa primero, menos despues si no no funciona!!! y con la orden PUTC solo asi le envia binarios
sago104 1:8171657a1bcb 51 //pc.printf("j: %d\r\n", j);
sago104 1:8171657a1bcb 52 //pc.printf("k: %d\r\n", k);
sago104 1:8171657a1bcb 53 }
sago104 1:8171657a1bcb 54 }
sago104 1:8171657a1bcb 55
sago104 0:2fd9acdd9076 56
sago104 0:2fd9acdd9076 57 int main()
sago104 0:2fd9acdd9076 58 {
sago104 0:2fd9acdd9076 59 GSM.baud(9600); // asigno baudios y configuro puerto serie de la usart
sago104 0:2fd9acdd9076 60 GSM.format(8,Serial::None,1);
sago104 0:2fd9acdd9076 61 wait(1);
sago104 0:2fd9acdd9076 62 pc.printf("Ahorrador de agua\r\n");
sago104 0:2fd9acdd9076 63 pc.printf("El programa se esta iniciando\r\n");
sago104 1:8171657a1bcb 64 wait(0.2);
sago104 0:2fd9acdd9076 65 LedVerde = on;
sago104 1:8171657a1bcb 66 wait(0.2);
sago104 0:2fd9acdd9076 67 LedVerde = off;
sago104 1:8171657a1bcb 68 wait(0.2);
sago104 0:2fd9acdd9076 69 LedRojo = on;
sago104 1:8171657a1bcb 70 wait(0.2);
sago104 0:2fd9acdd9076 71 LedRojo = off;
sago104 1:8171657a1bcb 72 wait(0.2);
sago104 0:2fd9acdd9076 73 LedAzul = on;
sago104 1:8171657a1bcb 74 wait(0.2);
sago104 0:2fd9acdd9076 75 LedAzul = off;
sago104 1:8171657a1bcb 76 wait(0.2);
sago104 0:2fd9acdd9076 77
sago104 0:2fd9acdd9076 78
sago104 0:2fd9acdd9076 79 // Inicia el ciclo
sago104 1:8171657a1bcb 80 while(control) {
sago104 0:2fd9acdd9076 81 waitPulse: // Acá leeríamos los pulsos
sago104 1:8171657a1bcb 82
sago104 0:2fd9acdd9076 83 for(i = 0; i <= 3; i++) {
sago104 0:2fd9acdd9076 84 pulsos();
sago104 0:2fd9acdd9076 85 pc.printf("Esperando senal de flujo...\r\n");
sago104 0:2fd9acdd9076 86 if (cPulsos == 3) {
sago104 0:2fd9acdd9076 87 goto seguir;
sago104 0:2fd9acdd9076 88 } else goto waitPulse;
sago104 0:2fd9acdd9076 89 }
sago104 0:2fd9acdd9076 90 seguir:
sago104 1:8171657a1bcb 91 bomba++;
sago104 1:8171657a1bcb 92 if(bomba == 3) {
sago104 1:8171657a1bcb 93 goto recierre;
sago104 1:8171657a1bcb 94 } else {
sago104 1:8171657a1bcb 95 cPulsos = 0;
sago104 1:8171657a1bcb 96 pc.printf("\r\n");
sago104 1:8171657a1bcb 97 pc.printf("Se detecta flujo.\r\n");
sago104 1:8171657a1bcb 98 LedVerde = on;
sago104 1:8171657a1bcb 99 wait(1);
sago104 1:8171657a1bcb 100 LedVerde = off;
sago104 1:8171657a1bcb 101 goto llenarBalde;
sago104 1:8171657a1bcb 102 }
sago104 1:8171657a1bcb 103
sago104 1:8171657a1bcb 104
sago104 0:2fd9acdd9076 105
sago104 0:2fd9acdd9076 106 llenarBalde: // Llenar balde donde está la bomba
sago104 1:8171657a1bcb 107 int ii = 0;
sago104 1:8171657a1bcb 108 while(ii <= limBmax) { // Ciclo para llenar el balde
sago104 1:8171657a1bcb 109 if(ii == limBmax) {
sago104 0:2fd9acdd9076 110 pc.printf("El balde de almacenamiento se ha llenado. Se inicia el bombeo.\r\n");
sago104 0:2fd9acdd9076 111 goto llenarTanque;
sago104 0:2fd9acdd9076 112 } else {
sago104 0:2fd9acdd9076 113 pc.printf("Llenando balde\r\n");
sago104 0:2fd9acdd9076 114 wait(1);
sago104 0:2fd9acdd9076 115 }
sago104 1:8171657a1bcb 116 ii++;
sago104 0:2fd9acdd9076 117 }
sago104 0:2fd9acdd9076 118
sago104 1:8171657a1bcb 119
sago104 1:8171657a1bcb 120 recierre:
sago104 1:8171657a1bcb 121 pc.printf("No hay agua para bombear al tanque.\r\n");
sago104 1:8171657a1bcb 122 LedRojo = on;
sago104 1:8171657a1bcb 123 wait(2);
sago104 1:8171657a1bcb 124 LedRojo = off;
sago104 1:8171657a1bcb 125 wait(2);
sago104 1:8171657a1bcb 126
sago104 2:fd581b4c5c70 127 pc.printf("Digite f para detectar el flujo, s para salir: ");
sago104 1:8171657a1bcb 128 char v = pc.getc();
sago104 1:8171657a1bcb 129
sago104 1:8171657a1bcb 130 switch(v) {
sago104 1:8171657a1bcb 131 case 'f':
sago104 1:8171657a1bcb 132 bomba = 0;
sago104 1:8171657a1bcb 133 goto waitPulse;
sago104 1:8171657a1bcb 134 break;
sago104 1:8171657a1bcb 135 case 's':
sago104 1:8171657a1bcb 136 pc.printf("La bomba se apagara por seguridad.\r\n");
sago104 2:fd581b4c5c70 137 while(1){
sago104 1:8171657a1bcb 138 LedRojo = on;
sago104 1:8171657a1bcb 139 wait(0.2);
sago104 1:8171657a1bcb 140 LedRojo = off;
sago104 1:8171657a1bcb 141 wait(0.2);
sago104 2:fd581b4c5c70 142 }
sago104 1:8171657a1bcb 143 break;
sago104 1:8171657a1bcb 144 }
sago104 1:8171657a1bcb 145
sago104 1:8171657a1bcb 146
sago104 0:2fd9acdd9076 147 llenarTanque:
sago104 0:2fd9acdd9076 148 float limTmax = 1;
sago104 2:fd581b4c5c70 149 for(float l = 0; l <= limTmax; l += 0.033333333) {
sago104 0:2fd9acdd9076 150 if (l == limTmax) { // Significa que se ha llenado el tanque y se debe alertar.
sago104 0:2fd9acdd9076 151 pc.printf("Se ha llenado el tanque. Abra la valvula del desague.\r\n");
sago104 0:2fd9acdd9076 152 goto final;
sago104 0:2fd9acdd9076 153 } else {
sago104 0:2fd9acdd9076 154 sendData(l); // Enviar dato a la aplicación de llenado de tanque
sago104 0:2fd9acdd9076 155 }
sago104 0:2fd9acdd9076 156 }
sago104 1:8171657a1bcb 157
sago104 1:8171657a1bcb 158
sago104 0:2fd9acdd9076 159 final:
sago104 1:8171657a1bcb 160 LedRojo = on;
sago104 1:8171657a1bcb 161 wait(1);
sago104 1:8171657a1bcb 162 LedRojo = off;
sago104 1:8171657a1bcb 163 wait(1);
sago104 1:8171657a1bcb 164
sago104 1:8171657a1bcb 165 pc.printf("Digite 'a' para abrir la valvula del tanque: ");
sago104 2:fd581b4c5c70 166 char c = pc.getc();
sago104 2:fd581b4c5c70 167 //char c = 'a'; // Agilidad
sago104 1:8171657a1bcb 168 pc.printf("\r\n");
sago104 1:8171657a1bcb 169 pc.printf("Se inicia la descarga del tanque. \r\n");
sago104 1:8171657a1bcb 170
sago104 1:8171657a1bcb 171 LedVerde = on;
sago104 1:8171657a1bcb 172 wait(1);
sago104 1:8171657a1bcb 173 LedVerde = off;
sago104 1:8171657a1bcb 174 wait(1);
sago104 1:8171657a1bcb 175
sago104 1:8171657a1bcb 176 if(c == 'a') {
sago104 1:8171657a1bcb 177 float limTmin = 0;
sago104 2:fd581b4c5c70 178 for(float l1 = 1; l1 >= limTmin; l1 -= 0.033333333) {
sago104 1:8171657a1bcb 179 if (l1 == 0) { // Significa que se ha llenado el tanque y se debe alertar.
sago104 1:8171657a1bcb 180 pc.printf("Se ha liberado el tanque. Comprobando flujo...\r\n");
sago104 1:8171657a1bcb 181 wait(1);
sago104 1:8171657a1bcb 182 goto llenarBalde;
sago104 1:8171657a1bcb 183 } else {
sago104 1:8171657a1bcb 184 sendData(l1); // Enviar dato a la aplicación de llenado de tanque
sago104 1:8171657a1bcb 185 }
sago104 1:8171657a1bcb 186 }
sago104 0:2fd9acdd9076 187 }
sago104 0:2fd9acdd9076 188 }
sago104 0:2fd9acdd9076 189 }
sago104 0:2fd9acdd9076 190
sago104 0:2fd9acdd9076 191