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

Committer:
gjusecheo
Date:
Wed Jun 01 23:26:31 2016 +0000
Revision:
0:1b3bf9dd7bbb
Tarea Lavadora

Who changed what in which revision?

UserRevisionLine numberNew 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