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
main.cpp
00001 #include "mbed.h" 00002 #include <Pulse.h> 00003 #include "DebouncedIn.h" 00004 #define off 1 00005 #define on 0 00006 00007 Serial pc(USBTX,USBRX); // Abre puerto serial 00008 Serial GSM(PTE0,PTE1); 00009 00010 DigitalOut LedVerde(LED2,off); 00011 DigitalOut LedRojo(LED1,off); 00012 00013 AnalogIn input(PTC2); 00014 InterruptIn sw2(PTA13); 00015 00016 Timer t; //Configura el timer 00017 00018 int tiempo; 00019 int cPulsos; // Cuenta los pulsos 00020 int Bmax = 1; // Límite de agua máximo del recipiente de la bomba 00021 int i, j, k, m, num; 00022 bool saver = true; // Para terminar el programa. 00023 00024 void sw2_release(void) //esta me dispara el timer iniciando en 0.0000 00025 { 00026 t.reset(); 00027 t.start(); 00028 i=0; //note que si i=0 es por que se dio pulso completo 00029 } 00030 00031 void sw2_pull(void) //esta detiene el timer (primero) y luego lee el valor en microsegundos, con tiempo en valor entero 00032 { 00033 t.stop(); 00034 tiempo=t.read_us(); 00035 00036 } 00037 00038 void sendData(float input) 00039 { 00040 wait(1); 00041 num = input*1000; //agrando el numero de cero a mil 00042 GSM.putc(num); 00043 pc.printf("Nivel del tanque: %f [m].\r\n", input); 00044 if(num < 256) { //debo generar dos casos a APP inventor solo me recibe hex asi: 0xhhhh (4 cifras) 00045 GSM.putc(0); //si el numero es hasta 255 se le ponen dos ceros adelante a la secuencia de bits 00046 GSM.putc(i); //luego la cifra menos significativa 00047 //pc.printf("Cero: %d\r\n", 0); 00048 //pc.printf("m: %d\r\n", m); 00049 } 00050 if(num >255) { //pero si es mayor a 255 las cifras deben ser convertidas a un hex de dos bytes de la siguiente forma 00051 j = num/256; //calculo la cifra mas significativa 00052 k = num - j*256; //calculo la cifra menos significativa 00053 GSM.putc(j); //las envio a la usart para que se las ponga al modulo bluetooth y la lleve al android 00054 GSM.putc(k); //mas significativa primero, menos despues si no no funciona!!! y con la orden PUTC solo asi le envia binarios 00055 //pc.printf("j: %d\r\n", j); 00056 //pc.printf("k: %d\r\n", k); 00057 } 00058 } 00059 00060 00061 int main() 00062 { 00063 GSM.baud(9600); // asigno baudios y configuro puerto serie de la usart 00064 GSM.format(8,Serial::None,1); 00065 wait(1); 00066 pc.printf(" Iniciando WaterSaver\r\n"); 00067 00068 // Inicia el ciclo 00069 while(saver) { 00070 waitPulse: // en esta parte se identifican los tiempo de los pulsos 00071 00072 sw2.fall(&sw2_release); 00073 sw2.rise(&sw2_pull); 00074 wait(0.5); 00075 pc.printf("tiempo = %i\r\n",tiempo); 00076 pc.printf("Esperando flujo de la lavadora...\r\n"); 00077 if ((5000<=tiempo)) { 00078 goto comenzar; 00079 } else { 00080 goto waitPulse; 00081 } 00082 comenzar: 00083 sw2.fall(&sw2_release); 00084 sw2.rise(&sw2_pull); 00085 pc.printf("tiempo = %i\r\n",tiempo); 00086 if(tiempo<5000) { 00087 goto waitPulse; 00088 } else { 00089 cPulsos = 0; 00090 pc.printf("\r\n"); 00091 pc.printf("Se detecta flujo.\r\n"); 00092 LedVerde = on; 00093 goto llenar; 00094 } 00095 00096 llenar: // envia flujo a donde se encuentra la bomba para desplazar el agua al tanque principal 00097 int j = 0; 00098 while(j <= Bmax) { // Ciclo de en envio de fluido a la bomba principal 00099 00100 if(j == Bmax) { 00101 pc.printf("Se debe prender la bomba.\r\n"); 00102 goto Tanque; 00103 } else { 00104 pc.printf("Enviando flujo\r\n"); 00105 wait(1); 00106 } 00107 j++; 00108 } 00109 00110 Tanque: 00111 float limax = 1; 00112 for(float l = 0; l <= limax; l += 0.033333333) { 00113 sw2.fall(&sw2_release); 00114 sw2.rise(&sw2_pull); 00115 pc.printf("tiempo = %i\r\n",tiempo); 00116 if(tiempo<5000) { 00117 goto waitPulse; 00118 } 00119 00120 00121 if (l == limax) { // Significa que se ha llenado el tanque y se debe alertar. 00122 pc.printf("Se ha llenado el tanque. Favor abrir la valvula del desague.\r\n"); 00123 goto desague; 00124 } else { 00125 sendData(l); // Enviar dato a la aplicación de llenado de tanque 00126 } 00127 } 00128 00129 00130 desague: 00131 LedRojo = on; 00132 wait(1); 00133 LedRojo = off; 00134 wait(1); 00135 00136 pc.printf("tiempo = %i\r\n",tiempo); 00137 00138 pc.printf("presione 'v' para abrir la valvula del tanque: "); 00139 char c = pc.getc(); 00140 //char c = 'a'; // Agilidad 00141 pc.printf("\r\n"); 00142 pc.printf("Se inicia la descarga del tanque. \r\n"); 00143 00144 LedRojo = on; 00145 00146 if(c == 'v') { 00147 float limTmin = 0; 00148 for(float l1 = 1; l1 >= limTmin; l1 -= 0.033333333) { 00149 if (l1 == 0) { // Significa que se ha llenado el tanque y se debe alertar. 00150 pc.printf("Se ha liberado el tanque. Comprobando flujo...\r\n"); 00151 wait(1); 00152 goto llenar; 00153 } else { 00154 sendData(l1); // Enviar dato a la aplicación de llenado de tanque 00155 } 00156 } 00157 } 00158 } 00159 } 00160 00161
Generated on Tue Jul 12 2022 20:24:04 by 1.7.2