this program is designed for the CHITISAT's OBC, and is a prototype for the flight plan vs altitude

Dependencies:   ADS1015 BMP280 SDFileSystem SENSOR mbed

Revision:
4:c2bdc2bced76
Parent:
3:fef99c7c92b5
Child:
5:05fd6249c21b
diff -r fef99c7c92b5 -r c2bdc2bced76 main.cpp
--- a/main.cpp	Thu Jun 14 14:22:30 2018 +0000
+++ b/main.cpp	Tue Jun 26 20:04:47 2018 +0000
@@ -10,14 +10,13 @@
 #include "SENSOR.h"
 //***** declaracion de puertos
 SDFileSystem sd(PA_12, PA_6, PA_1, PB_0 , "sd");// puerto SPI para el Storage
-//LocalFileSystem sd("local");// puerto SPI para el Storage
 Serial sc(PB_6, PB_7,9600); //puerto para el sistema de comunicacioness
 //I2C i2c(PB_4,PA_7);             // puerto i2c    
 BMP280 bmp(i2c,0xEC);           //Default address = 0x76
 Adafruit_ADS1115 ads(&i2c);     // adc de 16 bits
 Serial obc(USBTX,USBRX);        // puerto virtual del obc
 SENSOR uv(PB_4,PA_7);                 //sensor  de rayos ultra violeta
-//HMC5883L mag(PB_4,PA_7);        // magnetometro
+SENSOR mag(PB_4,PA_7);        // magnetometro
 AnalogIn temp2(PA_5);           //sensor de temperatura externa
 AnalogIn voltaje(PA_4);         //sensor analogico de voltaje
 AnalogIn corriente(PA_3);       // sensor analogico de corriente
@@ -99,10 +98,10 @@
     wait(2);
     Vcondicional=0;
     //iniciando camara    
-        camera=0;
+        camera=1;
         led=1;
         wait(2);
-        camera=1;
+        camera=0;
         led=0;
         wait(1);
         obc.printf("iniciando camara\n\r");
@@ -138,8 +137,10 @@
     //int altura=10;
     //*****************
     //float x=0.5;
