super

Dependencies:   BMP180 INA219 JPEGCamera SDFileSystem ST7735_TFT Si7021 TSL2561 mbed

main.cpp

Committer:
NilliM
Date:
2017-03-25
Revision:
0:7fa3463671dd

File content as of revision 0:7fa3463671dd:

#include "mbed.h"
#include "BMP180.h"
#include "Si7021.h"
#include "TSL2561.h"
#include "MPU9250.h"
#include "INA219.hpp"
#include "JPEGCamera.h"
#include "stdio.h"
#include "stdlib.h"
#include "math.h"
#include "ST7735_TFT.h"
#include "string"
#include "Arial12x12.h"
#include "Arial24x23.h"
#include "Arial28x28.h"
#include "SDFileSystem.h" 
 
  #define NUMBER_OF_STARS 400
 #define SCREEN_WIDTH 200
 #define SCREEN_HEIGHT 250
 
 /*star struct*/
typedef struct 
{
  float xpos, ypos;
  short zpos, speed;
  unsigned int color;
} STAR;

static STAR stars[NUMBER_OF_STARS];


void init_star(STAR* star, int id)
{
  /* randomly init stars, generate them around the center of the screen */
  
  star->xpos =  -10.0 + (20.0 * (rand()/(RAND_MAX+1.0)));
  star->ypos =  -10.0 + (20.0 * (rand()/(RAND_MAX+1.0)));
  
  star->xpos *= 3072.0; /*change viewpoint */
  star->ypos *= 3072.0;

  star->zpos =  id;
  star->speed =  2 + (int)(2.0 * (rand()/(RAND_MAX+1.0)));

  star->color = id*Cyan >> 2; /*the closer to the viewer the brighter*/
}


void init()
{
  int id;

  for (id = 0; id < NUMBER_OF_STARS; id++)
    {
      init_star(stars + id, id + 1);
    }
}
 
  
 // the TFT is connected to SPI pin 5-7, CS is p8, RS is p11, reset is p15 
 ST7735_TFT TFT(p5, p6, p7, p12, p11, p15,"TFT"); // mosi, miso, sclk, cs, rs, reset
 SDFileSystem sd(p5, p6, p7, p8, "sd"); // the pinout on the mbed Cool Components workshop board
 #define archivod "/sd/datos/dato%05d.txt";

int fru=0;
Timer td;
 
//Serial BT(p13, p14); // tx, rx

int i=0;

I2C myI2C(p9,p10);
Serial pc(USBTX,USBRX);

BMP180 bmp180(&myI2C); //Barometro
Si7021 sensor(p9,p10); //Sensor de humedad
TSL2561 tsl2561(p9,p10); //Sensor de luz
MPU9250 mpu9250; //Giroscopio
INA219 ina219(p9, p10, 0x41, 100000, RES_10BITS);

I2C RGBH(p9, p10); //RGB
DigitalOut green(p11);
int sensor_addr = 41 << 1;
   
Timer t;//Giroscopio
Timer setuptimer; //Luz
Timer executetimer;//Luz

//Barometro
int press;
float temp;
//Giroscopio
float sum = 0;
uint32_t sumCount = 0;
char buffer[14];

void setup(void){ //Luz y Giroscopio

    if (tsl2561.begin()) pc.printf("TSL2561 Sensor Found\n\r");         
    else  pc.printf("TSL2561 Sensor not Found\n\r");   
    
    tsl2561.setGain(TSL2561_GAIN_0X);         // set no gain (for bright situtations) 
    tsl2561.setTiming(TSL2561_INTEGRATIONTIME_402MS);  // longest integration time (dim tsl2561)
    
    uint8_t whoami = mpu9250.readByte(MPU9250_ADDRESS, WHO_AM_I_MPU9250);  // Read WHO_AM_I register for MPU-9250 
    if (whoami == 0x71) pc.printf("MPU9250 is online...\n\r");
    mpu9250.resetMPU9250(); // Reset registers to default in preparation for device calibration
    mpu9250.MPU9250SelfTest(SelfTest); // Start by performing self test and reporting values
    mpu9250.calibrateMPU9250(gyroBias, accelBias); // Calibrate gyro and accelerometers, load biases in bias registers
    wait(2);  
    mpu9250.initMPU9250();
    mpu9250.initAK8963(magCalibration);
    wait(1);
}


