Bomba sin recierres
Dependencies: DebouncedIn PinDetect Pulse mbed
main.cpp@1:8171657a1bcb, 2016-05-27 (annotated)
- Committer:
- sago104
- Date:
- Fri May 27 02:09:54 2016 +0000
- Revision:
- 1:8171657a1bcb
- Parent:
- 0:2fd9acdd9076
- Child:
- 2:fd581b4c5c70
Bomba con recierre
Who changed what in which revision?
User | Revision | Line number | New 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 | 1:8171657a1bcb | 127 | pc.printf("Digite f para detectar 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 | 1:8171657a1bcb | 137 | LedRojo = on; |
sago104 | 1:8171657a1bcb | 138 | wait(0.2); |
sago104 | 1:8171657a1bcb | 139 | LedVerde = on; |
sago104 | 1:8171657a1bcb | 140 | wait(0.2); |
sago104 | 1:8171657a1bcb | 141 | LedVerde = off; |
sago104 | 1:8171657a1bcb | 142 | wait(0.2); |
sago104 | 1:8171657a1bcb | 143 | LedRojo = on; |
sago104 | 1:8171657a1bcb | 144 | wait(0.2); |
sago104 | 1:8171657a1bcb | 145 | LedRojo = off; |
sago104 | 1:8171657a1bcb | 146 | wait(0.2); |
sago104 | 1:8171657a1bcb | 147 | LedAzul = on; |
sago104 | 1:8171657a1bcb | 148 | wait(0.2); |
sago104 | 1:8171657a1bcb | 149 | LedAzul = off; |
sago104 | 1:8171657a1bcb | 150 | wait(0.2); |
sago104 | 1:8171657a1bcb | 151 | control = false; |
sago104 | 1:8171657a1bcb | 152 | break; |
sago104 | 1:8171657a1bcb | 153 | } |
sago104 | 1:8171657a1bcb | 154 | |
sago104 | 1:8171657a1bcb | 155 | |
sago104 | 0:2fd9acdd9076 | 156 | llenarTanque: |
sago104 | 0:2fd9acdd9076 | 157 | float limTmax = 1; |
sago104 | 1:8171657a1bcb | 158 | for(float l = 0; l <= limTmax; l += 0.1) { |
sago104 | 0:2fd9acdd9076 | 159 | if (l == limTmax) { // Significa que se ha llenado el tanque y se debe alertar. |
sago104 | 0:2fd9acdd9076 | 160 | pc.printf("Se ha llenado el tanque. Abra la valvula del desague.\r\n"); |
sago104 | 0:2fd9acdd9076 | 161 | goto final; |
sago104 | 0:2fd9acdd9076 | 162 | } else { |
sago104 | 0:2fd9acdd9076 | 163 | sendData(l); // Enviar dato a la aplicación de llenado de tanque |
sago104 | 0:2fd9acdd9076 | 164 | } |
sago104 | 0:2fd9acdd9076 | 165 | } |
sago104 | 1:8171657a1bcb | 166 | |
sago104 | 1:8171657a1bcb | 167 | |
sago104 | 0:2fd9acdd9076 | 168 | final: |
sago104 | 1:8171657a1bcb | 169 | LedRojo = on; |
sago104 | 1:8171657a1bcb | 170 | wait(1); |
sago104 | 1:8171657a1bcb | 171 | LedRojo = off; |
sago104 | 1:8171657a1bcb | 172 | wait(1); |
sago104 | 1:8171657a1bcb | 173 | |
sago104 | 1:8171657a1bcb | 174 | pc.printf("Digite 'a' para abrir la valvula del tanque: "); |
sago104 | 1:8171657a1bcb | 175 | //char c = pc.getc(); |
sago104 | 1:8171657a1bcb | 176 | char c = 'a'; // Agilidad |
sago104 | 1:8171657a1bcb | 177 | pc.printf("\r\n"); |
sago104 | 1:8171657a1bcb | 178 | pc.printf("Se inicia la descarga del tanque. \r\n"); |
sago104 | 1:8171657a1bcb | 179 | |
sago104 | 1:8171657a1bcb | 180 | LedVerde = on; |
sago104 | 1:8171657a1bcb | 181 | wait(1); |
sago104 | 1:8171657a1bcb | 182 | LedVerde = off; |
sago104 | 1:8171657a1bcb | 183 | wait(1); |
sago104 | 1:8171657a1bcb | 184 | |
sago104 | 1:8171657a1bcb | 185 | if(c == 'a') { |
sago104 | 1:8171657a1bcb | 186 | float limTmin = 0; |
sago104 | 1:8171657a1bcb | 187 | for(float l1 = 1; l1 >= limTmin; l1 -= 0.1) { |
sago104 | 1:8171657a1bcb | 188 | if (l1 == 0) { // Significa que se ha llenado el tanque y se debe alertar. |
sago104 | 1:8171657a1bcb | 189 | pc.printf("Se ha liberado el tanque. Comprobando flujo...\r\n"); |
sago104 | 1:8171657a1bcb | 190 | wait(1); |
sago104 | 1:8171657a1bcb | 191 | goto llenarBalde; |
sago104 | 1:8171657a1bcb | 192 | } else { |
sago104 | 1:8171657a1bcb | 193 | sendData(l1); // Enviar dato a la aplicación de llenado de tanque |
sago104 | 1:8171657a1bcb | 194 | } |
sago104 | 1:8171657a1bcb | 195 | } |
sago104 | 0:2fd9acdd9076 | 196 | } |
sago104 | 0:2fd9acdd9076 | 197 | } |
sago104 | 0:2fd9acdd9076 | 198 | } |
sago104 | 0:2fd9acdd9076 | 199 | |
sago104 | 0:2fd9acdd9076 | 200 |