final

Dependencies:   TextLCD mbed

Fork of general by proyectotecnicas

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

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 }