Programa para enviar datos al controlador desde dispositivo android via bluetooth

Dependencies:   mbed

Committer:
luaagudeloga
Date:
Wed Jun 26 15:25:07 2019 +0000
Revision:
0:77a7770a1787
Programa para mandar datos al PID y controlar voltaje en un capacitor

Who changed what in which revision?

UserRevisionLine numberNew contents of line
luaagudeloga 0:77a7770a1787 1 //PROGRAMA PARA CONTROLAR EL VOLTAJE DE UN CAPACITOR EN UN CIRCUITO RC DESDE DISPOSITIVO ANDROID
luaagudeloga 0:77a7770a1787 2 //ENVIAR LOS VALORES SEPARADOS POR COMAS
luaagudeloga 0:77a7770a1787 3 #include "mbed.h"
luaagudeloga 0:77a7770a1787 4 #include "stdio.h"
luaagudeloga 0:77a7770a1787 5 #include "string.h"
luaagudeloga 0:77a7770a1787 6 #include "stdlib.h"
luaagudeloga 0:77a7770a1787 7
luaagudeloga 0:77a7770a1787 8 //Variables y parametros del control PID
luaagudeloga 0:77a7770a1787 9 int Kp=0,Ki=0,Kd=0;
luaagudeloga 0:77a7770a1787 10 float Sp=0;//set point
luaagudeloga 0:77a7770a1787 11 float ai,ek,ad,ap,err_v,o,yT,uk=0,Ts=0.01;
luaagudeloga 0:77a7770a1787 12
luaagudeloga 0:77a7770a1787 13 AnalogIn Vc(PTB0);//voltaje condensador
luaagudeloga 0:77a7770a1787 14 PwmOut uc(PTE20); //accion de control
luaagudeloga 0:77a7770a1787 15 Serial GSM(PTE0,PTE1); //puertos del FRDM para el modulo BLUETOOTH
luaagudeloga 0:77a7770a1787 16 Serial pc(USBTX,USBRX); //puertos del PC
luaagudeloga 0:77a7770a1787 17 char buffer[30];// TAMAÑO DEL BUFER
luaagudeloga 0:77a7770a1787 18 Timer t; //VALOR DEL TIEMPO
luaagudeloga 0:77a7770a1787 19 int count;
luaagudeloga 0:77a7770a1787 20 int i = 0;
luaagudeloga 0:77a7770a1787 21 int c=0;
luaagudeloga 0:77a7770a1787 22 char r[]="";
luaagudeloga 0:77a7770a1787 23 DigitalOut LedRojo(LED1);
luaagudeloga 0:77a7770a1787 24 DigitalOut LedVerde(LED2);
luaagudeloga 0:77a7770a1787 25 DigitalOut LedAzul(LED3);
luaagudeloga 0:77a7770a1787 26
luaagudeloga 0:77a7770a1787 27 int readBuffer(char *buffer,int count) //esta funcion lee un bufer de datos
luaagudeloga 0:77a7770a1787 28 {
luaagudeloga 0:77a7770a1787 29 int i=0;
luaagudeloga 0:77a7770a1787 30 t.start(); //CUENTA EL TIEMPO DE CONEXION E INICIA
luaagudeloga 0:77a7770a1787 31 while(1) {
luaagudeloga 0:77a7770a1787 32 while (GSM.readable()) {
luaagudeloga 0:77a7770a1787 33 char c = GSM.getc();
luaagudeloga 0:77a7770a1787 34 if (c == '\r' || c == '\n') c = '$';//si se envia fin de linea o de caracter inserta $
luaagudeloga 0:77a7770a1787 35 buffer[i++] = c;//mete al bufer el caracter leido
luaagudeloga 0:77a7770a1787 36 if(i > count)break;//sale del loop si ya detecto terminacion
luaagudeloga 0:77a7770a1787 37 }
luaagudeloga 0:77a7770a1787 38 if(i > count)break;
luaagudeloga 0:77a7770a1787 39 if(t.read() > 1) { //MAS DE UN SEGUNDO DE ESPERA SE SALE Y REINICA EL RELOJ Y SE SALE
luaagudeloga 0:77a7770a1787 40 t.stop();
luaagudeloga 0:77a7770a1787 41 t.reset();
luaagudeloga 0:77a7770a1787 42 break;
luaagudeloga 0:77a7770a1787 43 }
luaagudeloga 0:77a7770a1787 44 }
luaagudeloga 0:77a7770a1787 45 return 0;
luaagudeloga 0:77a7770a1787 46 }
luaagudeloga 0:77a7770a1787 47
luaagudeloga 0:77a7770a1787 48 void cleanBuffer(char *buffer, int count) //esta funcion limpia el bufer
luaagudeloga 0:77a7770a1787 49 {
luaagudeloga 0:77a7770a1787 50 for(int i=0; i < count; i++) {
luaagudeloga 0:77a7770a1787 51 buffer[i] = '\0';
luaagudeloga 0:77a7770a1787 52 }
luaagudeloga 0:77a7770a1787 53 }
luaagudeloga 0:77a7770a1787 54 int main() {
luaagudeloga 0:77a7770a1787 55
luaagudeloga 0:77a7770a1787 56 LedVerde=1;
luaagudeloga 0:77a7770a1787 57 LedRojo=1;
luaagudeloga 0:77a7770a1787 58 LedAzul=1;
luaagudeloga 0:77a7770a1787 59 LedRojo=0;
luaagudeloga 0:77a7770a1787 60 wait(2); //PRENDE EL LED ROJO POR 2 SEGUNDOS
luaagudeloga 0:77a7770a1787 61 LedRojo=1;
luaagudeloga 0:77a7770a1787 62 GSM.baud(9600);
luaagudeloga 0:77a7770a1787 63 GSM.format(8,Serial::None,1);
luaagudeloga 0:77a7770a1787 64
luaagudeloga 0:77a7770a1787 65 GSM.printf("Enviar los valores Kp,Ki,Kd,Sp separados por comas \n");
luaagudeloga 0:77a7770a1787 66
luaagudeloga 0:77a7770a1787 67 DEF_CONST:
luaagudeloga 0:77a7770a1787 68
luaagudeloga 0:77a7770a1787 69 if (GSM.readable()) {
luaagudeloga 0:77a7770a1787 70 readBuffer(buffer,20);
luaagudeloga 0:77a7770a1787 71 GSM.printf("Enviar los valores Kp,Ki,Kd,Sp separados por comas \n");
luaagudeloga 0:77a7770a1787 72 sscanf( buffer, "%d, %d, %d, %f", &Kp, &Ki, &Kd, &Sp);
luaagudeloga 0:77a7770a1787 73 GSM.printf("%d, %d, %d, %.1f\n", Kp,Ki,Kd,Sp);
luaagudeloga 0:77a7770a1787 74 }
luaagudeloga 0:77a7770a1787 75
luaagudeloga 0:77a7770a1787 76 if(Kp == 0){
luaagudeloga 0:77a7770a1787 77 goto DEF_CONST;
luaagudeloga 0:77a7770a1787 78 }else{
luaagudeloga 0:77a7770a1787 79 goto PID;
luaagudeloga 0:77a7770a1787 80 }
luaagudeloga 0:77a7770a1787 81
luaagudeloga 0:77a7770a1787 82 PID:
luaagudeloga 0:77a7770a1787 83
luaagudeloga 0:77a7770a1787 84
luaagudeloga 0:77a7770a1787 85 while(1){
luaagudeloga 0:77a7770a1787 86 yT=Vc.read()*3.3;
luaagudeloga 0:77a7770a1787 87 ek=Sp-yT;
luaagudeloga 0:77a7770a1787 88
luaagudeloga 0:77a7770a1787 89 ap = Kp*ek*0.01f; //se calcula la accion proporcinal
luaagudeloga 0:77a7770a1787 90 ai =(Ki*ek*0.01f)+ai; //calculo de la integral del error
luaagudeloga 0:77a7770a1787 91 ad = Kd*(ek-err_v)*0.01f; //calculo de la accion derivativa
luaagudeloga 0:77a7770a1787 92 uk = (ap+ai+ad);
luaagudeloga 0:77a7770a1787 93
luaagudeloga 0:77a7770a1787 94 // se verifica que pid sea positivo **************************************
luaagudeloga 0:77a7770a1787 95 if(uk<=0)
luaagudeloga 0:77a7770a1787 96 {
luaagudeloga 0:77a7770a1787 97 uk=0;
luaagudeloga 0:77a7770a1787 98 }
luaagudeloga 0:77a7770a1787 99
luaagudeloga 0:77a7770a1787 100 // se verifica que pid sea menor o igual la valor maximo *****************
luaagudeloga 0:77a7770a1787 101 if (uk > 3.3)
luaagudeloga 0:77a7770a1787 102 {
luaagudeloga 0:77a7770a1787 103 uk=3.3;
luaagudeloga 0:77a7770a1787 104 }
luaagudeloga 0:77a7770a1787 105 //Normalizacion de la salida
luaagudeloga 0:77a7770a1787 106 // se actualizan las variables *******************************************
luaagudeloga 0:77a7770a1787 107 err_v = ek;
luaagudeloga 0:77a7770a1787 108 o = uk/3.3;
luaagudeloga 0:77a7770a1787 109 uc.write(o);
luaagudeloga 0:77a7770a1787 110 // se envia el valor pid a puerto analogico de salida (D/A) **************
luaagudeloga 0:77a7770a1787 111
luaagudeloga 0:77a7770a1787 112 // se repite el ciclo
luaagudeloga 0:77a7770a1787 113 wait(Ts);
luaagudeloga 0:77a7770a1787 114
luaagudeloga 0:77a7770a1787 115 //Mostrando error y salida actual
luaagudeloga 0:77a7770a1787 116
luaagudeloga 0:77a7770a1787 117 GSM.printf("Error= %.2f\t",ek);
luaagudeloga 0:77a7770a1787 118 GSM.printf("Set Point= %.1f\t",Sp);
luaagudeloga 0:77a7770a1787 119 GSM.printf("Voltaje Actual= %.1f\n",yT);
luaagudeloga 0:77a7770a1787 120 wait(Ts); //Tiempo de muestreo
luaagudeloga 0:77a7770a1787 121
luaagudeloga 0:77a7770a1787 122 }
luaagudeloga 0:77a7770a1787 123
luaagudeloga 0:77a7770a1787 124 }
luaagudeloga 0:77a7770a1787 125
luaagudeloga 0:77a7770a1787 126
luaagudeloga 0:77a7770a1787 127
luaagudeloga 0:77a7770a1787 128
luaagudeloga 0:77a7770a1787 129
luaagudeloga 0:77a7770a1787 130
luaagudeloga 0:77a7770a1787 131
luaagudeloga 0:77a7770a1787 132