Este programa sirve para configurar un PID y un RTC desde una aplicación en android

Dependencies:   mbed TextLCD

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 /***************
00002 
00003 
00004 ESTE PROGRAMA PUEDE SER USADO PARA CONFIGURAR UN RELOJ DE TIEMPO REAL DS3231 O 
00005 PARA COFIGURAR UN CONTROL PID PARA UN CIRCUITO RCRC CONECTADO EN EL PIN PTE30.
00006 EL PROGRAMA FUE DISEÑADO PARA APERAR CON UNA APLICACIÓN DE ANDROID CREADA EN
00007 APP INVENTOR QUE PUEDE CONECTARSE CON LA TARJETA FRDM-KL25Z A TRAVÉZ DE UN 
00008 MÓDULO DE BLUETOOTH CONECTADO EN EL PUERTO SERIAL UART2. CUANDO EL CELILAR SE 
00009 CONECTA PARA CONFIGURAR EL CONTROL PID, LA TARJETA ENVÍA LAS MEDIDAS DEL VOLTAJE
00010 DE SALIDA DEL CIRCUITO. TANTO EN EL MODO RTC COMO EN EL MODO PID, LOS DATOS
00011 SE MUESTRAN EN UNA PANTALLA LDC.
00012 
00013 NEFER MIRANDA LLORENTE
00014 PROGRAMA DE INGENIERÍA DE CONTROL
00015 UNIVERSIDAD NACIONAL DE COLOMBIA - SEDE MEDELLÍN
00016 
00017 
00018 ***************/
00019 
00020 
00021 
00022 
00023 #include "mbed.h"
00024 #include <stdio.h>
00025 #include "ds3231_RTC.h"
00026 #include "TextLCD.h"
00027 
00028 Serial master(USBTX,USBRX);// Tx, Rx Computador
00029 Serial GSM(PTE22,PTE23);// Tx, Rx Módulo de bluetooth
00030 Ds3231 rtc(A4, A5); // puerto I2C1 de la frdm-kl25z
00031 
00032 
00033 int vo, hb, lb;
00034 int  P, I, D,S,AAAA=2000,MM,DD,wd=1,HH,mm,ss,mode,am_pm;
00035 float p,i,d,s,q0,q1,q2,e,e_1,e_2,u,u_1;
00036 char command[16], control='F';
00037 float Kp=12.0, Ki=5.0, Kd=0.02, sp=2.0/3.3, T=0.02;
00038 bool PID,CLK;
00039 uint8_t vo_lb, vo_hb, j, aa;
00040 uint16_t rtn_val;
00041 char chain[40], character;
00042 
00043 ds3231_time_t hora = {HH,mm,ss=45,am_pm,mode};//{horas,minutos,segundos,AM/PM,12/24H}
00044 ds3231_calendar_t fecha= {AAAA,MM,DD,wd};//{años,mes,días,dia de semana}
00045 
00046 
00047 AnalogIn input(PTB1); // puerto para medir el voltaje del circuito
00048 AnalogOut  u_control(PTE30);// puerto a través del cual se aplica una entrada al circuito
00049 DigitalOut LedVerde(LED2); // led indicador de estado del circuito
00050 
00051 TextLCD lcd(PTE5, PTE4, PTE3, PTE2, PTB11, PTB10); // conexión ldc (rs, e, d4-d7)
00052 
00053 Timer k,t,rtc_t;
00054 
00055 //## Esta rutina lee una cadena de caracteres disponible en el puerto serial GSM ######
00056 void get_chain()
00057 {
00058     j=0;
00059     k.start();
00060     while(1) {
00061 
00062 
00063         if(GSM.readable()) {
00064             character=GSM.getc();
00065             chain[j]=character;
00066 
00067             j++;
00068         }
00069         if(k.read()>.2) {
00070             k.stop();
00071             k.reset();
00072             break;
00073         }
00074     }
00075 }
00076 
00077 //###### Esta función limpia la variable chain ########
00078 void reset_var()
00079 {
00080     for (int i=0; i<sizeof(chain); i++) {
00081         chain[i]='\0';
00082     }
00083 }
00084 
00085 
00086 //#### Esta función configura el reloj de tiempo real cuando se recibe un nuevo
00087 //#### dato de fecha y hora a través de bluetooth###
00088 
00089 void set_rtc()
00090 {
00091     ds3231_time_t hora = {HH, mm, ss, am_pm, 1};
00092     ds3231_calendar_t fecha= {AAAA%100,MM,DD,wd};
00093 
00094     if(!rtc.set_calendar(fecha)) { // se ejcuta si la configuración de la fecha es exitosa
00095     // se imprime en la terminal del pc la fecha y hora a la cual se configuró el RTC
00096 
00097         master.printf("\r\n\r\n         Reloj Configurado el %d / %d / %d ",DD,MM,AAAA);
00098 
00099         if(!rtc.set_time(hora)) { // se ejcuta si la configuración de la hora es exitosa
00100             if(hora.am_pm)master.printf("a las %d:%d:%d PM\r\n\r\n\r\n",HH,mm,ss);
00101             else master.printf("a las %d:%d:%d AM\r\n\r\n\r\n",HH,mm,ss);
00102         }
00103     }
00104 
00105 }
00106 
00107 
00108 /* La función request() se encarga de interpretar el dato que se ha recibido 
00109 a través del puerto serial GSM, este puede tener la función de configurar el
00110 modulo RTC, configurar un control PID, activar o desactivar la señal de entrada
00111 del circuito RCRC, o notificar si el celular se ha conectado o desconectado a 
00112 través de bluetooth.
00113 
00114 */
00115 void request()
00116 {
00117     lcd.cls();
00118     if(chain[0]=='R') {
00119         control='N';
00120 
00121 
00122 
00123     } else if (chain[0]=='S') {
00124         control='F';
00125 
00126 
00127 
00128     } else if (chain[0]=='P') {
00129         sscanf (chain,"%*s %d%f%*s %d%f%*s %d%f%*s %d%f",&P,&p,&I,&i,&D,&d,&S,&s);
00130         master.printf ("P= %d\r\np= %f\r\nI= %d\r\ni= %f\r\nD= %d\r\nd= %f\r\nS= %d\r\ns= %f\r\n",P,p,I,i,D,d,S,s);
00131         Kp=P+p;
00132         Ki=I+i;
00133         Kd=D+d;
00134         sp=(S+s)/3.3;
00135         master.printf ("Kp= %f\r\nKi= %f\r\nKd= %f\r\nsp= %f\r\n",Kp,Ki,Kd,3.3*sp);
00136 
00137 
00138 
00139     } else if (chain[0]=='A') {
00140         sscanf (chain,"%*s %d%*s %d%*s %d%*s %d%*s %d",&AAAA,&MM,&DD,&HH,&mm);
00141         master.printf ("AAAA= %d\r\nMM= %d\r\nDD= %d\r\nHH= %d\r\nmm= %d\r\n",AAAA,MM,DD,HH,mm);
00142         if(HH>12) {
00143             HH=HH-12;
00144             am_pm=1;
00145         } else {
00146             if(HH==0)HH=12;
00147             am_pm=0;
00148         }
00149 
00150         set_rtc();
00151 
00152     } else if (chain[0]=='K') {
00153         CLK=1;
00154 
00155     } else if (chain[0]=='J') {
00156         PID=!PID;
00157 
00158     } else if (chain[0]=='k') {
00159         CLK=0;
00160         lcd.locate(0,0);
00161         lcd.printf("No device is");
00162         lcd.locate(0,1);
00163         lcd.printf("connected!");
00164     } else if (chain[0]=='j') {
00165         PID=0;
00166         lcd.locate(0,0);
00167         lcd.printf("No device is");
00168         lcd.locate(0,1);
00169         lcd.printf("connected!");
00170     }
00171 }
00172 
00173 /*
00174 Esta función es una ISR para recibir datos a través del puerto serial GSM
00175 
00176 */
00177 
00178 void in_data()
00179 {
00180     get_chain();
00181     master.printf("\r\n%s\r\n",chain);
00182     request();
00183     reset_var();
00184 }
00185 
00186 
00187 
00188 
00189 
00190 
00191 
00192 
00193 
00194 
00195 
00196 
00197 
00198 int main(void)
00199 {
00200 
00201     GSM.baud(9600);
00202     GSM.format(8,Serial::None,1);
00203     LedVerde=1.0;
00204 
00205     t.start();
00206     rtc_t.start();
00207 
00208     GSM.attach(&in_data, Serial::RxIrq);
00209     lcd.cls();
00210     lcd.locate(0,0);
00211     lcd.printf("Welcome!");
00212     lcd.locate(0,1);
00213     lcd.printf("RTC & PID");
00214     while(1) {
00215 
00216 
00217         vo = input.read_u16();// medición del voltaje de salida del circuito RCRC
00218         vo_hb=vo/256;       
00219         vo_lb=vo-vo_hb*256;    
00220         GSM.putc(vo_hb);
00221         GSM.putc(vo_hb);   // envío de los datos al celular por bluetooth
00222 
00223         if(t.read()>T && PID) { // PID indica que el celular se ha conectado por bluetooth
00224                                 // en la pantalla de configuración del PID.
00225             if(control=='N') { // si se recibió el comando para activar la acción de control, se ejecuta esta parte.
00226                 e=sp-1.0*input;
00227 
00228                 q0=Kp+Ki*T/2.0+Kd/T;
00229                 q1=-Kp+Ki*T/2.0-2.0*Kd/T;
00230                 q2=Kd/T;
00231 
00232                 u=u_1+q0*e+q1*e_1+q2*e_2;
00233 
00234                 u_1=u;
00235                 e_1=e;
00236                 e_2=e_1;
00237 
00238 
00239                 if(u>1.0)u=1.0;
00240                 else if(u<0.0)u=0.0;
00241                 LedVerde=0.0;
00242             } else {
00243                 u=0.0;
00244                 LedVerde=1.0;
00245             }
00246 
00247             u_control=u;
00248             t.stop();
00249             t.reset();
00250             t.start();
00251 
00252         } else if (t.read()>T && !PID) {
00253             u=0.0;
00254             LedVerde=1.0;
00255         }// end for  if(t.read()>T && PID)
00256 
00257 
00258 
00259         if(rtc_t.read()>=1.0 && CLK) {// se muestra la fecha y hora en el lcd se recibió el comando para leer el tiempo desde el RTC
00260 
00261             rtc.get_calendar(&fecha);
00262             rtc.get_time(&hora);
00263             if(aa==99 && fecha.year==0) {
00264                 AAAA++;
00265                 lcd.cls();
00266             }
00267             aa=fecha.year;
00268             if(hora.seconds==0)lcd.cls();
00269             if(hora.am_pm) {
00270                 master.printf("HORA: %d:%d:%d PM  ",hora.hours,hora.minutes,hora.seconds);
00271                 lcd.locate(14,0);
00272                 lcd.printf("PM");
00273             } else {
00274                 master.printf("HORA: %d:%d:%d AM    ",hora.hours,hora.minutes,hora.seconds);
00275                 lcd.locate(14,0);
00276                 lcd.printf("AM");
00277             }
00278             lcd.locate(0,0);
00279             lcd.printf("HORA %d:%d:%d",hora.hours,hora.minutes,hora.seconds);
00280             master.printf("FECHA %d / %d / %d \r\n",fecha.date,fecha.month,AAAA);
00281             lcd.locate(0,1);
00282             lcd.printf("FECHA %d/%d/%d",fecha.date,fecha.month,AAAA);
00283 
00284 
00285             rtc_t.stop();
00286             rtc_t.reset();
00287             rtc_t.start();
00288 
00289 
00290         } else if (rtc_t.read()>=0.1 && PID) { // se muestra el voltaje medido y el setpoint en el lcd si se recibió el comando de PID
00291 
00292             lcd.locate(0,0);
00293             lcd.printf("Voltaje: %.2f V",3.3*input.read());
00294             lcd.locate(0,1);
00295             lcd.printf("Set_point: %.2f V",3.3*sp);
00296             rtc_t.stop();
00297             rtc_t.reset();
00298             rtc_t.start();
00299         } else if(rtc_t.read()>=1.0 && !PID && !CLK) { // si no se recibió ningún comando, no se hace nada.
00300             
00301         }//end for if(rtc_t.read()>=1.0)
00302 
00303 
00304 
00305 
00306     }//end for while(1)
00307 }//end for void main()
00308 
00309 
00310 
00311