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
diff -r d66493246074 -r 8596494b7d9d main.cpp
--- 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()
+
+
+
+