MEMS pressure sensor by STMicroelectronics. FIFO Hardware digital filter as default.

Fork of LPS25H by Kenji Arai

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers LPS25H.cpp Source File

LPS25H.cpp

00001 /*
00002  * mbed library program
00003  *  LPS25H MEMS pressure sensor: 260-1260 hPa absolute digital output barometer
00004  *   made by STMicroelectronics
00005  *   http://www.st-japan.co.jp/web/catalog/sense_power/FM89/SC1316/PF255230
00006  *
00007  * Copyright (c) 2015,'17 Kenji Arai / JH1PJL
00008  *  http://www.page.sannet.ne.jp/kenjia/index.html
00009  *  http://mbed.org/users/kenjiArai/
00010  *      Created: Feburary  21st, 2015
00011  *      Revised: August    21st, 2017
00012  */
00013 
00014 #include "LPS25H.h"
00015 
00016 LPS25H::LPS25H (PinName p_sda, PinName p_scl) :
00017  _i2c_p(new I2C(p_sda, p_scl)), _i2c(*_i2c_p)
00018 {
00019     LPS25H_addr = LPS25H_V_CHIP_ADDR;
00020     LPS25H_mode = FIFO_HW_FILTER;
00021     init();
00022 }
00023 /*
00024 LPS25H::LPS25H (PinName p_sda, PinName p_scl, uint8_t addr, uint8_t mode) :
00025  _i2c_p(new I2C(p_sda, p_scl)), _i2c(*_i2c_p)
00026 {
00027     LPS25H_addr = addr;
00028     LPS25H_mode = mode;
00029     init();
00030 }
00031 
00032 LPS25H::LPS25H (I2C& p_i2c, uint8_t addr) : _i2c(p_i2c)
00033 {
00034     LPS25H_addr = addr;
00035     LPS25H_mode = FIFO_HW_FILTER;
00036     init();
00037 }
00038 
00039 LPS25H::LPS25H (I2C& p_i2c, uint8_t addr, uint8_t mode) : _i2c(p_i2c)
00040 {
00041     LPS25H_addr = addr;
00042     LPS25H_mode = mode;
00043     init();
00044 }
00045 */
00046 /////////////// Initialize ////////////////////////////////
00047 void LPS25H::init(void)
00048 {
00049     _i2c.frequency(100000);
00050     // Check acc is available of not
00051     //dt[0] = LPS25H_WHO_AM_I;
00052     //_i2c.write(LPS25H_addr, dt, 1, true);
00053     //_i2c.read(LPS25H_addr, dt, 1, false);
00054     // if (dt[0] == I_AM_LPS25H) {
00055     //     LPS25H_id = I_AM_LPS25H;
00056     //     LPS25H_ready = 1;
00057     // } else {
00058     //     LPS25H_id = 0;
00059     //     LPS25H_ready = 0;
00060     //     return;     // acc chip is NOT on I2C line then terminate
00061     // }
00062     if (LPS25H_mode == FIFO_HW_FILTER){
00063         // Hardware digital filter
00064         // AN4450 April 2014 Rev1 P20/26,
00065         // Filter enabling and suggested configuration
00066         dt[0] = LPS25H_RES_CONF;
00067         dt[1] = 0x05;
00068         _i2c.write(LPS25H_addr, dt, 2, false);
00069         dt[0] = LPS25H_FIFO_CTRL;
00070         dt[1] = 0xdf;
00071         _i2c.write(LPS25H_addr, dt, 2, false);
00072         dt[0] = LPS25H_CTRL_REG2;
00073         dt[1] = 0x40;
00074         _i2c.write(LPS25H_addr, dt, 2, false);
00075         dt[0] = LPS25H_CTRL_REG1;
00076         dt[1] = 0x90;
00077         _i2c.write(LPS25H_addr, dt, 2, false);
00078     } else {
00079         dt[0] = LPS25H_CTRL_REG2;
00080         dt[1] = 0x0;
00081         _i2c.write(LPS25H_addr, dt, 2, false);
00082         dt[0] = LPS25H_CTRL_REG1;
00083         dt[1] = CR_STD_SET;
00084         _i2c.write(LPS25H_addr, dt, 2, false);
00085     }
00086 }
00087 
00088 /////////////// Start conv. and gwt all data //////////////
00089 void LPS25H::get(void)
00090 {
00091    /* if (LPS25H_ready == 0) {
00092         press = 0;
00093         temp = 0;
00094         alt = 0;
00095         return;
00096     }*/
00097     dt[0] = LPS25H_PRESS_POUT_XL | 0x80;
00098     _i2c.write(LPS25H_addr, dt, 1, true);
00099     _i2c.read(LPS25H_addr, dt, 3, false);
00100     press = dt[2] << 16 | dt[1] << 8 | dt[0];
00101   //  dt[0] = LPS25H_TEMP_OUT_L | 0x80;
00102   // _i2c.write(LPS25H_addr, dt, 1, true);
00103   //  _i2c.read(LPS25H_addr, dt, 2, false);
00104   //  temp = dt[1] << 8 | dt[0];
00105     alt = (1-pow((press/4096)/1013.25,0.190284))*145366.45;
00106 }
00107 
00108 /////////////// Read data from sensor /////////////////////
00109 float LPS25H::pressure()
00110 {
00111     return (float)press / 4096;
00112 }
00113 
00114 /////////////// Read data from sensor /////////////////////
00115 /*float LPS25H::temperature()
00116 {
00117     return (float)temp / 480  + 42.5;
00118 }*/
00119 /////////////// Read data from sensor /////////////////////
00120 float LPS25H::altitude(void) {
00121     
00122     return  alt/3.280839895;
00123 }
00124 
00125 /////////////// ID ////////////////////////////////////////
00126 /*uint8_t LPS25H::read_id()
00127 {
00128     dt[0] = LPS25H_WHO_AM_I;
00129     _i2c.write(LPS25H_addr, dt, 1, true);
00130     _i2c.read(LPS25H_addr, dt, 1, false);
00131     return (uint8_t)dt[0];
00132 }*/
00133 
00134 /////////////// I2C Freq. /////////////////////////////////
00135 void LPS25H::frequency(int hz)
00136 {
00137     _i2c.frequency(hz);
00138 }
00139 
00140 /////////////// General purpose R/W ///////////////////////
00141 uint8_t LPS25H::read_reg(uint8_t addr)
00142 {
00143     if (LPS25H_ready == 1) {
00144         dt[0] = addr;
00145         _i2c.write(LPS25H_addr, dt, 1, true);
00146         _i2c.read(LPS25H_addr, dt, 1, false);
00147     } else {
00148         dt[0] = 0xff;
00149     }
00150     return (uint8_t)dt[0];
00151 }
00152 
00153 void LPS25H::write_reg(uint8_t addr, uint8_t data)
00154 {
00155     if (LPS25H_ready == 1) {
00156         dt[0] = addr;
00157         dt[1] = data;
00158         _i2c.write(LPS25H_addr, dt, 2, false);
00159     }
00160 }