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@0:1b3bf9dd7bbb, 2016-06-01 (annotated)
- Committer:
- gjusecheo
- Date:
- Wed Jun 01 23:26:31 2016 +0000
- Revision:
- 0:1b3bf9dd7bbb
Tarea Lavadora
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
gjusecheo | 0:1b3bf9dd7bbb | 1 | #include "mbed.h" |
gjusecheo | 0:1b3bf9dd7bbb | 2 | #include <Pulse.h> |
gjusecheo | 0:1b3bf9dd7bbb | 3 | #include "DebouncedIn.h" |
gjusecheo | 0:1b3bf9dd7bbb | 4 | #define off 1 |
gjusecheo | 0:1b3bf9dd7bbb | 5 | #define on 0 |
gjusecheo | 0:1b3bf9dd7bbb | 6 | |
gjusecheo | 0:1b3bf9dd7bbb | 7 | Serial pc(USBTX,USBRX); // Abre puerto serial |
gjusecheo | 0:1b3bf9dd7bbb | 8 | Serial GSM(PTE0,PTE1); |
gjusecheo | 0:1b3bf9dd7bbb | 9 | |
gjusecheo | 0:1b3bf9dd7bbb | 10 | DigitalOut LedVerde(LED2,off); |
gjusecheo | 0:1b3bf9dd7bbb | 11 | DigitalOut LedRojo(LED1,off); |
gjusecheo | 0:1b3bf9dd7bbb | 12 | |
gjusecheo | 0:1b3bf9dd7bbb | 13 | AnalogIn input(PTC2); |
gjusecheo | 0:1b3bf9dd7bbb | 14 | InterruptIn sw2(PTA13); |
gjusecheo | 0:1b3bf9dd7bbb | 15 | |
gjusecheo | 0:1b3bf9dd7bbb | 16 | Timer t; //Configura el timer |
gjusecheo | 0:1b3bf9dd7bbb | 17 | |
gjusecheo | 0:1b3bf9dd7bbb | 18 | int tiempo; |
gjusecheo | 0:1b3bf9dd7bbb | 19 | int cPulsos; // Cuenta los pulsos |
gjusecheo | 0:1b3bf9dd7bbb | 20 | int Bmax = 1; // Límite de agua máximo del recipiente de la bomba |
gjusecheo | 0:1b3bf9dd7bbb | 21 | int i, j, k, m, num; |
gjusecheo | 0:1b3bf9dd7bbb | 22 | bool saver = true; // Para terminar el programa. |
gjusecheo | 0:1b3bf9dd7bbb | 23 | |
gjusecheo | 0:1b3bf9dd7bbb | 24 | void sw2_release(void) //esta me dispara el timer iniciando en 0.0000 |
gjusecheo | 0:1b3bf9dd7bbb | 25 | { |
gjusecheo | 0:1b3bf9dd7bbb | 26 | t.reset(); |
gjusecheo | 0:1b3bf9dd7bbb | 27 | t.start(); |
gjusecheo | 0:1b3bf9dd7bbb | 28 | i=0; //note que si i=0 es por que se dio pulso completo |
gjusecheo | 0:1b3bf9dd7bbb | 29 | } |
gjusecheo | 0:1b3bf9dd7bbb | 30 | |
gjusecheo | 0:1b3bf9dd7bbb | 31 | void sw2_pull(void) //esta detiene el timer (primero) y luego lee el valor en microsegundos, con tiempo en valor entero |
gjusecheo | 0:1b3bf9dd7bbb | 32 | { |
gjusecheo | 0:1b3bf9dd7bbb | 33 | t.stop(); |
gjusecheo | 0:1b3bf9dd7bbb | 34 | tiempo=t.read_us(); |
gjusecheo | 0:1b3bf9dd7bbb | 35 | |
gjusecheo | 0:1b3bf9dd7bbb | 36 | } |
gjusecheo | 0:1b3bf9dd7bbb | 37 | |
gjusecheo | 0:1b3bf9dd7bbb | 38 | void sendData(float input) |
gjusecheo | 0:1b3bf9dd7bbb | 39 | { |
gjusecheo | 0:1b3bf9dd7bbb | 40 | wait(1); |
gjusecheo | 0:1b3bf9dd7bbb | 41 | num = input*1000; //agrando el numero de cero a mil |
gjusecheo | 0:1b3bf9dd7bbb | 42 | GSM.putc(num); |
gjusecheo | 0:1b3bf9dd7bbb | 43 | pc.printf("Nivel del tanque: %f [m].\r\n", input); |
gjusecheo | 0:1b3bf9dd7bbb | 44 | if(num < 256) { //debo generar dos casos a APP inventor solo me recibe hex asi: 0xhhhh (4 cifras) |
gjusecheo | 0:1b3bf9dd7bbb | 45 | GSM.putc(0); //si el numero es hasta 255 se le ponen dos ceros adelante a la secuencia de bits |
gjusecheo | 0:1b3bf9dd7bbb | 46 | GSM.putc(i); //luego la cifra menos significativa |
gjusecheo | 0:1b3bf9dd7bbb | 47 | //pc.printf("Cero: %d\r\n", 0); |
gjusecheo | 0:1b3bf9dd7bbb | 48 | //pc.printf("m: %d\r\n", m); |
gjusecheo | 0:1b3bf9dd7bbb | 49 | } |
gjusecheo | 0:1b3bf9dd7bbb | 50 | if(num >255) { //pero si es mayor a 255 las cifras deben ser convertidas a un hex de dos bytes de la siguiente forma |
gjusecheo | 0:1b3bf9dd7bbb | 51 | j = num/256; //calculo la cifra mas significativa |
gjusecheo | 0:1b3bf9dd7bbb | 52 | k = num - j*256; //calculo la cifra menos significativa |
gjusecheo | 0:1b3bf9dd7bbb | 53 | GSM.putc(j); //las envio a la usart para que se las ponga al modulo bluetooth y la lleve al android |
gjusecheo | 0:1b3bf9dd7bbb | 54 | GSM.putc(k); //mas significativa primero, menos despues si no no funciona!!! y con la orden PUTC solo asi le envia binarios |
gjusecheo | 0:1b3bf9dd7bbb | 55 | //pc.printf("j: %d\r\n", j); |
gjusecheo | 0:1b3bf9dd7bbb | 56 | //pc.printf("k: %d\r\n", k); |
gjusecheo | 0:1b3bf9dd7bbb | 57 | } |
gjusecheo | 0:1b3bf9dd7bbb | 58 | } |
gjusecheo | 0:1b3bf9dd7bbb | 59 | |
gjusecheo | 0:1b3bf9dd7bbb | 60 | |
gjusecheo | 0:1b3bf9dd7bbb | 61 | int main() |
gjusecheo | 0:1b3bf9dd7bbb | 62 | { |
gjusecheo | 0:1b3bf9dd7bbb | 63 | GSM.baud(9600); // asigno baudios y configuro puerto serie de la usart |
gjusecheo | 0:1b3bf9dd7bbb | 64 | GSM.format(8,Serial::None,1); |
gjusecheo | 0:1b3bf9dd7bbb | 65 | wait(1); |
gjusecheo | 0:1b3bf9dd7bbb | 66 | pc.printf(" Iniciando WaterSaver\r\n"); |
gjusecheo | 0:1b3bf9dd7bbb | 67 | |
gjusecheo | 0:1b3bf9dd7bbb | 68 | // Inicia el ciclo |
gjusecheo | 0:1b3bf9dd7bbb | 69 | while(saver) { |
gjusecheo | 0:1b3bf9dd7bbb | 70 | waitPulse: // en esta parte se identifican los tiempo de los pulsos |
gjusecheo | 0:1b3bf9dd7bbb | 71 | |
gjusecheo | 0:1b3bf9dd7bbb | 72 | sw2.fall(&sw2_release); |
gjusecheo | 0:1b3bf9dd7bbb | 73 | sw2.rise(&sw2_pull); |
gjusecheo | 0:1b3bf9dd7bbb | 74 | wait(0.5); |
gjusecheo | 0:1b3bf9dd7bbb | 75 | pc.printf("tiempo = %i\r\n",tiempo); |
gjusecheo | 0:1b3bf9dd7bbb | 76 | pc.printf("Esperando flujo de la lavadora...\r\n"); |
gjusecheo | 0:1b3bf9dd7bbb | 77 | if ((5000<=tiempo)) { |
gjusecheo | 0:1b3bf9dd7bbb | 78 | goto comenzar; |
gjusecheo | 0:1b3bf9dd7bbb | 79 | } else { |
gjusecheo | 0:1b3bf9dd7bbb | 80 | goto waitPulse; |
gjusecheo | 0:1b3bf9dd7bbb | 81 | } |
gjusecheo | 0:1b3bf9dd7bbb | 82 | comenzar: |
gjusecheo | 0:1b3bf9dd7bbb | 83 | sw2.fall(&sw2_release); |
gjusecheo | 0:1b3bf9dd7bbb | 84 | sw2.rise(&sw2_pull); |
gjusecheo | 0:1b3bf9dd7bbb | 85 | pc.printf("tiempo = %i\r\n",tiempo); |
gjusecheo | 0:1b3bf9dd7bbb | 86 | if(tiempo<5000) { |
gjusecheo | 0:1b3bf9dd7bbb | 87 | goto waitPulse; |
gjusecheo | 0:1b3bf9dd7bbb | 88 | } else { |
gjusecheo | 0:1b3bf9dd7bbb | 89 | cPulsos = 0; |
gjusecheo | 0:1b3bf9dd7bbb | 90 | pc.printf("\r\n"); |
gjusecheo | 0:1b3bf9dd7bbb | 91 | pc.printf("Se detecta flujo.\r\n"); |
gjusecheo | 0:1b3bf9dd7bbb | 92 | LedVerde = on; |
gjusecheo | 0:1b3bf9dd7bbb | 93 | goto llenar; |
gjusecheo | 0:1b3bf9dd7bbb | 94 | } |
gjusecheo | 0:1b3bf9dd7bbb | 95 | |
gjusecheo | 0:1b3bf9dd7bbb | 96 | llenar: // envia flujo a donde se encuentra la bomba para desplazar el agua al tanque principal |
gjusecheo | 0:1b3bf9dd7bbb | 97 | int j = 0; |
gjusecheo | 0:1b3bf9dd7bbb | 98 | while(j <= Bmax) { // Ciclo de en envio de fluido a la bomba principal |
gjusecheo | 0:1b3bf9dd7bbb | 99 | |
gjusecheo | 0:1b3bf9dd7bbb | 100 | if(j == Bmax) { |
gjusecheo | 0:1b3bf9dd7bbb | 101 | pc.printf("Se debe prender la bomba.\r\n"); |
gjusecheo | 0:1b3bf9dd7bbb | 102 | goto Tanque; |
gjusecheo | 0:1b3bf9dd7bbb | 103 | } else { |
gjusecheo | 0:1b3bf9dd7bbb | 104 | pc.printf("Enviando flujo\r\n"); |
gjusecheo | 0:1b3bf9dd7bbb | 105 | wait(1); |
gjusecheo | 0:1b3bf9dd7bbb | 106 | } |
gjusecheo | 0:1b3bf9dd7bbb | 107 | j++; |
gjusecheo | 0:1b3bf9dd7bbb | 108 | } |
gjusecheo | 0:1b3bf9dd7bbb | 109 | |
gjusecheo | 0:1b3bf9dd7bbb | 110 | Tanque: |
gjusecheo | 0:1b3bf9dd7bbb | 111 | float limax = 1; |
gjusecheo | 0:1b3bf9dd7bbb | 112 | for(float l = 0; l <= limax; l += 0.033333333) { |
gjusecheo | 0:1b3bf9dd7bbb | 113 | sw2.fall(&sw2_release); |
gjusecheo | 0:1b3bf9dd7bbb | 114 | sw2.rise(&sw2_pull); |
gjusecheo | 0:1b3bf9dd7bbb | 115 | pc.printf("tiempo = %i\r\n",tiempo); |
gjusecheo | 0:1b3bf9dd7bbb | 116 | if(tiempo<5000) { |
gjusecheo | 0:1b3bf9dd7bbb | 117 | goto waitPulse; |
gjusecheo | 0:1b3bf9dd7bbb | 118 | } |
gjusecheo | 0:1b3bf9dd7bbb | 119 | |
gjusecheo | 0:1b3bf9dd7bbb | 120 | |
gjusecheo | 0:1b3bf9dd7bbb | 121 | if (l == limax) { // Significa que se ha llenado el tanque y se debe alertar. |
gjusecheo | 0:1b3bf9dd7bbb | 122 | pc.printf("Se ha llenado el tanque. Favor abrir la valvula del desague.\r\n"); |
gjusecheo | 0:1b3bf9dd7bbb | 123 | goto desague; |
gjusecheo | 0:1b3bf9dd7bbb | 124 | } else { |
gjusecheo | 0:1b3bf9dd7bbb | 125 | sendData(l); // Enviar dato a la aplicación de llenado de tanque |
gjusecheo | 0:1b3bf9dd7bbb | 126 | } |
gjusecheo | 0:1b3bf9dd7bbb | 127 | } |
gjusecheo | 0:1b3bf9dd7bbb | 128 | |
gjusecheo | 0:1b3bf9dd7bbb | 129 | |
gjusecheo | 0:1b3bf9dd7bbb | 130 | desague: |
gjusecheo | 0:1b3bf9dd7bbb | 131 | LedRojo = on; |
gjusecheo | 0:1b3bf9dd7bbb | 132 | wait(1); |
gjusecheo | 0:1b3bf9dd7bbb | 133 | LedRojo = off; |
gjusecheo | 0:1b3bf9dd7bbb | 134 | wait(1); |
gjusecheo | 0:1b3bf9dd7bbb | 135 | |
gjusecheo | 0:1b3bf9dd7bbb | 136 | pc.printf("tiempo = %i\r\n",tiempo); |
gjusecheo | 0:1b3bf9dd7bbb | 137 | |
gjusecheo | 0:1b3bf9dd7bbb | 138 | pc.printf("presione 'v' para abrir la valvula del tanque: "); |
gjusecheo | 0:1b3bf9dd7bbb | 139 | char c = pc.getc(); |
gjusecheo | 0:1b3bf9dd7bbb | 140 | //char c = 'a'; // Agilidad |
gjusecheo | 0:1b3bf9dd7bbb | 141 | pc.printf("\r\n"); |
gjusecheo | 0:1b3bf9dd7bbb | 142 | pc.printf("Se inicia la descarga del tanque. \r\n"); |
gjusecheo | 0:1b3bf9dd7bbb | 143 | |
gjusecheo | 0:1b3bf9dd7bbb | 144 | LedRojo = on; |
gjusecheo | 0:1b3bf9dd7bbb | 145 | |
gjusecheo | 0:1b3bf9dd7bbb | 146 | if(c == 'v') { |
gjusecheo | 0:1b3bf9dd7bbb | 147 | float limTmin = 0; |
gjusecheo | 0:1b3bf9dd7bbb | 148 | for(float l1 = 1; l1 >= limTmin; l1 -= 0.033333333) { |
gjusecheo | 0:1b3bf9dd7bbb | 149 | if (l1 == 0) { // Significa que se ha llenado el tanque y se debe alertar. |
gjusecheo | 0:1b3bf9dd7bbb | 150 | pc.printf("Se ha liberado el tanque. Comprobando flujo...\r\n"); |
gjusecheo | 0:1b3bf9dd7bbb | 151 | wait(1); |
gjusecheo | 0:1b3bf9dd7bbb | 152 | goto llenar; |
gjusecheo | 0:1b3bf9dd7bbb | 153 | } else { |
gjusecheo | 0:1b3bf9dd7bbb | 154 | sendData(l1); // Enviar dato a la aplicación de llenado de tanque |
gjusecheo | 0:1b3bf9dd7bbb | 155 | } |
gjusecheo | 0:1b3bf9dd7bbb | 156 | } |
gjusecheo | 0:1b3bf9dd7bbb | 157 | } |
gjusecheo | 0:1b3bf9dd7bbb | 158 | } |
gjusecheo | 0:1b3bf9dd7bbb | 159 | } |
gjusecheo | 0:1b3bf9dd7bbb | 160 | |
gjusecheo | 0:1b3bf9dd7bbb | 161 |