proyectotecnicas
/
final-completo
final
Fork of general by
Embed:
(wiki syntax)
Show/hide line numbers
main.cpp
00001 #include "mbed.h" 00002 #include "TextLCD.h" 00003 #include "AnalogIn.h" 00004 #include "Serial.h" 00005 #include <TimerEvent.h> 00006 00007 //clases 00008 Ticker timeout; 00009 Serial pc(USBTX, USBRX); 00010 TextLCD lcd(PTD3, PTA12, PTA4, PTA5, PTC8, PTC9, TextLCD::LCD16x2); 00011 00012 //entradas 00013 DigitalIn key1(PTE31),key2(PTE19), key3(PTE18), key4(PTE17); 00014 InterruptIn Enable(PTA13); 00015 AnalogIn externo(PTC2),interno(PTB3), presionin(PTB2), pident(PTB1); 00016 AnalogOut vref(PTE30); 00017 PwmOut pwmsal(PTD2); 00018 DigitalOut evalvula(PTE1); 00019 DigitalOut led_red(LED_RED); 00020 DigitalOut led_green(LED_GREEN); 00021 00022 //declaracion de variables 00023 char tipo, modo = 'M'; 00024 float tinterno, texterno, presion, casexterno, casinterno, caspresion, valorpwm, valorpid, vrefe; 00025 float tres, optimo=0; 00026 int i = 0, j = 0, sel = 1, hora=0, min=0, seg=0, horain = 8, minin = 0, horafin = 22, minfin = 0, temp = 26, cont=0, ev= 1; 00027 int hh1, hh0, mm0, mm1, B1, B2, B3, B4, num, tempauto = 0, tipobanio = 0, pdig, sdig, tempmanual = 35, set = 0; 00028 void menu(); 00029 void selec(); 00030 void func(); 00031 00032 void attimeout() 00033 { 00034 min++; 00035 if (min == 60) { 00036 min = 0; 00037 hora++; 00038 } 00039 if (hora == 24) { 00040 hora = 0; 00041 min = 0; 00042 } 00043 00044 } 00045 00046 00047 void funpresion() //funcion de vaciado llenado 00048 { 00049 caspresion = presionin.read() * 3.3; 00050 pc.printf("analogin %.2f\n\r", caspresion); 00051 00052 switch(tipobanio) { 00053 case 0: //baño rapido 00054 if(caspresion >= 2.2) { //se lleno 00055 pc.printf("se lleno y apago ev\n\r"); 00056 ev = 0; 00057 } 00058 if(caspresion <= 1.53) { //se vacio 00059 cont++; 00060 pc.printf("se vacio\n\r"); 00061 pc.printf("%d\n\r", cont); 00062 if(cont > 20) { //contador 00063 ev = 1; 00064 cont = 0; 00065 pc.printf("se activa la ev\n\r"); 00066 } 00067 } 00068 break; 00069 case 1: //baño normal 00070 if(caspresion >= 2.6) { //se lleno 00071 pc.printf("se lleno y apago ev\n\r"); 00072 ev = 0; 00073 } 00074 if(caspresion <= 1.53) { //se vacio 00075 cont++; 00076 pc.printf("se vacio\n\r"); 00077 pc.printf("%d\n\r", cont); 00078 if(cont == 20) { //contador 00079 ev = 1; 00080 cont = 0; 00081 pc.printf("se activa la ev\n\r"); 00082 } 00083 } 00084 break; 00085 } //fin switch 00086 evalvula.write(ev); 00087 } //fin funcion 00088 00089 //recibe tension de referencia cambiar por que reciba la de el teclado o del externo 00090 void modotemp() 00091 { 00092 if (modo == 'A') { 00093 switch (tempauto) { 00094 00095 case 0: 00096 if ((hora > horain||(hora == horain && min >= minin)) && ( hora < horafin ||(hora == horafin && min <= minfin))) { 00097 optimo= -(11/10*texterno)+50; 00098 if (optimo > 25 && optimo < 65) { 00099 tres = optimo; 00100 } else { 00101 tres = tinterno; 00102 } 00103 } else { 00104 tres = tinterno; 00105 } 00106 break; 00107 case 1: 00108 if ((hora > horain||(hora == horain && min >= minin)) && ( hora < horafin ||(hora == horafin && min <= minfin))) { 00109 optimo= -(11/10*texterno)+55; 00110 if (optimo > 25 && optimo < 65) { 00111 tres = optimo; 00112 } else { 00113 tres = tinterno; 00114 } 00115 } else { 00116 tres = tinterno; 00117 } 00118 break; 00119 case 2: 00120 if ((hora > horain||(hora == horain && min >= minin)) && ( hora < horafin ||(hora == horafin && min <= minfin))) { 00121 optimo= -(11/10*texterno)+65; 00122 if (optimo > 25 && optimo < 65 ) { 00123 tres = optimo; 00124 00125 } else { 00126 tres = tinterno; 00127 } 00128 } else { 00129 tres = tinterno; 00130 } 00131 break; 00132 } 00133 } 00134 if (modo == 'M') { 00135 tres = tempmanual; 00136 } 00137 vrefe = ((tres * 8 / 100) - 2) / 3.3; 00138 pc.printf("vrefe= %.2f tres= %.0f\n\r",vrefe, tres); 00139 wait(2); 00140 } 00141 //funcion del pwm 00142 00143 void pwm() 00144 { 00145 if(vrefe <= 1 && vrefe >= 0) { 00146 vref.write(vrefe); 00147 pc.printf("vrefe= %.4f de salida vref\n\r",vrefe); 00148 } 00149 valorpid = pident.read() * 3.3; 00150 if(valorpid > 1 && ev == 0) { 00151 pwmsal.write(1); 00152 pc.printf("vrefe= %.4f del 1 if\n\r",vrefe); 00153 led_green = 0; 00154 } else if(valorpid <= 1 && valorpid >= 0.69 && ev == 0) { 00155 valorpwm = 2.5 * valorpid - 1.5; 00156 pc.printf("vrefe= %.4f del 2 if\n\r",vrefe); 00157 pwmsal.write(valorpwm); 00158 led_green = 0; 00159 } else if(valorpid <= 0.69) { 00160 pwmsal.write(0); 00161 pc.printf("vrefe= %.4f del else\n\r",vrefe); 00162 led_green = 1; 00163 00164 } 00165 pc.printf("valorpid=%.4f\n\r",valorpid); 00166 } 00167 00168 //funcion de set de hora 00169 void sethora() 00170 { 00171 if(i == 0) { //set de primer digito hora 00172 if(num > 2) { 00173 lcd.locate(0,0); 00174 lcd.printf("valor invalido"); 00175 wait(.7); 00176 func(); 00177 } else { 00178 hh1 = num; 00179 lcd.cls(); 00180 lcd.printf("%dx:xx",hh1); 00181 lcd.locate(0,1); 00182 lcd.printf("%.0fC %.0fC %c ", texterno, tinterno, modo); 00183 wait(.7); 00184 i++; 00185 } 00186 } else //fin de set 1er digito hora ok 00187 if(i == 1) { 00188 //inicio 2do digito hora 00189 if(hh1 == 2 && num > 4) { 00190 lcd.locate(0,0); 00191 lcd.printf("valor invalido"); 00192 wait(.7); 00193 func(); 00194 } else { 00195 hh0 = num; 00196 lcd.cls(); 00197 lcd.printf("%d%d:xx",hh1,hh0); 00198 lcd.locate(0,1); 00199 lcd.printf("%.0fC %.0fC %c ", texterno, tinterno, modo); 00200 wait(.7); 00201 i++; 00202 } 00203 } else //fin 2do digito hora 00204 if(i == 2) { //inicio 1er digito minuto 00205 if(num > 6) { 00206 lcd.locate(0,0); 00207 lcd.printf("valor invalido"); 00208 wait(.7); 00209 func(); 00210 } else { 00211 mm1 = num; 00212 lcd.cls(); 00213 lcd.printf("%d%d:%dx",hh1,hh0,mm1); 00214 lcd.locate(0,1); 00215 lcd.printf("%.0fC %.0fC %c ", texterno, tinterno, modo); 00216 wait(.7); 00217 i++; 00218 } 00219 } else //fin 2do digito minuto 00220 if(i == 3) { //inicio 2do digito minuto 00221 if(mm1 == 6) { 00222 mm0 = 0; 00223 } else { 00224 mm0 = num; 00225 } 00226 lcd.cls(); 00227 lcd.printf("%d%d:%d%d",hh1,hh0,mm1,mm0); 00228 lcd.locate(0,1); 00229 lcd.printf("%.0fC %.0fC %c ", texterno, tinterno, modo); 00230 i++; 00231 } //fin 2do digito minuto 00232 } 00233 // fin funcion set de hora 00234 00235 //funcion que imprime la hora 00236 void imprimehora() 00237 { 00238 lcd.locate(11,1); 00239 if(min < 10 && hora >= 10) 00240 lcd.printf("%2i:0%i", hora, min); 00241 if(hora < 10 && min >= 10) 00242 lcd.printf("0%i:%2i", hora, min); 00243 if(hora < 10 && min < 10) 00244 lcd.printf("0%i:0%i", hora, min); 00245 if(hora >= 10 && min >= 10) 00246 lcd.printf("%i:%i", hora, min); 00247 } 00248 00249 //lectura de teclado y navegacion por menu 00250 void func() 00251 { 00252 led_red = 1; 00253 wait(.2); 00254 led_red = 0; 00255 B1 = key1.read(); 00256 B2 = key2.read(); 00257 B3 = key3.read(); 00258 B4 = key4.read(); 00259 num = 2*2*2*B1 + 2*2*B2 + 2*B3 + B4; 00260 if(num == 10) { 00261 set = 0; 00262 menu(); 00263 } else if(num == 11) { 00264 set = 0; 00265 selec(); 00266 } else if(num != 10 && num != 11) { 00267 00268 00269 switch(set) { 00270 case 0: 00271 break; 00272 case 1: //seteo hora 00273 sethora(); 00274 if(i == 4) { //pasa la hora al reloj 00275 hora = (hh1 * 10) + hh0; 00276 min = (mm1 * 10) + mm0; 00277 hh0 = hh1 = mm1 = mm0 = 0; 00278 lcd.locate(0,0); 00279 lcd.printf("reloj "); 00280 lcd.locate(0,1); 00281 lcd.printf("%.0fC %.0fC %c ", texterno, tinterno, modo); 00282 i = 0; 00283 } 00284 break; //fin pasa hora al reloj 00285 case 2: //set temperaturas auto 00286 if(num == 0 || num == 1 || num == 2) { 00287 tempauto = num; 00288 lcd.locate(0,0); 00289 if(num == 0) 00290 lcd.printf("tipo frio "); 00291 else if(num == 1) 00292 lcd.printf("tipo normal "); 00293 else 00294 lcd.printf("tipo caliente"); 00295 wait(1); 00296 lcd.cls(); 00297 lcd.printf("temperatura"); 00298 set = 0; 00299 } else { 00300 lcd.locate(0,0); 00301 lcd.printf("valor invalido"); 00302 wait(1); 00303 lcd.printf("tipo banio"); 00304 lcd.cls(); 00305 } 00306 break; 00307 case 3: //tipo de baño 00308 if(num == 0 || num == 1) { 00309 tipobanio = num; 00310 lcd.locate(0,0); 00311 if(num == 0) 00312 lcd.printf("banio rapido "); 00313 else 00314 lcd.printf("banio normal "); 00315 wait(1); 00316 lcd.cls(); 00317 lcd.printf("tipo banio "); 00318 set = 0; 00319 } else { 00320 lcd.locate(0,0); 00321 lcd.printf("valor invalido"); 00322 wait(1); 00323 lcd.cls(); 00324 lcd.printf("tipo banio "); 00325 } 00326 break; 00327 case 4: //set de horarios 00328 sethora(); 00329 if(i == 4 && j == 0) { //pasa la hora al reloj 00330 horain = (hh1 * 10) + hh0; 00331 minin = (mm1 * 10) + mm0; 00332 hh0 = hh1 = mm1 = mm0 = 0; 00333 lcd.locate(0,0); 00334 lcd.printf("horario "); 00335 lcd.locate(0,1); 00336 lcd.printf("%.0fC %.0fC %c ", texterno, tinterno, modo); 00337 i = 0; 00338 j = 1; 00339 } 00340 if(i == 4 && j == 1) { //pasa la hora al reloj 00341 horafin = (hh1 * 10) + hh0; 00342 minfin = (mm1 * 10) + mm0; 00343 hh0 = hh1 = mm1 = mm0 = 0; 00344 lcd.locate(0,0); 00345 lcd.printf("horario "); 00346 lcd.locate(0,1); 00347 lcd.printf("%.0fC %.0fC %c ", texterno, tinterno, modo); 00348 i = 0; 00349 j = 0; 00350 } 00351 break; 00352 case 5: //set temperatura manual 00353 if(i == 0) { 00354 pdig = num; 00355 } else if(i == 1) { 00356 sdig = num; 00357 tempmanual = (pdig * 10) + sdig; 00358 if(tempmanual >= 65) { 00359 tempmanual = 65; 00360 } 00361 if(tempmanual <= 25) { 00362 tempmanual = 25; 00363 } 00364 imprimehora(); 00365 lcd.locate(0,0); 00366 lcd.printf("temperatura a %d",tempmanual); 00367 wait(1); 00368 lcd.locate(0,0); 00369 lcd.printf("temperatura "); 00370 } 00371 i++; 00372 if(i == 2) { 00373 i = 0; 00374 } 00375 break; 00376 case 6: //tipo de banio manual 00377 if(num == 0 || num == 1) { 00378 tipobanio = num; 00379 lcd.locate(0,0); 00380 if(num == 0) 00381 lcd.printf("banio rapido "); 00382 else 00383 lcd.printf("banio normal "); 00384 wait(1); 00385 lcd.cls(); 00386 lcd.printf("tipo banio "); 00387 set = 0; 00388 } else { 00389 lcd.locate(0,0); 00390 lcd.printf("valor invalido"); 00391 wait(1); 00392 lcd.cls(); 00393 lcd.printf("tipo banio "); 00394 } 00395 break; 00396 } 00397 } 00398 } 00399 00400 //impresion de menu 00401 void menu () 00402 { 00403 lcd.cls(); 00404 imprimehora(); 00405 switch (sel) { 00406 case 1: 00407 lcd.locate(0,0); 00408 lcd.printf("auto"); 00409 lcd.locate(0,1); 00410 lcd.printf("%.0fC %.0fC %c ", texterno, tinterno, modo); 00411 sel = 2; 00412 break; 00413 case 2: 00414 lcd.locate(0,0); 00415 lcd.printf("manual"); 00416 lcd.locate(0,1); 00417 lcd.printf("%.0fC %.0fC %c ", texterno, tinterno, modo); 00418 sel = 3; 00419 break; 00420 case 3: 00421 lcd.locate(0,0); 00422 lcd.printf("reloj"); 00423 lcd.locate(0,1); 00424 lcd.printf("%.0fC %.0fC %c ", texterno, tinterno, modo); 00425 sel = 1; 00426 break; 00427 case 4: 00428 lcd.locate(0,0); 00429 lcd.printf("temperatura"); 00430 lcd.locate(0,1); 00431 lcd.printf("%.0fC %.0fC %c ", texterno, tinterno, modo); 00432 sel = 5; 00433 break; 00434 case 5: 00435 lcd.locate(0,0); 00436 lcd.printf("tipo banio "); 00437 lcd.locate(0,1); 00438 lcd.printf("%.0fC %.0fC %c ", texterno, tinterno, modo); 00439 sel = 6; 00440 break; 00441 case 6: 00442 lcd.locate(0,0); 00443 lcd.printf("horarios"); 00444 lcd.locate(0,1); 00445 lcd.printf("%.0fC %.0fC %c ", texterno, tinterno, modo); 00446 sel = 9; 00447 break; 00448 case 7: 00449 lcd.locate(0,0); 00450 lcd.printf("temperatura"); 00451 lcd.locate(0,1); 00452 lcd.printf("%.0fC %.0fC %c ", texterno, tinterno, modo); 00453 sel = 8; 00454 break; 00455 case 8: 00456 lcd.locate(0,0); 00457 lcd.printf("tipo banio "); 00458 lcd.locate(0,1); 00459 lcd.printf("%.0fC %.0fC %c ", texterno, tinterno, modo); 00460 sel = 10; 00461 break; 00462 case 9: 00463 lcd.locate(0,0); 00464 lcd.printf("salir"); 00465 lcd.locate(0,1); 00466 lcd.printf("%.0fC %.0fC %c ", texterno, tinterno, modo); 00467 sel = 4; 00468 break; 00469 case 10: 00470 lcd.locate(0,0); 00471 lcd.printf("salir"); 00472 lcd.locate(0,1); 00473 lcd.printf("%.0fC %.0fC %c ", texterno, tinterno, modo); 00474 sel = 7; 00475 break; 00476 } 00477 } 00478 00479 void selec() 00480 { 00481 switch (sel) { 00482 case 2: 00483 modo = 'A'; 00484 sel = 4; 00485 menu(); 00486 break; 00487 case 3: 00488 modo = 'M'; 00489 sel = 7; 00490 menu(); 00491 break; 00492 case 1: 00493 lcd.locate(0,0); 00494 lcd.printf("ingrese datos"); 00495 set = 1; 00496 break; 00497 case 5: 00498 lcd.locate(0,0); 00499 lcd.printf(" 0_F 1_N 2_C"); 00500 set = 2; 00501 break; 00502 case 6: 00503 lcd.locate(0,0); 00504 lcd.printf(" 0_rap 1_norm"); 00505 set = 3; 00506 break; 00507 case 4: 00508 sel = 1; 00509 menu(); //salida1 00510 break; 00511 case 8: 00512 lcd.locate(0,0); 00513 lcd.printf("ingrese temperat"); 00514 set = 5; 00515 break; 00516 case 7: 00517 sel = 2; 00518 menu(); 00519 break; 00520 case 9: 00521 set = 4; 00522 break; 00523 case 10: 00524 lcd.locate(0,0); 00525 lcd.printf(" 0_rap 1_norm"); 00526 set = 6; 00527 break; 00528 } 00529 } 00530 00531 //programa principal 00532 int main() 00533 { 00534 timeout.attach(&attimeout, 60); 00535 pc.baud(115200); 00536 Enable.rise(&func); 00537 00538 while(1) { 00539 modotemp(); 00540 00541 imprimehora(); 00542 00543 //convierte voltaje a temperatura 00544 casexterno = externo.read() * 3.3; 00545 texterno = (casexterno + 0.2) * 100 / 5; 00546 casinterno = interno.read() * 3.3; 00547 tinterno = (casinterno + 2) * 100 / 8; 00548 00549 lcd.locate(0,1); 00550 lcd.printf("%.0fC %.0fC %c ", texterno, tinterno, modo); 00551 funpresion(); 00552 pwm(); 00553 } //fin wile 00554 }
Generated on Sun Jul 24 2022 20:39:04 by 1.7.2