Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
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
Generated on Sat Jul 23 2022 23:19:24 by
1.7.2