int main(){
    
    JPEGCamera camera(p13, p14); // TX, RX
    LocalFileSystem local("local"); //save images on mbed
    Timer timer;
    timer.start();
    camera.setPictureSize(JPEGCamera::SIZE320x240);
    
    //BT.baud(38400);
    //Sensor de luz  
    setuptimer.start();
    setup();    
    setuptimer.stop();
    setuptimer.reset();
    uint16_t x,y,z;
    t.start();
    
    //RGB
    RGBH.frequency(200000);
    green = 1; // off
    
    char id_regval[1] = {146};
    char data[1] = {0};
    RGBH.write(sensor_addr,id_regval,1, true);
    RGBH.read(sensor_addr,data,1,false);
    
    if (data[0]==68) {
        green = 0;
        wait (2); 
        green = 1;
        } else {
        green = 1; 
    }
    
    // Initialize color sensor
    
    char timing_register[2] = {129,0};
    RGBH.write(sensor_addr,timing_register,2,false);
    
    char control_register[2] = {143,0};
    RGBH.write(sensor_addr,control_register,2,false);
    
    char enable_register[2] = {128,3};
    RGBH.write(sensor_addr,enable_register,2,false);
    
    mkdir("/sd/datos", 0777);
    
    unsigned int centerx, centery;
    int id, j, tempx, tempy;  
    init();
    TFT.set_orientation(2);
    centerx = TFT.width() >> 1;
    centery = TFT.height() >> 1; 
    
     
    TFT.claim(stdout);      // send stdout to the TFT display 
    //TFT.claim(stderr);      // send stderr to the TFT display

    TFT.background(Black);    // set background to black
    TFT.foreground(White);    // set chars to white
    
    TFT.cls();
    TFT.set_font((unsigned char*) Arial12x12);  // select the font
        
    td.start();

    ////// demo start
    
    for ( j = 0 ; j < 5000; j++ ) 
    {
     
      /* move and draw stars */
       
      for (id = 0; i < NUMBER_OF_STARS; id++)
    {
      tempx = (stars[id].xpos / stars[id].zpos) + centerx;
      tempy = (stars[id].ypos / stars[id].zpos) + centery;
      TFT.pixel(tempx,tempy,Black);
      
        
      stars[id].zpos -= stars[id].speed;
      
      if (stars[id].zpos <= 0)
        {
          init_star(stars + id, id + 1);
        }

      //compute 3D position
      tempx = (stars[id].xpos / stars[id].zpos) + centerx;
      tempy = (stars[id].ypos / stars[id].zpos) + centery;

      if (tempx < 0 || tempx > TFT.width() - 1 || tempy < 0 || tempy > TFT.height() - 1) //check if a star leaves the screen
        {
          init_star(stars + id, id + 1);
          
          continue;
        }
      
      TFT.pixel(tempx,tempy,stars[id].color);
      
        
    }
     //TFT.Bitmap(centerx-60,centery-19,120,38,p1);
     
    printf("N y U %i\n", fru);
    /*fru++;
    pc.printf("%i", fru);
    char fil[32];
    sprintf(fil, "/sd/datos/dato%d.txt", fru); 
    FILE *fp = fopen(fil, "w");
    fprintf(fp,"Swag\n\r");
    pc.printf("Escribiendo");
    wait(0.3);
    fclose(fp);
    pc.printf("Cerrado");*/
    }
    
    

    ///// demo stop

    td.stop();
    TFT.locate(0,10);
    TFT.set_font((unsigned char*) Arial12x12);  // select the font
    printf("Time %f s\n", td.read());
    
    while(1)
    {   
        //Sensor de luz  
        executetimer.start();
        x = tsl2561.getLuminosity(TSL2561_VISIBLE);     
        y = tsl2561.getLuminosity(TSL2561_FULLSPECTRUM);
        z = tsl2561.getLuminosity(TSL2561_INFRARED);
        executetimer.stop();
        
        
        bmp180.init(); //Barometro
        sensor.measure();//Sensor de humedad
        
        //Barometro
        float altitud;
        bmp180.startTemperature(); 
        wait_ms(5);     // 
        if(bmp180.getTemperature(&temp) != 0) {
            printf("Error getting temperature\n");
            continue;
            }    
        bmp180.startPressure(BMP180::ULTRA_LOW_POWER);
        wait_ms(10);    // Wait for conversion to complete
        if(bmp180.getPressure(&press) != 0) {
            printf("Error getting pressure\n");
            continue;
            }
        altitud= 44330.0*(1-pow(press*.01/1020.0,(1/5.225)));   
        //Sensor de humedad    
        float temps=sensor.get_temperature()/1000.0;
        float hum=sensor.get_humidity()/1000.0;
        
        //Sensor de voltaje
        float current_ma = ina219.read_current_mA();
        float voltageb = ina219.read_bus_voltage();
        
        //Giroscopio
        mpu9250.getAres(); // Get accelerometer sensitivity
        mpu9250.getGres(); // Get gyro sensitivity
        mpu9250.getMres(); // Get magnetometer sensitivity
        magbias[0] = +470.;  // User environmental x-axis correction in milliGauss, should be automatically calculated
        magbias[1] = +120.;  // User environmental x-axis correction in milliGauss
        magbias[2] = +125.;  // User environmental x-axis correction in milliGauss
        if(mpu9250.readByte(MPU9250_ADDRESS, INT_STATUS) & 0x01) {  // On interrupt, check if data ready interrupt
            mpu9250.readAccelData(accelCount);  // Read the x/y/z adc values   
            // Now we'll calculate the accleration value into actual g's
            ax = (float)accelCount[0]*aRes - accelBias[0];  // get actual g value, this depends on scale being set
            ay = (float)accelCount[1]*aRes - accelBias[1];   
            az = (float)accelCount[2]*aRes - accelBias[2];  
           
            mpu9250.readGyroData(gyroCount);  // Read the x/y/z adc values
            // Calculate the gyro value into actual degrees per second
            gx = (float)gyroCount[0]*gRes - gyroBias[0];  // get actual gyro value, this depends on scale being set
            gy = (float)gyroCount[1]*gRes - gyroBias[1];  
            gz = (float)gyroCount[2]*gRes - gyroBias[2];   
          
            mpu9250.readMagData(magCount);  // Read the x/y/z adc values   
            // Calculate the magnetometer values in milliGauss
            // Include factory calibration per data sheet and user environmental corrections
            mx = (float)magCount[0]*mRes*magCalibration[0] - magbias[0];  // get actual magnetometer value, this depends on scale being set
            my = (float)magCount[1]*mRes*magCalibration[1] - magbias[1];  
            mz = (float)magCount[2]*mRes*magCalibration[2] - magbias[2];   
            }
        Now = t.read_us();
        deltat = (float)((Now - lastUpdate)/1000000.0f) ; // set integration time by time elapsed since last filter update
        lastUpdate = Now;
        sum += deltat;
        sumCount++;
    
        mpu9250.MahonyQuaternionUpdate(ax, ay, az, gx*PI/180.0f, gy*PI/180.0f, gz*PI/180.0f, my, mx, mz);
        tempCount = mpu9250.readTempData();  // Read the adc values
        temperature = ((float) tempCount) / 333.87f + 21.0f; // Temperature in degrees Centigrade
        yaw   = atan2(2.0f * (q[1] * q[2] + q[0] * q[3]), q[0] * q[0] + q[1] * q[1] - q[2] * q[2] - q[3] * q[3]);   
        pitch = -asin(2.0f * (q[1] * q[3] - q[0] * q[2]));
        roll  = atan2(2.0f * (q[0] * q[1] + q[2] * q[3]), q[0] * q[0] - q[1] * q[1] - q[2] * q[2] + q[3] * q[3]);
        pitch *= 180.0f / PI;
        yaw   *= 180.0f / PI; 
        yaw   -= 13.8f; // Declination at Danville, California is 13 degrees 48 minutes and 47 seconds on 2014-04-04
        roll  *= 180.0f / PI;
        
        //RGB
        char clear_reg[1] = {148};
        char clear_data[2] = {0,0};
        RGBH.write(sensor_addr,clear_reg,1, true);
        RGBH.read(sensor_addr,clear_data,2, false);
        
        int clear_value = ((int)clear_data[1] << 8) | clear_data[0];
        
        char red_reg[1] = {150};
        char red_data[2] = {0,0};
        RGBH.write(sensor_addr,red_reg,1, true);
        RGBH.read(sensor_addr,red_data,2, false);
        
        int red_value = ((int)red_data[1] << 8) | red_data[0];
        
        char green_reg[1] = {152};
        char green_data[2] = {0,0};
        RGBH.write(sensor_addr,green_reg,1, true);
        RGBH.read(sensor_addr,green_data,2, false);
        
        int green_value = ((int)green_data[1] << 8) | green_data[0];
        
        char blue_reg[1] = {154};
        char blue_data[2] = {0,0};
        RGBH.write(sensor_addr,blue_reg,1, true);
        RGBH.read(sensor_addr,blue_data,2, false);
    
        int blue_value = ((int)blue_data[1] << 8) | blue_data[0];
        
        
        pc.printf("Clear (%d), Red (%d), Green (%d), Blue (%d)\r\n", clear_value, red_value, green_value, blue_value);
        pc.printf("P=%d Pa\n\rT=%.2fC\n\rAltitud= %.2f m\n\r", press, temp, altitud); //Barometro
        pc.printf("Temp: %0.2f\n\r",temps); //Humedad
        pc.printf("Humidity: %0.2f % \n\r",hum);//Humedad
        pc.printf("Visible: %d \n\r",x); //Luz
        pc.printf("Full Spectrum: %d\n\r",y); //Luz
        pc.printf("Infrared: %d\n\r",z);//Luz
        pc.printf(" temperature = %f  C\n\r", temperature);    //Giroscopio
        pc.printf("Giroscopio: %2.2f,%2.2f,%2.2f,%2.2f,%2.2f,%2.2f,Y:%3.1f,P:%3.1f,R:%3.1f\n\r",ax,ay,az,gx,gy,gz,yaw,pitch,roll);
        pc.printf("%f mA\r\n", current_ma);
        pc.printf("%f V\r\n", voltageb);
        
        /*
        BT.printf("Clear (%d), Red (%d), Green (%d), Blue (%d)\r\n", clear_value, red_value, green_value, blue_value);
        BT.printf("P=%d Pa\n\rT=%.2fC\n\r", press, temp); //Barometro
        BT.printf("Temp: %0.2f\n\r",temps); //Humedad
        BT.printf("Humidity: %0.2f % \n\r",hum);//Humedad
        BT.printf("Visible: %d \n\r",x); //Luz
        BT.printf("Full Spectrum: %d\n\r",y); //Luz
        BT.printf("Infrared: %d\n\r",z);//Luz
        BT.printf(" temperature = %f  C\n\r", temperature);    //Giroscopio
        BT.printf("Giroscopio: %2.2f,%2.2f,%2.2f,%2.2f,%2.2f,%2.2f,Y:%3.1f,P:%3.1f,R:%3.1f\n\r",ax,ay,az,gx,gy,gz,yaw,pitch,roll);
        BT.printf("%f mA\r\n", current_ma);
        BT.printf("%f V\r\n", voltageb);*/
        
        
        if (camera.isReady()) {
        char filename[32];
        sprintf(filename, "/local/pict%03d.jpg", i);
        //printf("Picture: %s ", filename);
            if (camera.takePicture(filename)) {
                while (camera.isProcessing()) {
                    camera.processPicture();}}}
        i++;
        pc.printf("Picture");

        wait(1);
         
 
 }}