MEMS pressure sensor by STMicroelectronics. FIFO Hardware digital filter as default.
Fork of LPS25H by
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 }
Generated on Tue Jul 19 2022 15:15:57 by 1.7.2