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.
Diff: main.cpp
- Revision:
- 1:8596494b7d9d
- Parent:
- 0:d66493246074
- Child:
- 2:ecd33165145b
--- a/main.cpp Fri Apr 24 03:18:03 2015 +0000 +++ b/main.cpp Fri Apr 05 19:38:58 2019 +0000 @@ -1,44 +1,305 @@ -//programa para enviar valores analogos y probarlos con app inventor -//el programa en esta oportunidad manda valores provenientes del puero analogico en -//enteros HEX (xxxx) entre 0 y 1000 -//se prueba con voltimetro1 .apk APPINVENTOR. cambie GSM A pc si quere probar directo sobre la pc - #include "mbed.h" #include <stdio.h> -//#include <conio.h> +#include "ds3231.h" +#include "TextLCD.h" + +Serial master(USBTX,USBRX);// Tx, Rx Computador +Serial GSM(PTE22,PTE23);// Tx, Rx Módulo de bluetooth +Ds3231 rtc(A4, A5); +/* DigitalOut LedVerde(LED2); DigitalOut LedRojo(LED1); DigitalOut LedAzul(LED3); +*/ -Serial GSM(PTE0,PTE1); //puertos del FRDM para el modem -Serial pc(USBTX,USBRX); -int med,num,i,j,k; -AnalogIn input(PTC2); - + +int vo, hb, lb; +int P, I, D,S,AAAA=2000,MM,DD,wd=1,HH,mm,ss,mode,am_pm; +float p,i,d,s,q0,q1,q2,e,e_1,e_2,u,u_1; +char command[16], control='F'; +float Kp=12.0, Ki=5.0, Kd=0.02, sp=2.0/3.3, T=0.02; +bool PID,CLK; +uint8_t vo_lb, vo_hb, j, aa; +uint16_t rtn_val; +char chain[40], character; + +ds3231_time_t hora = {HH,mm,ss=45,am_pm,mode};//{horas,minutos,segundos,AM/PM,12/24H} +ds3231_calendar_t fecha= {AAAA,MM,DD,wd};//{años,mes,días,dia de semana} + + +AnalogIn input(PTB1); // voltage measurement +AnalogOut u_control(PTE30);// Input voltage for the circuit +DigitalOut LedVerde(LED2); + +TextLCD lcd(PTE5, PTE4, PTE3, PTE2, PTB11, PTB10); // rs, e, d4-d7 + +Timer k,t,rtc_t; + +//########### Reads a incoming chain of characters ############################# +void get_chain() +{ + j=0; + k.start(); + while(1) { + + + if(GSM.readable()) { + character=GSM.getc(); + chain[j]=character; + + j++; + } + if(k.read()>.2) { + k.stop(); + k.reset(); + break; + } + } +} + +//############### Removes all the data in the buffer ########################### +void reset_var() +{ + for (int i=0; i<sizeof(chain); i++) { + chain[i]='\0'; + } +} + + +//########### This function configures the RTC ################################ + +void set_rtc() +{ + ds3231_time_t hora = {HH, mm, ss, am_pm, 1}; + ds3231_calendar_t fecha= {AAAA%100,MM,DD,wd}; + + if(!rtc.set_calendar(fecha)) { + + master.printf("\r\n\r\n Reloj Configurado el %d / %d / %d ",DD,MM,AAAA); + + if(!rtc.set_time(hora)) { + if(hora.am_pm)master.printf("a las %d:%d:%d PM\r\n\r\n\r\n",HH,mm,ss); + else master.printf("a las %d:%d:%d AM\r\n\r\n\r\n",HH,mm,ss); + } + } + +} + + +//############## This function processes the received data depending on what +//############## it's suppoused to be for ##################################### + + +void request() +{ + lcd.cls(); + if(chain[0]=='R') { + control='N'; + + + + } else if (chain[0]=='S') { + control='F'; + + + + } else if (chain[0]=='P') { + sscanf (chain,"%*s %d%f%*s %d%f%*s %d%f%*s %d%f",&P,&p,&I,&i,&D,&d,&S,&s); + 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); + Kp=P+p; + Ki=I+i; + Kd=D+d; + sp=(S+s)/3.3; + master.printf ("Kp= %f\r\nKi= %f\r\nKd= %f\r\nsp= %f\r\n",Kp,Ki,Kd,3.3*sp); + + + + } else if (chain[0]=='A') { + sscanf (chain,"%*s %d%*s %d%*s %d%*s %d%*s %d",&AAAA,&MM,&DD,&HH,&mm); + master.printf ("AAAA= %d\r\nMM= %d\r\nDD= %d\r\nHH= %d\r\nmm= %d\r\n",AAAA,MM,DD,HH,mm); + if(HH>12) { + HH=HH-12; + am_pm=1; + } else { + if(HH==0)HH=12; + am_pm=0; + } + + set_rtc(); + + } else if (chain[0]=='K') { + CLK=1; + + } else if (chain[0]=='J') { + PID=!PID; + + } else if (chain[0]=='k') { + CLK=0; + lcd.locate(0,0); + lcd.printf("No device is"); + lcd.locate(0,1); + lcd.printf("connected!"); + } else if (chain[0]=='j') { + PID=0; + lcd.locate(0,0); + lcd.printf("No device is"); + lcd.locate(0,1); + lcd.printf("connected!"); + } +} + +//############### This is a function which manages the incoming data ########### + +void in_data() +{ + get_chain(); + master.printf("\r\n%s\r\n",chain); + request(); + reset_var(); +} + + + + + + + + + +//########################################## Main starts here ################## + + + int main(void) - { - - GSM.baud(9600); // asigno baudios y configuro puerto serie de la usart - GSM.format(8,Serial::None,1); - - while(1){ - //leo puerto analogico - wait(0.5); - num = input*1000; //agrando el numero de cero a mil - //pc.printf("num=%d\n", num); +{ + + GSM.baud(9600); + GSM.format(8,Serial::None,1); + LedVerde=1.0; + + t.start(); + rtc_t.start(); + + GSM.attach(&in_data, Serial::RxIrq); + lcd.cls(); + lcd.locate(0,0); + lcd.printf("Welcome!"); + lcd.locate(0,1); + lcd.printf("RTC & PID"); + while(1) { + + + vo = input.read_u16(); + vo_hb=vo/256; //calculo la cifra mas significativa + vo_lb=vo-vo_hb*256; //calculo la cifra menos significativa + GSM.putc(vo_hb); + GSM.putc(vo_hb); //mas significativa primero, menos despues si no no funciona!!! y con la orden PUTC solo asi le envia binarios + + /* + vo_lb=vo&0xFF; + vo_hb=vo>>8; + GSM.putc(vo_lb); + GSM.putc(vo_hb); + + if(vo<256) { //debo generar dos casos a APP inventor solo me recibe hex asi: 0xhhhh (4 cifras) + GSM.putc(0); //si el numero es hasta 255 se le ponen dos ceros adelante a la secuencia de bits + GSM.putc(vo); //luego la cifra menos significativa + } + if(vo>255) { //pero si es mayor a 255 las cifras deben ser convertidas a un hex de dos bytes de la siguiente forma + vo_hb=vo/256; //calculo la cifra mas significativa + vo_lb=vo-vo_hb*256; //calculo la cifra menos significativa + GSM.putc(vo_hb); + GSM.putc(vo_hb); //mas significativa primero, menos despues si no no funciona!!! y con la orden PUTC solo asi le envia binarios + } + + */ + if(t.read()>T && PID) { + if(control=='N') { + e=sp-1.0*input; + + q0=Kp+Ki*T/2.0+Kd/T; + q1=-Kp+Ki*T/2.0-2.0*Kd/T; + q2=Kd/T; + + u=u_1+q0*e+q1*e_1+q2*e_2; + + u_1=u; + e_1=e; + e_2=e_1; + + + if(u>1.0)u=1.0; + else if(u<0.0)u=0.0; + LedVerde=0.0; + } else { + u=0.0; + LedVerde=1.0; + } - if(num<256){ //debo generar dos casos a APP inventor solo me recibe hex asi: 0xhhhh (4 cifras) - GSM.putc(0); //si el numero es hasta 255 se le ponen dos ceros adelante a la secuencia de bits - GSM.putc(i); //luego la cifra menos significativa - } - if(num>255){ //pero si es mayor a 255 las cifras deben ser convertidas a un hex de dos bytes de la siguiente forma - j=num/256; //calculo la cifra mas significativa - k=num-j*256; //calculo la cifra menos significativa - GSM.putc(j); //las envio a la usart para que se las ponga al modulo bluetooth y la lleve al android - GSM.putc(k); //mas significativa primero, menos despues si no no funciona!!! y con la orden PUTC solo asi le envia binarios - - } -} -} \ No newline at end of file + u_control=u; + t.stop(); + t.reset(); + t.start(); + + } else if (t.read()>T && PID) { + u=0.0; + LedVerde=1.0; + }// end for if(t.read()>T) + + + + if(rtc_t.read()>=1.0 && CLK) { + + rtc.get_calendar(&fecha); + rtc.get_time(&hora); + if(aa==99 && fecha.year==0) { + AAAA++; + lcd.cls(); + } + aa=fecha.year; + if(hora.seconds==0)lcd.cls(); + if(hora.am_pm) { + master.printf("HORA: %d:%d:%d PM ",hora.hours,hora.minutes,hora.seconds); + lcd.locate(14,0); + lcd.printf("PM"); + } else { + master.printf("HORA: %d:%d:%d AM ",hora.hours,hora.minutes,hora.seconds); + lcd.locate(14,0); + lcd.printf("AM"); + } + lcd.locate(0,0); + lcd.printf("HORA %d:%d:%d",hora.hours,hora.minutes,hora.seconds); + master.printf("FECHA %d / %d / %d \r\n",fecha.date,fecha.month,AAAA); + lcd.locate(0,1); + lcd.printf("FECHA %d/%d/%d",fecha.date,fecha.month,AAAA); + + + rtc_t.stop(); + rtc_t.reset(); + rtc_t.start(); + + + } else if (rtc_t.read()>=0.1 && PID) { + + lcd.locate(0,0); + lcd.printf("Voltaje: %.2f V",3.3*input.read()); + lcd.locate(0,1); + lcd.printf("Set_point: %.2f V",3.3*sp); + rtc_t.stop(); + rtc_t.reset(); + rtc_t.start(); + } else if(rtc_t.read()>=1.0 && !PID && !CLK) { + // lcd.cls(); + }//end for if(rtc_t.read()>=1.0) + + + + + }//end for while(1) +}//end for void main() + + + +