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

Dependencies:   mbed TextLCD

Committer:
nmirandal
Date:
Fri Apr 19 20:45:47 2019 +0000
Revision:
2:ecd33165145b
Parent:
1:8596494b7d9d
RTC and PID

Who changed what in which revision?

UserRevisionLine numberNew contents of line
nmirandal 2:ecd33165145b 1 /***************
nmirandal 2:ecd33165145b 2
nmirandal 2:ecd33165145b 3
nmirandal 2:ecd33165145b 4 ESTE PROGRAMA PUEDE SER USADO PARA CONFIGURAR UN RELOJ DE TIEMPO REAL DS3231 O
nmirandal 2:ecd33165145b 5 PARA COFIGURAR UN CONTROL PID PARA UN CIRCUITO RCRC CONECTADO EN EL PIN PTE30.
nmirandal 2:ecd33165145b 6 EL PROGRAMA FUE DISEÑADO PARA APERAR CON UNA APLICACIÓN DE ANDROID CREADA EN
nmirandal 2:ecd33165145b 7 APP INVENTOR QUE PUEDE CONECTARSE CON LA TARJETA FRDM-KL25Z A TRAVÉZ DE UN
nmirandal 2:ecd33165145b 8 MÓDULO DE BLUETOOTH CONECTADO EN EL PUERTO SERIAL UART2. CUANDO EL CELILAR SE
nmirandal 2:ecd33165145b 9 CONECTA PARA CONFIGURAR EL CONTROL PID, LA TARJETA ENVÍA LAS MEDIDAS DEL VOLTAJE
nmirandal 2:ecd33165145b 10 DE SALIDA DEL CIRCUITO. TANTO EN EL MODO RTC COMO EN EL MODO PID, LOS DATOS
nmirandal 2:ecd33165145b 11 SE MUESTRAN EN UNA PANTALLA LDC.
nmirandal 2:ecd33165145b 12
nmirandal 2:ecd33165145b 13 NEFER MIRANDA LLORENTE
nmirandal 2:ecd33165145b 14 PROGRAMA DE INGENIERÍA DE CONTROL
nmirandal 2:ecd33165145b 15 UNIVERSIDAD NACIONAL DE COLOMBIA - SEDE MEDELLÍN
nmirandal 2:ecd33165145b 16
nmirandal 2:ecd33165145b 17
nmirandal 2:ecd33165145b 18 ***************/
nmirandal 2:ecd33165145b 19
nmirandal 2:ecd33165145b 20
nmirandal 2:ecd33165145b 21
nmirandal 2:ecd33165145b 22
caarbelaezg 0:d66493246074 23 #include "mbed.h"
caarbelaezg 0:d66493246074 24 #include <stdio.h>
nmirandal 2:ecd33165145b 25 #include "ds3231_RTC.h"
nmirandal 1:8596494b7d9d 26 #include "TextLCD.h"
nmirandal 1:8596494b7d9d 27
nmirandal 1:8596494b7d9d 28 Serial master(USBTX,USBRX);// Tx, Rx Computador
nmirandal 1:8596494b7d9d 29 Serial GSM(PTE22,PTE23);// Tx, Rx Módulo de bluetooth
nmirandal 2:ecd33165145b 30 Ds3231 rtc(A4, A5); // puerto I2C1 de la frdm-kl25z
caarbelaezg 0:d66493246074 31
nmirandal 1:8596494b7d9d 32
nmirandal 1:8596494b7d9d 33 int vo, hb, lb;
nmirandal 1:8596494b7d9d 34 int P, I, D,S,AAAA=2000,MM,DD,wd=1,HH,mm,ss,mode,am_pm;
nmirandal 1:8596494b7d9d 35 float p,i,d,s,q0,q1,q2,e,e_1,e_2,u,u_1;
nmirandal 1:8596494b7d9d 36 char command[16], control='F';
nmirandal 1:8596494b7d9d 37 float Kp=12.0, Ki=5.0, Kd=0.02, sp=2.0/3.3, T=0.02;
nmirandal 1:8596494b7d9d 38 bool PID,CLK;
nmirandal 1:8596494b7d9d 39 uint8_t vo_lb, vo_hb, j, aa;
nmirandal 1:8596494b7d9d 40 uint16_t rtn_val;
nmirandal 1:8596494b7d9d 41 char chain[40], character;
nmirandal 1:8596494b7d9d 42
nmirandal 1:8596494b7d9d 43 ds3231_time_t hora = {HH,mm,ss=45,am_pm,mode};//{horas,minutos,segundos,AM/PM,12/24H}
nmirandal 1:8596494b7d9d 44 ds3231_calendar_t fecha= {AAAA,MM,DD,wd};//{años,mes,días,dia de semana}
nmirandal 1:8596494b7d9d 45
nmirandal 1:8596494b7d9d 46
nmirandal 2:ecd33165145b 47 AnalogIn input(PTB1); // puerto para medir el voltaje del circuito
nmirandal 2:ecd33165145b 48 AnalogOut u_control(PTE30);// puerto a través del cual se aplica una entrada al circuito
nmirandal 2:ecd33165145b 49 DigitalOut LedVerde(LED2); // led indicador de estado del circuito
nmirandal 1:8596494b7d9d 50
nmirandal 2:ecd33165145b 51 TextLCD lcd(PTE5, PTE4, PTE3, PTE2, PTB11, PTB10); // conexión ldc (rs, e, d4-d7)
nmirandal 1:8596494b7d9d 52
nmirandal 1:8596494b7d9d 53 Timer k,t,rtc_t;
nmirandal 1:8596494b7d9d 54
nmirandal 2:ecd33165145b 55 //## Esta rutina lee una cadena de caracteres disponible en el puerto serial GSM ######
nmirandal 1:8596494b7d9d 56 void get_chain()
nmirandal 1:8596494b7d9d 57 {
nmirandal 1:8596494b7d9d 58 j=0;
nmirandal 1:8596494b7d9d 59 k.start();
nmirandal 1:8596494b7d9d 60 while(1) {
nmirandal 1:8596494b7d9d 61
nmirandal 1:8596494b7d9d 62
nmirandal 1:8596494b7d9d 63 if(GSM.readable()) {
nmirandal 1:8596494b7d9d 64 character=GSM.getc();
nmirandal 1:8596494b7d9d 65 chain[j]=character;
nmirandal 1:8596494b7d9d 66
nmirandal 1:8596494b7d9d 67 j++;
nmirandal 1:8596494b7d9d 68 }
nmirandal 1:8596494b7d9d 69 if(k.read()>.2) {
nmirandal 1:8596494b7d9d 70 k.stop();
nmirandal 1:8596494b7d9d 71 k.reset();
nmirandal 1:8596494b7d9d 72 break;
nmirandal 1:8596494b7d9d 73 }
nmirandal 1:8596494b7d9d 74 }
nmirandal 1:8596494b7d9d 75 }
nmirandal 1:8596494b7d9d 76
nmirandal 2:ecd33165145b 77 //###### Esta función limpia la variable chain ########
nmirandal 1:8596494b7d9d 78 void reset_var()
nmirandal 1:8596494b7d9d 79 {
nmirandal 1:8596494b7d9d 80 for (int i=0; i<sizeof(chain); i++) {
nmirandal 1:8596494b7d9d 81 chain[i]='\0';
nmirandal 1:8596494b7d9d 82 }
nmirandal 1:8596494b7d9d 83 }
nmirandal 1:8596494b7d9d 84
nmirandal 1:8596494b7d9d 85
nmirandal 2:ecd33165145b 86 //#### Esta función configura el reloj de tiempo real cuando se recibe un nuevo
nmirandal 2:ecd33165145b 87 //#### dato de fecha y hora a través de bluetooth###
nmirandal 1:8596494b7d9d 88
nmirandal 1:8596494b7d9d 89 void set_rtc()
nmirandal 1:8596494b7d9d 90 {
nmirandal 1:8596494b7d9d 91 ds3231_time_t hora = {HH, mm, ss, am_pm, 1};
nmirandal 1:8596494b7d9d 92 ds3231_calendar_t fecha= {AAAA%100,MM,DD,wd};
nmirandal 1:8596494b7d9d 93
nmirandal 2:ecd33165145b 94 if(!rtc.set_calendar(fecha)) { // se ejcuta si la configuración de la fecha es exitosa
nmirandal 2:ecd33165145b 95 // se imprime en la terminal del pc la fecha y hora a la cual se configuró el RTC
nmirandal 1:8596494b7d9d 96
nmirandal 1:8596494b7d9d 97 master.printf("\r\n\r\n Reloj Configurado el %d / %d / %d ",DD,MM,AAAA);
nmirandal 1:8596494b7d9d 98
nmirandal 2:ecd33165145b 99 if(!rtc.set_time(hora)) { // se ejcuta si la configuración de la hora es exitosa
nmirandal 1:8596494b7d9d 100 if(hora.am_pm)master.printf("a las %d:%d:%d PM\r\n\r\n\r\n",HH,mm,ss);
nmirandal 1:8596494b7d9d 101 else master.printf("a las %d:%d:%d AM\r\n\r\n\r\n",HH,mm,ss);
nmirandal 1:8596494b7d9d 102 }
nmirandal 1:8596494b7d9d 103 }
nmirandal 1:8596494b7d9d 104
nmirandal 1:8596494b7d9d 105 }
nmirandal 1:8596494b7d9d 106
nmirandal 1:8596494b7d9d 107
nmirandal 2:ecd33165145b 108 /* La función request() se encarga de interpretar el dato que se ha recibido
nmirandal 2:ecd33165145b 109 a través del puerto serial GSM, este puede tener la función de configurar el
nmirandal 2:ecd33165145b 110 modulo RTC, configurar un control PID, activar o desactivar la señal de entrada
nmirandal 2:ecd33165145b 111 del circuito RCRC, o notificar si el celular se ha conectado o desconectado a
nmirandal 2:ecd33165145b 112 través de bluetooth.
nmirandal 1:8596494b7d9d 113
nmirandal 2:ecd33165145b 114 */
nmirandal 1:8596494b7d9d 115 void request()
nmirandal 1:8596494b7d9d 116 {
nmirandal 1:8596494b7d9d 117 lcd.cls();
nmirandal 1:8596494b7d9d 118 if(chain[0]=='R') {
nmirandal 1:8596494b7d9d 119 control='N';
nmirandal 1:8596494b7d9d 120
nmirandal 1:8596494b7d9d 121
nmirandal 1:8596494b7d9d 122
nmirandal 1:8596494b7d9d 123 } else if (chain[0]=='S') {
nmirandal 1:8596494b7d9d 124 control='F';
nmirandal 1:8596494b7d9d 125
nmirandal 1:8596494b7d9d 126
nmirandal 1:8596494b7d9d 127
nmirandal 1:8596494b7d9d 128 } else if (chain[0]=='P') {
nmirandal 1:8596494b7d9d 129 sscanf (chain,"%*s %d%f%*s %d%f%*s %d%f%*s %d%f",&P,&p,&I,&i,&D,&d,&S,&s);
nmirandal 1:8596494b7d9d 130 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);
nmirandal 1:8596494b7d9d 131 Kp=P+p;
nmirandal 1:8596494b7d9d 132 Ki=I+i;
nmirandal 1:8596494b7d9d 133 Kd=D+d;
nmirandal 1:8596494b7d9d 134 sp=(S+s)/3.3;
nmirandal 1:8596494b7d9d 135 master.printf ("Kp= %f\r\nKi= %f\r\nKd= %f\r\nsp= %f\r\n",Kp,Ki,Kd,3.3*sp);
nmirandal 1:8596494b7d9d 136
nmirandal 1:8596494b7d9d 137
nmirandal 1:8596494b7d9d 138
nmirandal 1:8596494b7d9d 139 } else if (chain[0]=='A') {
nmirandal 1:8596494b7d9d 140 sscanf (chain,"%*s %d%*s %d%*s %d%*s %d%*s %d",&AAAA,&MM,&DD,&HH,&mm);
nmirandal 1:8596494b7d9d 141 master.printf ("AAAA= %d\r\nMM= %d\r\nDD= %d\r\nHH= %d\r\nmm= %d\r\n",AAAA,MM,DD,HH,mm);
nmirandal 1:8596494b7d9d 142 if(HH>12) {
nmirandal 1:8596494b7d9d 143 HH=HH-12;
nmirandal 1:8596494b7d9d 144 am_pm=1;
nmirandal 1:8596494b7d9d 145 } else {
nmirandal 1:8596494b7d9d 146 if(HH==0)HH=12;
nmirandal 1:8596494b7d9d 147 am_pm=0;
nmirandal 1:8596494b7d9d 148 }
nmirandal 1:8596494b7d9d 149
nmirandal 1:8596494b7d9d 150 set_rtc();
nmirandal 1:8596494b7d9d 151
nmirandal 1:8596494b7d9d 152 } else if (chain[0]=='K') {
nmirandal 1:8596494b7d9d 153 CLK=1;
nmirandal 1:8596494b7d9d 154
nmirandal 1:8596494b7d9d 155 } else if (chain[0]=='J') {
nmirandal 1:8596494b7d9d 156 PID=!PID;
nmirandal 1:8596494b7d9d 157
nmirandal 1:8596494b7d9d 158 } else if (chain[0]=='k') {
nmirandal 1:8596494b7d9d 159 CLK=0;
nmirandal 1:8596494b7d9d 160 lcd.locate(0,0);
nmirandal 1:8596494b7d9d 161 lcd.printf("No device is");
nmirandal 1:8596494b7d9d 162 lcd.locate(0,1);
nmirandal 1:8596494b7d9d 163 lcd.printf("connected!");
nmirandal 1:8596494b7d9d 164 } else if (chain[0]=='j') {
nmirandal 1:8596494b7d9d 165 PID=0;
nmirandal 1:8596494b7d9d 166 lcd.locate(0,0);
nmirandal 1:8596494b7d9d 167 lcd.printf("No device is");
nmirandal 1:8596494b7d9d 168 lcd.locate(0,1);
nmirandal 1:8596494b7d9d 169 lcd.printf("connected!");
nmirandal 1:8596494b7d9d 170 }
nmirandal 1:8596494b7d9d 171 }
nmirandal 1:8596494b7d9d 172
nmirandal 2:ecd33165145b 173 /*
nmirandal 2:ecd33165145b 174 Esta función es una ISR para recibir datos a través del puerto serial GSM
nmirandal 2:ecd33165145b 175
nmirandal 2:ecd33165145b 176 */
nmirandal 1:8596494b7d9d 177
nmirandal 1:8596494b7d9d 178 void in_data()
nmirandal 1:8596494b7d9d 179 {
nmirandal 1:8596494b7d9d 180 get_chain();
nmirandal 1:8596494b7d9d 181 master.printf("\r\n%s\r\n",chain);
nmirandal 1:8596494b7d9d 182 request();
nmirandal 1:8596494b7d9d 183 reset_var();
nmirandal 1:8596494b7d9d 184 }
nmirandal 1:8596494b7d9d 185
nmirandal 1:8596494b7d9d 186
nmirandal 1:8596494b7d9d 187
nmirandal 1:8596494b7d9d 188
nmirandal 1:8596494b7d9d 189
nmirandal 1:8596494b7d9d 190
nmirandal 1:8596494b7d9d 191
nmirandal 1:8596494b7d9d 192
nmirandal 1:8596494b7d9d 193
nmirandal 2:ecd33165145b 194
nmirandal 1:8596494b7d9d 195
nmirandal 1:8596494b7d9d 196
nmirandal 1:8596494b7d9d 197
caarbelaezg 0:d66493246074 198 int main(void)
nmirandal 1:8596494b7d9d 199 {
nmirandal 1:8596494b7d9d 200
nmirandal 1:8596494b7d9d 201 GSM.baud(9600);
nmirandal 1:8596494b7d9d 202 GSM.format(8,Serial::None,1);
nmirandal 1:8596494b7d9d 203 LedVerde=1.0;
nmirandal 1:8596494b7d9d 204
nmirandal 1:8596494b7d9d 205 t.start();
nmirandal 1:8596494b7d9d 206 rtc_t.start();
nmirandal 1:8596494b7d9d 207
nmirandal 1:8596494b7d9d 208 GSM.attach(&in_data, Serial::RxIrq);
nmirandal 1:8596494b7d9d 209 lcd.cls();
nmirandal 1:8596494b7d9d 210 lcd.locate(0,0);
nmirandal 1:8596494b7d9d 211 lcd.printf("Welcome!");
nmirandal 1:8596494b7d9d 212 lcd.locate(0,1);
nmirandal 1:8596494b7d9d 213 lcd.printf("RTC & PID");
nmirandal 1:8596494b7d9d 214 while(1) {
nmirandal 1:8596494b7d9d 215
nmirandal 1:8596494b7d9d 216
nmirandal 2:ecd33165145b 217 vo = input.read_u16();// medición del voltaje de salida del circuito RCRC
nmirandal 2:ecd33165145b 218 vo_hb=vo/256;
nmirandal 2:ecd33165145b 219 vo_lb=vo-vo_hb*256;
nmirandal 1:8596494b7d9d 220 GSM.putc(vo_hb);
nmirandal 2:ecd33165145b 221 GSM.putc(vo_hb); // envío de los datos al celular por bluetooth
nmirandal 1:8596494b7d9d 222
nmirandal 2:ecd33165145b 223 if(t.read()>T && PID) { // PID indica que el celular se ha conectado por bluetooth
nmirandal 2:ecd33165145b 224 // en la pantalla de configuración del PID.
nmirandal 2:ecd33165145b 225 if(control=='N') { // si se recibió el comando para activar la acción de control, se ejecuta esta parte.
nmirandal 1:8596494b7d9d 226 e=sp-1.0*input;
nmirandal 1:8596494b7d9d 227
nmirandal 1:8596494b7d9d 228 q0=Kp+Ki*T/2.0+Kd/T;
nmirandal 1:8596494b7d9d 229 q1=-Kp+Ki*T/2.0-2.0*Kd/T;
nmirandal 1:8596494b7d9d 230 q2=Kd/T;
nmirandal 1:8596494b7d9d 231
nmirandal 1:8596494b7d9d 232 u=u_1+q0*e+q1*e_1+q2*e_2;
nmirandal 1:8596494b7d9d 233
nmirandal 1:8596494b7d9d 234 u_1=u;
nmirandal 1:8596494b7d9d 235 e_1=e;
nmirandal 1:8596494b7d9d 236 e_2=e_1;
nmirandal 1:8596494b7d9d 237
nmirandal 1:8596494b7d9d 238
nmirandal 1:8596494b7d9d 239 if(u>1.0)u=1.0;
nmirandal 1:8596494b7d9d 240 else if(u<0.0)u=0.0;
nmirandal 1:8596494b7d9d 241 LedVerde=0.0;
nmirandal 1:8596494b7d9d 242 } else {
nmirandal 1:8596494b7d9d 243 u=0.0;
nmirandal 1:8596494b7d9d 244 LedVerde=1.0;
nmirandal 1:8596494b7d9d 245 }
caarbelaezg 0:d66493246074 246
nmirandal 1:8596494b7d9d 247 u_control=u;
nmirandal 1:8596494b7d9d 248 t.stop();
nmirandal 1:8596494b7d9d 249 t.reset();
nmirandal 1:8596494b7d9d 250 t.start();
nmirandal 1:8596494b7d9d 251
nmirandal 2:ecd33165145b 252 } else if (t.read()>T && !PID) {
nmirandal 1:8596494b7d9d 253 u=0.0;
nmirandal 1:8596494b7d9d 254 LedVerde=1.0;
nmirandal 2:ecd33165145b 255 }// end for if(t.read()>T && PID)
nmirandal 1:8596494b7d9d 256
nmirandal 1:8596494b7d9d 257
nmirandal 1:8596494b7d9d 258
nmirandal 2:ecd33165145b 259 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
nmirandal 1:8596494b7d9d 260
nmirandal 1:8596494b7d9d 261 rtc.get_calendar(&fecha);
nmirandal 1:8596494b7d9d 262 rtc.get_time(&hora);
nmirandal 1:8596494b7d9d 263 if(aa==99 && fecha.year==0) {
nmirandal 1:8596494b7d9d 264 AAAA++;
nmirandal 1:8596494b7d9d 265 lcd.cls();
nmirandal 1:8596494b7d9d 266 }
nmirandal 1:8596494b7d9d 267 aa=fecha.year;
nmirandal 1:8596494b7d9d 268 if(hora.seconds==0)lcd.cls();
nmirandal 1:8596494b7d9d 269 if(hora.am_pm) {
nmirandal 1:8596494b7d9d 270 master.printf("HORA: %d:%d:%d PM ",hora.hours,hora.minutes,hora.seconds);
nmirandal 1:8596494b7d9d 271 lcd.locate(14,0);
nmirandal 1:8596494b7d9d 272 lcd.printf("PM");
nmirandal 1:8596494b7d9d 273 } else {
nmirandal 1:8596494b7d9d 274 master.printf("HORA: %d:%d:%d AM ",hora.hours,hora.minutes,hora.seconds);
nmirandal 1:8596494b7d9d 275 lcd.locate(14,0);
nmirandal 1:8596494b7d9d 276 lcd.printf("AM");
nmirandal 1:8596494b7d9d 277 }
nmirandal 1:8596494b7d9d 278 lcd.locate(0,0);
nmirandal 1:8596494b7d9d 279 lcd.printf("HORA %d:%d:%d",hora.hours,hora.minutes,hora.seconds);
nmirandal 1:8596494b7d9d 280 master.printf("FECHA %d / %d / %d \r\n",fecha.date,fecha.month,AAAA);
nmirandal 1:8596494b7d9d 281 lcd.locate(0,1);
nmirandal 1:8596494b7d9d 282 lcd.printf("FECHA %d/%d/%d",fecha.date,fecha.month,AAAA);
nmirandal 1:8596494b7d9d 283
nmirandal 1:8596494b7d9d 284
nmirandal 1:8596494b7d9d 285 rtc_t.stop();
nmirandal 1:8596494b7d9d 286 rtc_t.reset();
nmirandal 1:8596494b7d9d 287 rtc_t.start();
nmirandal 1:8596494b7d9d 288
nmirandal 1:8596494b7d9d 289
nmirandal 2:ecd33165145b 290 } 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
nmirandal 1:8596494b7d9d 291
nmirandal 1:8596494b7d9d 292 lcd.locate(0,0);
nmirandal 1:8596494b7d9d 293 lcd.printf("Voltaje: %.2f V",3.3*input.read());
nmirandal 1:8596494b7d9d 294 lcd.locate(0,1);
nmirandal 1:8596494b7d9d 295 lcd.printf("Set_point: %.2f V",3.3*sp);
nmirandal 1:8596494b7d9d 296 rtc_t.stop();
nmirandal 1:8596494b7d9d 297 rtc_t.reset();
nmirandal 1:8596494b7d9d 298 rtc_t.start();
nmirandal 2:ecd33165145b 299 } else if(rtc_t.read()>=1.0 && !PID && !CLK) { // si no se recibió ningún comando, no se hace nada.
nmirandal 2:ecd33165145b 300
nmirandal 1:8596494b7d9d 301 }//end for if(rtc_t.read()>=1.0)
nmirandal 1:8596494b7d9d 302
nmirandal 1:8596494b7d9d 303
nmirandal 1:8596494b7d9d 304
nmirandal 1:8596494b7d9d 305
nmirandal 1:8596494b7d9d 306 }//end for while(1)
nmirandal 1:8596494b7d9d 307 }//end for void main()
nmirandal 1:8596494b7d9d 308
nmirandal 1:8596494b7d9d 309
nmirandal 1:8596494b7d9d 310
nmirandal 1:8596494b7d9d 311