Nefer Miranda / Mbed 2 deprecated BLUETOOTH_RTC_PID

Dependencies:   mbed TextLCD

Committer:
nmirandal
Date:
Fri Apr 05 19:38:58 2019 +0000
Revision:
1:8596494b7d9d
Parent:
0:d66493246074
Child:
2:ecd33165145b
PID y RTC

Who changed what in which revision?

UserRevisionLine numberNew contents of line
caarbelaezg 0:d66493246074 1 #include "mbed.h"
caarbelaezg 0:d66493246074 2 #include <stdio.h>
nmirandal 1:8596494b7d9d 3 #include "ds3231.h"
nmirandal 1:8596494b7d9d 4 #include "TextLCD.h"
nmirandal 1:8596494b7d9d 5
nmirandal 1:8596494b7d9d 6 Serial master(USBTX,USBRX);// Tx, Rx Computador
nmirandal 1:8596494b7d9d 7 Serial GSM(PTE22,PTE23);// Tx, Rx Módulo de bluetooth
nmirandal 1:8596494b7d9d 8 Ds3231 rtc(A4, A5);
caarbelaezg 0:d66493246074 9
caarbelaezg 0:d66493246074 10
nmirandal 1:8596494b7d9d 11 /*
caarbelaezg 0:d66493246074 12 DigitalOut LedVerde(LED2);
caarbelaezg 0:d66493246074 13 DigitalOut LedRojo(LED1);
caarbelaezg 0:d66493246074 14 DigitalOut LedAzul(LED3);
nmirandal 1:8596494b7d9d 15 */
caarbelaezg 0:d66493246074 16
nmirandal 1:8596494b7d9d 17
nmirandal 1:8596494b7d9d 18 int vo, hb, lb;
nmirandal 1:8596494b7d9d 19 int P, I, D,S,AAAA=2000,MM,DD,wd=1,HH,mm,ss,mode,am_pm;
nmirandal 1:8596494b7d9d 20 float p,i,d,s,q0,q1,q2,e,e_1,e_2,u,u_1;
nmirandal 1:8596494b7d9d 21 char command[16], control='F';
nmirandal 1:8596494b7d9d 22 float Kp=12.0, Ki=5.0, Kd=0.02, sp=2.0/3.3, T=0.02;
nmirandal 1:8596494b7d9d 23 bool PID,CLK;
nmirandal 1:8596494b7d9d 24 uint8_t vo_lb, vo_hb, j, aa;
nmirandal 1:8596494b7d9d 25 uint16_t rtn_val;
nmirandal 1:8596494b7d9d 26 char chain[40], character;
nmirandal 1:8596494b7d9d 27
nmirandal 1:8596494b7d9d 28 ds3231_time_t hora = {HH,mm,ss=45,am_pm,mode};//{horas,minutos,segundos,AM/PM,12/24H}
nmirandal 1:8596494b7d9d 29 ds3231_calendar_t fecha= {AAAA,MM,DD,wd};//{años,mes,días,dia de semana}
nmirandal 1:8596494b7d9d 30
nmirandal 1:8596494b7d9d 31
nmirandal 1:8596494b7d9d 32 AnalogIn input(PTB1); // voltage measurement
nmirandal 1:8596494b7d9d 33 AnalogOut u_control(PTE30);// Input voltage for the circuit
nmirandal 1:8596494b7d9d 34 DigitalOut LedVerde(LED2);
nmirandal 1:8596494b7d9d 35
nmirandal 1:8596494b7d9d 36 TextLCD lcd(PTE5, PTE4, PTE3, PTE2, PTB11, PTB10); // rs, e, d4-d7
nmirandal 1:8596494b7d9d 37
nmirandal 1:8596494b7d9d 38 Timer k,t,rtc_t;
nmirandal 1:8596494b7d9d 39
nmirandal 1:8596494b7d9d 40 //########### Reads a incoming chain of characters #############################
nmirandal 1:8596494b7d9d 41 void get_chain()
nmirandal 1:8596494b7d9d 42 {
nmirandal 1:8596494b7d9d 43 j=0;
nmirandal 1:8596494b7d9d 44 k.start();
nmirandal 1:8596494b7d9d 45 while(1) {
nmirandal 1:8596494b7d9d 46
nmirandal 1:8596494b7d9d 47
nmirandal 1:8596494b7d9d 48 if(GSM.readable()) {
nmirandal 1:8596494b7d9d 49 character=GSM.getc();
nmirandal 1:8596494b7d9d 50 chain[j]=character;
nmirandal 1:8596494b7d9d 51
nmirandal 1:8596494b7d9d 52 j++;
nmirandal 1:8596494b7d9d 53 }
nmirandal 1:8596494b7d9d 54 if(k.read()>.2) {
nmirandal 1:8596494b7d9d 55 k.stop();
nmirandal 1:8596494b7d9d 56 k.reset();
nmirandal 1:8596494b7d9d 57 break;
nmirandal 1:8596494b7d9d 58 }
nmirandal 1:8596494b7d9d 59 }
nmirandal 1:8596494b7d9d 60 }
nmirandal 1:8596494b7d9d 61
nmirandal 1:8596494b7d9d 62 //############### Removes all the data in the buffer ###########################
nmirandal 1:8596494b7d9d 63 void reset_var()
nmirandal 1:8596494b7d9d 64 {
nmirandal 1:8596494b7d9d 65 for (int i=0; i<sizeof(chain); i++) {
nmirandal 1:8596494b7d9d 66 chain[i]='\0';
nmirandal 1:8596494b7d9d 67 }
nmirandal 1:8596494b7d9d 68 }
nmirandal 1:8596494b7d9d 69
nmirandal 1:8596494b7d9d 70
nmirandal 1:8596494b7d9d 71 //########### This function configures the RTC ################################
nmirandal 1:8596494b7d9d 72
nmirandal 1:8596494b7d9d 73 void set_rtc()
nmirandal 1:8596494b7d9d 74 {
nmirandal 1:8596494b7d9d 75 ds3231_time_t hora = {HH, mm, ss, am_pm, 1};
nmirandal 1:8596494b7d9d 76 ds3231_calendar_t fecha= {AAAA%100,MM,DD,wd};
nmirandal 1:8596494b7d9d 77
nmirandal 1:8596494b7d9d 78 if(!rtc.set_calendar(fecha)) {
nmirandal 1:8596494b7d9d 79
nmirandal 1:8596494b7d9d 80 master.printf("\r\n\r\n Reloj Configurado el %d / %d / %d ",DD,MM,AAAA);
nmirandal 1:8596494b7d9d 81
nmirandal 1:8596494b7d9d 82 if(!rtc.set_time(hora)) {
nmirandal 1:8596494b7d9d 83 if(hora.am_pm)master.printf("a las %d:%d:%d PM\r\n\r\n\r\n",HH,mm,ss);
nmirandal 1:8596494b7d9d 84 else master.printf("a las %d:%d:%d AM\r\n\r\n\r\n",HH,mm,ss);
nmirandal 1:8596494b7d9d 85 }
nmirandal 1:8596494b7d9d 86 }
nmirandal 1:8596494b7d9d 87
nmirandal 1:8596494b7d9d 88 }
nmirandal 1:8596494b7d9d 89
nmirandal 1:8596494b7d9d 90
nmirandal 1:8596494b7d9d 91 //############## This function processes the received data depending on what
nmirandal 1:8596494b7d9d 92 //############## it's suppoused to be for #####################################
nmirandal 1:8596494b7d9d 93
nmirandal 1:8596494b7d9d 94
nmirandal 1:8596494b7d9d 95 void request()
nmirandal 1:8596494b7d9d 96 {
nmirandal 1:8596494b7d9d 97 lcd.cls();
nmirandal 1:8596494b7d9d 98 if(chain[0]=='R') {
nmirandal 1:8596494b7d9d 99 control='N';
nmirandal 1:8596494b7d9d 100
nmirandal 1:8596494b7d9d 101
nmirandal 1:8596494b7d9d 102
nmirandal 1:8596494b7d9d 103 } else if (chain[0]=='S') {
nmirandal 1:8596494b7d9d 104 control='F';
nmirandal 1:8596494b7d9d 105
nmirandal 1:8596494b7d9d 106
nmirandal 1:8596494b7d9d 107
nmirandal 1:8596494b7d9d 108 } else if (chain[0]=='P') {
nmirandal 1:8596494b7d9d 109 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 110 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 111 Kp=P+p;
nmirandal 1:8596494b7d9d 112 Ki=I+i;
nmirandal 1:8596494b7d9d 113 Kd=D+d;
nmirandal 1:8596494b7d9d 114 sp=(S+s)/3.3;
nmirandal 1:8596494b7d9d 115 master.printf ("Kp= %f\r\nKi= %f\r\nKd= %f\r\nsp= %f\r\n",Kp,Ki,Kd,3.3*sp);
nmirandal 1:8596494b7d9d 116
nmirandal 1:8596494b7d9d 117
nmirandal 1:8596494b7d9d 118
nmirandal 1:8596494b7d9d 119 } else if (chain[0]=='A') {
nmirandal 1:8596494b7d9d 120 sscanf (chain,"%*s %d%*s %d%*s %d%*s %d%*s %d",&AAAA,&MM,&DD,&HH,&mm);
nmirandal 1:8596494b7d9d 121 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 122 if(HH>12) {
nmirandal 1:8596494b7d9d 123 HH=HH-12;
nmirandal 1:8596494b7d9d 124 am_pm=1;
nmirandal 1:8596494b7d9d 125 } else {
nmirandal 1:8596494b7d9d 126 if(HH==0)HH=12;
nmirandal 1:8596494b7d9d 127 am_pm=0;
nmirandal 1:8596494b7d9d 128 }
nmirandal 1:8596494b7d9d 129
nmirandal 1:8596494b7d9d 130 set_rtc();
nmirandal 1:8596494b7d9d 131
nmirandal 1:8596494b7d9d 132 } else if (chain[0]=='K') {
nmirandal 1:8596494b7d9d 133 CLK=1;
nmirandal 1:8596494b7d9d 134
nmirandal 1:8596494b7d9d 135 } else if (chain[0]=='J') {
nmirandal 1:8596494b7d9d 136 PID=!PID;
nmirandal 1:8596494b7d9d 137
nmirandal 1:8596494b7d9d 138 } else if (chain[0]=='k') {
nmirandal 1:8596494b7d9d 139 CLK=0;
nmirandal 1:8596494b7d9d 140 lcd.locate(0,0);
nmirandal 1:8596494b7d9d 141 lcd.printf("No device is");
nmirandal 1:8596494b7d9d 142 lcd.locate(0,1);
nmirandal 1:8596494b7d9d 143 lcd.printf("connected!");
nmirandal 1:8596494b7d9d 144 } else if (chain[0]=='j') {
nmirandal 1:8596494b7d9d 145 PID=0;
nmirandal 1:8596494b7d9d 146 lcd.locate(0,0);
nmirandal 1:8596494b7d9d 147 lcd.printf("No device is");
nmirandal 1:8596494b7d9d 148 lcd.locate(0,1);
nmirandal 1:8596494b7d9d 149 lcd.printf("connected!");
nmirandal 1:8596494b7d9d 150 }
nmirandal 1:8596494b7d9d 151 }
nmirandal 1:8596494b7d9d 152
nmirandal 1:8596494b7d9d 153 //############### This is a function which manages the incoming data ###########
nmirandal 1:8596494b7d9d 154
nmirandal 1:8596494b7d9d 155 void in_data()
nmirandal 1:8596494b7d9d 156 {
nmirandal 1:8596494b7d9d 157 get_chain();
nmirandal 1:8596494b7d9d 158 master.printf("\r\n%s\r\n",chain);
nmirandal 1:8596494b7d9d 159 request();
nmirandal 1:8596494b7d9d 160 reset_var();
nmirandal 1:8596494b7d9d 161 }
nmirandal 1:8596494b7d9d 162
nmirandal 1:8596494b7d9d 163
nmirandal 1:8596494b7d9d 164
nmirandal 1:8596494b7d9d 165
nmirandal 1:8596494b7d9d 166
nmirandal 1:8596494b7d9d 167
nmirandal 1:8596494b7d9d 168
nmirandal 1:8596494b7d9d 169
nmirandal 1:8596494b7d9d 170
nmirandal 1:8596494b7d9d 171 //########################################## Main starts here ##################
nmirandal 1:8596494b7d9d 172
nmirandal 1:8596494b7d9d 173
nmirandal 1:8596494b7d9d 174
caarbelaezg 0:d66493246074 175 int main(void)
nmirandal 1:8596494b7d9d 176 {
nmirandal 1:8596494b7d9d 177
nmirandal 1:8596494b7d9d 178 GSM.baud(9600);
nmirandal 1:8596494b7d9d 179 GSM.format(8,Serial::None,1);
nmirandal 1:8596494b7d9d 180 LedVerde=1.0;
nmirandal 1:8596494b7d9d 181
nmirandal 1:8596494b7d9d 182 t.start();
nmirandal 1:8596494b7d9d 183 rtc_t.start();
nmirandal 1:8596494b7d9d 184
nmirandal 1:8596494b7d9d 185 GSM.attach(&in_data, Serial::RxIrq);
nmirandal 1:8596494b7d9d 186 lcd.cls();
nmirandal 1:8596494b7d9d 187 lcd.locate(0,0);
nmirandal 1:8596494b7d9d 188 lcd.printf("Welcome!");
nmirandal 1:8596494b7d9d 189 lcd.locate(0,1);
nmirandal 1:8596494b7d9d 190 lcd.printf("RTC & PID");
nmirandal 1:8596494b7d9d 191 while(1) {
nmirandal 1:8596494b7d9d 192
nmirandal 1:8596494b7d9d 193
nmirandal 1:8596494b7d9d 194 vo = input.read_u16();
nmirandal 1:8596494b7d9d 195 vo_hb=vo/256; //calculo la cifra mas significativa
nmirandal 1:8596494b7d9d 196 vo_lb=vo-vo_hb*256; //calculo la cifra menos significativa
nmirandal 1:8596494b7d9d 197 GSM.putc(vo_hb);
nmirandal 1:8596494b7d9d 198 GSM.putc(vo_hb); //mas significativa primero, menos despues si no no funciona!!! y con la orden PUTC solo asi le envia binarios
nmirandal 1:8596494b7d9d 199
nmirandal 1:8596494b7d9d 200 /*
nmirandal 1:8596494b7d9d 201 vo_lb=vo&0xFF;
nmirandal 1:8596494b7d9d 202 vo_hb=vo>>8;
nmirandal 1:8596494b7d9d 203 GSM.putc(vo_lb);
nmirandal 1:8596494b7d9d 204 GSM.putc(vo_hb);
nmirandal 1:8596494b7d9d 205
nmirandal 1:8596494b7d9d 206 if(vo<256) { //debo generar dos casos a APP inventor solo me recibe hex asi: 0xhhhh (4 cifras)
nmirandal 1:8596494b7d9d 207 GSM.putc(0); //si el numero es hasta 255 se le ponen dos ceros adelante a la secuencia de bits
nmirandal 1:8596494b7d9d 208 GSM.putc(vo); //luego la cifra menos significativa
nmirandal 1:8596494b7d9d 209 }
nmirandal 1:8596494b7d9d 210 if(vo>255) { //pero si es mayor a 255 las cifras deben ser convertidas a un hex de dos bytes de la siguiente forma
nmirandal 1:8596494b7d9d 211 vo_hb=vo/256; //calculo la cifra mas significativa
nmirandal 1:8596494b7d9d 212 vo_lb=vo-vo_hb*256; //calculo la cifra menos significativa
nmirandal 1:8596494b7d9d 213 GSM.putc(vo_hb);
nmirandal 1:8596494b7d9d 214 GSM.putc(vo_hb); //mas significativa primero, menos despues si no no funciona!!! y con la orden PUTC solo asi le envia binarios
nmirandal 1:8596494b7d9d 215 }
nmirandal 1:8596494b7d9d 216
nmirandal 1:8596494b7d9d 217 */
nmirandal 1:8596494b7d9d 218 if(t.read()>T && PID) {
nmirandal 1:8596494b7d9d 219 if(control=='N') {
nmirandal 1:8596494b7d9d 220 e=sp-1.0*input;
nmirandal 1:8596494b7d9d 221
nmirandal 1:8596494b7d9d 222 q0=Kp+Ki*T/2.0+Kd/T;
nmirandal 1:8596494b7d9d 223 q1=-Kp+Ki*T/2.0-2.0*Kd/T;
nmirandal 1:8596494b7d9d 224 q2=Kd/T;
nmirandal 1:8596494b7d9d 225
nmirandal 1:8596494b7d9d 226 u=u_1+q0*e+q1*e_1+q2*e_2;
nmirandal 1:8596494b7d9d 227
nmirandal 1:8596494b7d9d 228 u_1=u;
nmirandal 1:8596494b7d9d 229 e_1=e;
nmirandal 1:8596494b7d9d 230 e_2=e_1;
nmirandal 1:8596494b7d9d 231
nmirandal 1:8596494b7d9d 232
nmirandal 1:8596494b7d9d 233 if(u>1.0)u=1.0;
nmirandal 1:8596494b7d9d 234 else if(u<0.0)u=0.0;
nmirandal 1:8596494b7d9d 235 LedVerde=0.0;
nmirandal 1:8596494b7d9d 236 } else {
nmirandal 1:8596494b7d9d 237 u=0.0;
nmirandal 1:8596494b7d9d 238 LedVerde=1.0;
nmirandal 1:8596494b7d9d 239 }
caarbelaezg 0:d66493246074 240
nmirandal 1:8596494b7d9d 241 u_control=u;
nmirandal 1:8596494b7d9d 242 t.stop();
nmirandal 1:8596494b7d9d 243 t.reset();
nmirandal 1:8596494b7d9d 244 t.start();
nmirandal 1:8596494b7d9d 245
nmirandal 1:8596494b7d9d 246 } else if (t.read()>T && PID) {
nmirandal 1:8596494b7d9d 247 u=0.0;
nmirandal 1:8596494b7d9d 248 LedVerde=1.0;
nmirandal 1:8596494b7d9d 249 }// end for if(t.read()>T)
nmirandal 1:8596494b7d9d 250
nmirandal 1:8596494b7d9d 251
nmirandal 1:8596494b7d9d 252
nmirandal 1:8596494b7d9d 253 if(rtc_t.read()>=1.0 && CLK) {
nmirandal 1:8596494b7d9d 254
nmirandal 1:8596494b7d9d 255 rtc.get_calendar(&fecha);
nmirandal 1:8596494b7d9d 256 rtc.get_time(&hora);
nmirandal 1:8596494b7d9d 257 if(aa==99 && fecha.year==0) {
nmirandal 1:8596494b7d9d 258 AAAA++;
nmirandal 1:8596494b7d9d 259 lcd.cls();
nmirandal 1:8596494b7d9d 260 }
nmirandal 1:8596494b7d9d 261 aa=fecha.year;
nmirandal 1:8596494b7d9d 262 if(hora.seconds==0)lcd.cls();
nmirandal 1:8596494b7d9d 263 if(hora.am_pm) {
nmirandal 1:8596494b7d9d 264 master.printf("HORA: %d:%d:%d PM ",hora.hours,hora.minutes,hora.seconds);
nmirandal 1:8596494b7d9d 265 lcd.locate(14,0);
nmirandal 1:8596494b7d9d 266 lcd.printf("PM");
nmirandal 1:8596494b7d9d 267 } else {
nmirandal 1:8596494b7d9d 268 master.printf("HORA: %d:%d:%d AM ",hora.hours,hora.minutes,hora.seconds);
nmirandal 1:8596494b7d9d 269 lcd.locate(14,0);
nmirandal 1:8596494b7d9d 270 lcd.printf("AM");
nmirandal 1:8596494b7d9d 271 }
nmirandal 1:8596494b7d9d 272 lcd.locate(0,0);
nmirandal 1:8596494b7d9d 273 lcd.printf("HORA %d:%d:%d",hora.hours,hora.minutes,hora.seconds);
nmirandal 1:8596494b7d9d 274 master.printf("FECHA %d / %d / %d \r\n",fecha.date,fecha.month,AAAA);
nmirandal 1:8596494b7d9d 275 lcd.locate(0,1);
nmirandal 1:8596494b7d9d 276 lcd.printf("FECHA %d/%d/%d",fecha.date,fecha.month,AAAA);
nmirandal 1:8596494b7d9d 277
nmirandal 1:8596494b7d9d 278
nmirandal 1:8596494b7d9d 279 rtc_t.stop();
nmirandal 1:8596494b7d9d 280 rtc_t.reset();
nmirandal 1:8596494b7d9d 281 rtc_t.start();
nmirandal 1:8596494b7d9d 282
nmirandal 1:8596494b7d9d 283
nmirandal 1:8596494b7d9d 284 } else if (rtc_t.read()>=0.1 && PID) {
nmirandal 1:8596494b7d9d 285
nmirandal 1:8596494b7d9d 286 lcd.locate(0,0);
nmirandal 1:8596494b7d9d 287 lcd.printf("Voltaje: %.2f V",3.3*input.read());
nmirandal 1:8596494b7d9d 288 lcd.locate(0,1);
nmirandal 1:8596494b7d9d 289 lcd.printf("Set_point: %.2f V",3.3*sp);
nmirandal 1:8596494b7d9d 290 rtc_t.stop();
nmirandal 1:8596494b7d9d 291 rtc_t.reset();
nmirandal 1:8596494b7d9d 292 rtc_t.start();
nmirandal 1:8596494b7d9d 293 } else if(rtc_t.read()>=1.0 && !PID && !CLK) {
nmirandal 1:8596494b7d9d 294 // lcd.cls();
nmirandal 1:8596494b7d9d 295 }//end for if(rtc_t.read()>=1.0)
nmirandal 1:8596494b7d9d 296
nmirandal 1:8596494b7d9d 297
nmirandal 1:8596494b7d9d 298
nmirandal 1:8596494b7d9d 299
nmirandal 1:8596494b7d9d 300 }//end for while(1)
nmirandal 1:8596494b7d9d 301 }//end for void main()
nmirandal 1:8596494b7d9d 302
nmirandal 1:8596494b7d9d 303
nmirandal 1:8596494b7d9d 304
nmirandal 1:8596494b7d9d 305