-    float hmin=1;   
-    while(h<0.9){
+    float hmin=0.5;
+    float hsil;   
+    hsil=hmin-0.1;   
+    while(h<hsil){
         obc.printf("subiendo en silencio radial altura=%f\n\r",h);
         h=get_altura();
         led=!led;
@@ -243,13 +244,9 @@
 
 void take_tl(void){
     int i;
-    IMU[0]=imu[0]=1;// mag.getMx();
-    IMU[1]=imu[1]=2;// mag.getMy();
-    IMU[2]=imu[2]=3;// mag.getMz();
-    /*
-    uint8_t whoami = mpu6050.readByte(MPU6050_ADDRESS, WHO_AM_I_MPU6050);  // Read WHO_AM_I register for MPU-6050\
-    if (whoami == 0x68) // WHO_AM_I should always be 0x68
-    {*/
+    IMU[0]=imu[0]= mag.getMx();
+    IMU[1]=imu[1]= mag.getMy();
+    IMU[2]=imu[2]= mag.getMz();
         mpu6050.MPU6050SelfTest(SelfTest); // Start by performing self test and reporting values
          if(SelfTest[0] < 1.0f && SelfTest[1] < 1.0f && SelfTest[2] < 1.0f && SelfTest[3] < 1.0f && SelfTest[4] < 1.0f && SelfTest[5] < 1.0f) 
         {
@@ -257,7 +254,6 @@
             mpu6050.calibrateMPU6050(gyroBias, accelBias); // Calibrate gyro and accelerometers, load biases in bias registers  
             mpu6050.initMPU6050(); 
         }
-    //}
     if(mpu6050.readByte(MPU6050_ADDRESS, INT_STATUS) & 0x01) {  // check if data ready interrupt
     mpu6050.readAccelData(accelCount);  // Read the x/y/z adc values
     mpu6050.getAres();
@@ -284,14 +280,18 @@
         }
     press=bmp.getPressure();
     //temperatura tomada del imu
-    temp[0]=temperature*1000; //temperatura en milivoltios ajuatado a 12 bits.
-    float tempe1=temp2.read(); //obteniendo la temperatura en voltaje
-    temp[1]= temp2.read_u16();temp[1]=(temp[1]>>4);//temperatura en milivoltios ajuatado a 12 bits.
-    sensor_adc[0]=temp3.read_u16();sen_adc[0]=(sensor_adc[0]>>4);
-    sensor_adc[1]=corriente.read_u16();sen_adc[1]=(sensor_adc[1]>>4);
-    sensor_adc[2]=voltaje.read_u16();sen_adc[2]=(sensor_adc[2]>>4);
+    int tempera=temperature*100;
+    int offsetadc=60;     //CORRECCION DE LOS DATOS TOMADOS DEL ADC, EL ERROR ES PRODUCIDO POR VREF.
+    //tempera=ceil(tempera);
+    temp[0]=tempera; //temperatura en milivoltios ajuatado a 12 bits.
+    //float tempe1=temp2.read(); //obteniendo la temperatura en voltaje
+    temp[1]= temp2.read_u16();temp[1]=(temp[1]>>4)+offsetadc;//temperatura en milivoltios ajuatado a 12 bits.
+    sensor_adc[0]=temp3.read_u16();sen_adc[0]=(sensor_adc[0]>>4)+offsetadc;
+    sensor_adc[1]=corriente.read_u16();sen_adc[1]=(sensor_adc[1]>>4)+offsetadc;
+    sensor_adc[2]=voltaje.read_u16();sen_adc[2]=(sensor_adc[2]>>4)+offsetadc;
     suv=uv.getUV();
     //sensor_adc[3]=temp2.read();//uv.read();sen_adc[3]=sensor_adc[3]/0.0008789062;
+    
     obc.printf("tomando telemetria\n");  
     }
     
@@ -304,6 +304,7 @@
         senfis[0]=h1;
         senfis[1]=h2;
         senfis[2]=tiempo;
+        obc.printf("tiempo=%d",senfis[2]);
         /*
         ads.setGain(GAIN_TWOTHIRDS);
         for(int i=0;i<=3;i++){
@@ -321,8 +322,8 @@
         BR=1;// abbrir documento de condiciones iniciles y cambiar Br para doocumentar el resetprogramado
                     NVIC_SystemReset();
         }
-        fprintf(fp,"%.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %d %d %d %d %d %f\r\n",imu[0],imu[1],imu[2],imu[3],imu[4],imu[5],imu[6],imu[7],imu[8],press,temperature,temp[1],sensor_adc[0],sensor_adc[1],sensor_adc[2],suv,h);
-        obc.printf("%.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %d %d %d %d %d %f\r\n",imu[0],imu[1],imu[2],imu[3],imu[4],imu[5],imu[6],imu[7],imu[8],press,temperature,temp[1],sensor_adc[0],sensor_adc[1],sensor_adc[2],suv,h);
+        fprintf(fp,"%.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %d %d %d %d %d %f\r\n",imu[0],imu[1],imu[2],imu[3],imu[4],imu[5],imu[6],imu[7],imu[8],press,temperature,temp[1],sen_adc[0],sen_adc[1],sen_adc[2],suv,h);
+        obc.printf("%.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %d %d %d %d %d %f\r\n",imu[0],imu[1],imu[2],imu[3],imu[4],imu[5],imu[6],imu[7],imu[8],press,temperature,temp[1],sen_adc[0],sen_adc[1],sen_adc[2],suv,h);
     fclose(fp);  
     obc.printf("guardando telemetria\n");
     }
@@ -339,9 +340,14 @@
     obc.printf("guardando mision\n");
     }
 void build_tr1(void){ //construir trama de datos 1
-    bar=ceil(P*100);    //tomando los 20 bits sin procesar del barometro
-    uint16_t y,z,y4,y3,y2,z4,ah,al;
+    int barometro;
+    barometro=ceil(P*100);    //tomando los 20 bits sin procesar del barometro
+    bar=barometro;
+    obc.printf("p=%f barometro= %d bar= %d temp0= %d \n\r",P,barometro,bar,temp[0]);
+    wait(1);
+    uint16_t y,z,y2,z4,ah,al;
     uint32_t par[3];// para los tres pares de datos de 32 bits
+    uint32_t y4,y3;
     uint32_t AH,AL;
         y=4080;
         z=15;
@@ -351,6 +357,8 @@
         z4=0x000000ff;
         //completando a paquetes de 32 bits
         par[0]=(bar<<12)|temp[0];
+        obc.printf("par 0=%d",par[0]);
+        wait(1);
         ah=sen_adc[1]&y;
         al=sen_adc[1]&z;
         ah=(ah>>4);
@@ -386,8 +394,8 @@
     }
 void build_tr2(void){// construir trama de datos 2
     bar=ceil(P*100);    //tomando los 20 bits sin procesar del barometro
-    uint16_t y,z,y4,y3,y2,z4,ah,al;
-    uint32_t par;// para los tres pares de datos de 32 bits
+    uint16_t y,z,y2,z4,ah,al;
+    uint32_t par,y4,y3;// para los tres pares de datos de 32 bits
     uint32_t AH,AL;
         y=4080;
         z=15;
@@ -422,7 +430,6 @@
             trama[i*2+23]=AH;
             trama[i*2+24]=AL;
             }
-        
         trama[0]=data2; //cabecera de la trama de datos 2
         //publicando la trama de datos 2 en el puerto virtual
         for(int i=0;i<=30;i++){
@@ -432,38 +439,6 @@
     }
     
 void send_tr(void){
-        /*
-            sc.putc(trama[1]);
-            sc.putc(trama[2]);
-            sc.putc(trama[3]);
-            sc.putc(trama[4]);
-            sc.putc(trama[5]);
-            sc.putc(trama[6]);
-            sc.putc(trama[7]);
-            sc.putc(trama[8]);
-            sc.putc(trama[9]);
-            sc.putc(trama[10]);
-            sc.putc(trama[11]);
-            sc.putc(trama[12]);
-            sc.putc(trama[13]);
-            sc.putc(trama[14]);
-            sc.putc(trama[15]);
-            sc.putc(trama[16]);
-            sc.putc(trama[17]);
-            sc.putc(trama[18]);
-            sc.putc(trama[19]);
-            sc.putc(trama[20]);
-            sc.putc(trama[21]);
-            sc.putc(trama[22]);
-            sc.putc(trama[23]);
-            sc.putc(trama[24]);
-            sc.putc(trama[25]);
-            sc.putc(trama[26]);
-            sc.putc(trama[27]);
-            sc.putc(trama[28]);
-            sc.putc(trama[29]);
-            sc.putc(trama[30]);
-            */
             for(int i=0;i<=30;i++){
                 sc.putc(trama[i]);
                 }
@@ -479,7 +454,7 @@
             //************************************************************
             //TOMAR LOS 100 DATOS CADA .05 SEGUNDOS, PARA DETERMINAR LA PRESION INICIAL
             for (int i=0;i<100;i++)
-            {
+               {
             BMPTemp=bmp.getTemperature();           // generando t_fine PARA LA TEMPERATURA DE ESCALAMIENTP
             Pp[i]= bmp.getPressure();          // pi es la condicion inical para la presion 
             Ps=Ps+Pp[i];
@@ -489,19 +464,15 @@
             }
             //LA MEDIA DE TODOS LOS DATOS NOS DA LA PRESION REAL
             Pi=Ps/100;                      //presion real
-            //************************************************************
-
     }
     else
     {
         // leer las condiciones iniciales del archivo ci,txt
             FILE *fp=fopen("/sd/condiciones/ci.txt","r");
-           // obc.printf("%d..................",fp);
-                fscanf(fp,"%d %f %f",&BR,&BMPTemp,&Pi);
+            fscanf(fp,"%d %f %f",&BR,&BMPTemp,&Pi);
                 fclose(fp);
                 //fin de la lectura de datos
     }
-    //return (BMPTemp, pi);
     return 1;
 }   
 
@@ -547,7 +518,7 @@
         dif=floor(dif);             //REDONDEANDO AL MENOR 
         if (altura1 >= 0){          //VER SI ES NEGATIVO O POSITIVO
             if(dif>=5){
-                h=altura0+.5;       //SI ES POSITIVO Y MAYOR A 5 LA PARTE DECIMAL, ANIADE .5 AL LA PARTE ENTERA
+                h=altura0+0.5;       //SI ES POSITIVO Y MAYOR A 5 LA PARTE DECIMAL, ANIADE .5 AL LA PARTE ENTERA
             }
             else{
                 h=altura0;          //SI ES MENOR A 5 LA PARTE DECIMAL Y POSITIVO, SOLO TOMA LA PARTE ENTERA
@@ -584,28 +555,26 @@
                 fscanf(dp,"%d",&ND);
              fclose(dp);
             ND=ND+1;
-                        // creando la carpeta y guardando los datos iniciales en la carpeta de datos de prueba
+        // creando la carpeta y guardando los datos iniciales en la carpeta de datos de prueba
              FILE *dp1=fopen("/sd/carpetas/numero.txt","w");
               if(dp1==NULL){printf("no se pudo acceder al sd 3...");
               BR=1;// abbrir documento de condiciones iniciles y cambiar Br para doocumentar el resetprogramado
                     NVIC_SystemReset();}
                 fprintf(dp1,"%d",ND);
             fclose(dp1);
-            //GRBANDO LAS CONDICIONES INICIALES EN EL DOCUMENTO CI
+            //GRaBANDO LAS CONDICIONES INICIALES EN EL DOCUMENTO CI
             FILE *fp=fopen("/sd/condiciones/ci.txt","w");
              if(fp==NULL){printf("no s epudo acceder al sd 4...");
              BR=1;// abbrir documento de condiciones iniciles y cambiar Br para doocumentar el resetprogramado
                     NVIC_SystemReset();}
             fprintf(fp,"%d %f %f \r\n", BR,BMPTemp,Pi);
             fclose(fp);
-
             // creando la carpeta y guardando los datos iniciales en la carpeta condiciones iniciales
               dato[25]=ND+48;
               printf(dato,".txt"); printf("\n");
                 FILE *fobc=fopen(dato,"a");
                 for (i=0;i<100;i++)
                 {
-                //FILE *fobc=fopen("/sd/condiciones/iniciales.txt","a");
                 fprintf(fobc,"%.2f \r\n",Pp[i]);
                 wait(0.01);
                 }
@@ -615,12 +584,14 @@
             file[16]=ND+48;             //ajuste a ascii
             printf(file,".txt"); printf("\n");
             FILE *pp=fopen(file,"w");
-             if(pp==NULL){printf("no s epudo acceder al sd..5");
-             BR=1;// abbrir documento de condiciones iniciles y cambiar Br para doocumentar el resetprogramado
-                    NVIC_SystemReset();}
+             if(pp==NULL)
+             {
+                 printf("no s epudo acceder al sd..5");
+                 BR=1;// abbrir documento de condiciones iniciles y cambiar Br para doocumentar el resetprogramado
+                 NVIC_SystemReset();
+             }
             fprintf(pp,"%f %f %f inicio\r\n",t.read(),BMPTemp,Pi);
             fclose(pp);
-            
             led=1;
             wait(1);
         }
@@ -650,8 +621,7 @@
         {
             FILE *pp=fopen(file,"a");
             if (pp == NULL) {printf("no se inicion 5...");}
-            fprintf(pp,"%f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f\r\n",t.read(),imu[0],imu[1],imu[2],imu[3],imu[4],imu[5],imu[6],imu[7],imu[8],press,temperature,temp[1],sensor_adc[0],sensor_adc[1],sensor_adc[2],suv,h);
-            //fprintf(pp,"%f %f %f %f %f\r\n",t.read(),BMPTemp,P,h,altura1); //guarda en el sd
+            fprintf(pp,"%d %d %d %d %d %d %d %d %d %f %f %d %d %d %d %d %d %d\r\n",t.read(),imu[0],imu[1],imu[2],imu[3],imu[4],imu[5],imu[6],imu[7],imu[8],press,temperature,temp[1],sen_adc[0],sen_adc[1],sen_adc[2],suv,h);
             fclose(pp);
             return (2);
         }
@@ -660,7 +630,6 @@
             FILE *pp=fopen(file,"a");
             if (pp == NULL) {printf("no se inicion 5...");}
             fprintf(pp,"%f %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d \r\n",t.read(),trama[0],trama[1],trama[2],trama[3],trama[4],trama[5],trama[6],trama[7],trama[8], trama[9],trama[10],trama[11],trama[12],trama[13],trama[14],trama[15],trama[16],trama[17],trama[18], trama[19],trama[20],trama[21],trama[22],trama[23],trama[24],trama[25],trama[26],trama[27],trama[28], trama[29], trama[30]);
-            //fprintf(pp,"%f %f %f %f %f\r\n",t.read(),BMPTemp,P,h,altura1); //guarda en el sd
             fclose(pp);
             return (2);
         }