気圧センサLPS25HをI2Cで動かすライブラリ

Dependents:   rocket_logger_sinkan2018_v1 Shock_Alt_Logger_v2_1

LPS25H_lib.cpp

Committer:
Sigma884
Date:
2018-04-24
Revision:
0:4b9b28d45e51

File content as of revision 0:4b9b28d45e51:

#include "LPS25H_lib.h"
#include "mbed.h"
#include "math.h"

LPS25H_lib :: LPS25H_lib(AD0 ad0, I2C &userI2C){
    slave = ad0;
    i2c = &userI2C;
}

void LPS25H_lib :: begin(int drate){
    cmd_ctrl_reg1[0] = CTRL_REG1;
    switch(drate){
        case 0:
        cmd_ctrl_reg1[1] = 0x80;
        break;
        
        case 1:
        cmd_ctrl_reg1[1] = 0x90;
        break;
        
        case 7:
        cmd_ctrl_reg1[1] = 0xA0;
        break;
        
        case 12:
        cmd_ctrl_reg1[1] = 0xB0;
        break;
        
        case 25:
        cmd_ctrl_reg1[1] = 0xC0;
        break;
    }
    
    i2c -> frequency(400000);
    i2c -> write(slave, cmd_ctrl_reg1, 2, true);
    wait(0.5f);
}

void LPS25H_lib :: setFIFO(int size){
    cmd_ctrl_reg2[0] = CTRL_REG2;
    cmd_ctrl_reg2[1] = 0x40;
    cmd_fifo_ctrl[0] = FIFO_CTRL;
    switch(size){
        case 0:
        cmd_ctrl_reg2[1] = 0x00;
        cmd_fifo_ctrl[1] = 0x00;
        break;
        
        case 2:
        cmd_fifo_ctrl[1] = 0xC1;
        break;
        
        case 4:
        cmd_fifo_ctrl[1] = 0xC3;
        break;
        
        case 8:
        cmd_fifo_ctrl[1] = 0xC7;
        break;
        
        case 16:
        cmd_fifo_ctrl[1] = 0xCF;
        break;
        
        case 32:
        cmd_fifo_ctrl[1] = 0xDF;
        break;
    }
    
    i2c -> write(slave, cmd_ctrl_reg2, 2, true);
    i2c -> write(slave, cmd_fifo_ctrl, 2, true);
    wait(0.5f);
}

int LPS25H_lib :: whoAmI(){
    cmd_who_am_i[0] = WHO_AM_I;
    i2c -> write(slave, cmd_who_am_i, 1, true);
    i2c -> read(slave | 1, &cmd_who_am_i[0], 1, false);
    if(cmd_who_am_i[0] == 0xBD){
        return 0;
    }
    else{
        return -1;
    }
}

float LPS25H_lib :: getPres(){
    cmd_p[0] = P_XL;
    cmd_p[1] = P_L;
    cmd_p[2] = P_H;
    for(int c1 = 0; c1 < 3; c1 ++){
        i2c -> write(slave, &cmd_p[c1], 1, true);
        i2c -> read(slave | 1, &cmd_p[c1], 1, false);
        data_p[c1] = (int)cmd_p[c1];
    }
    return (float)(data_p[0] | data_p[1] << 8 | data_p[2] << 16) / 4096.0f;
}

float LPS25H_lib :: getTemp(){
    cmd_t[0] = T_L;
    cmd_t[1] = T_H;
    for(int c1 = 0; c1 < 2; c1 ++){
        i2c -> write(slave, &cmd_t[c1], 1, true);
        i2c -> read(slave, &cmd_t[c1], 1, false);
        data_t[c1] = (int)cmd_t[c1];
    }
    if(data_t[1] >= 128){
        return 42.5 - (float)(65536 - (data_t[0] | data_t[1] << 8)) / 480.0f;
    }
    else{
        return 42.5 + (float)(data_t[0] | data_t[1] << 8) / 480.0f;
    }
}

float LPS25H_lib :: getAlt(float P_0, float T_0){
    pres_0 = P_0;
    temp_0 = T_0;
    pres_now = getPres();
    
    return -(273.0 + temp_0) / 0.0342 * log(pres_now / pres_0);
}