MEMS pressure sensor by STMicroelectronics. FIFO Hardware digital filter as default.
Dependents: WeatherSensor-Joe PAG-CourseWork-NicksEdits SOFT253_Assignment SOFT253_Assignment_V2 ... more
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?s_searchtype=partnumber 00006 * 00007 * Copyright (c) 2015 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: Feburary 22nd, 2015 00012 * 00013 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 00014 * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE 00015 * AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, 00016 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 00017 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 00018 */ 00019 00020 #include "LPS25H.h" 00021 00022 LPS25H::LPS25H (PinName p_sda, PinName p_scl, uint8_t addr) : _i2c(p_sda, p_scl) 00023 { 00024 LPS25H_addr = addr; 00025 LPS25H_mode = FIFO_HW_FILTER; 00026 init(); 00027 } 00028 00029 LPS25H::LPS25H (PinName p_sda, PinName p_scl, uint8_t addr, uint8_t mode) : _i2c(p_sda, p_scl) 00030 { 00031 LPS25H_addr = addr; 00032 LPS25H_mode = mode; 00033 init(); 00034 } 00035 00036 LPS25H::LPS25H (I2C& p_i2c, uint8_t addr) : _i2c(p_i2c) 00037 { 00038 LPS25H_addr = addr; 00039 LPS25H_mode = FIFO_HW_FILTER; 00040 init(); 00041 } 00042 00043 LPS25H::LPS25H (I2C& p_i2c, uint8_t addr, uint8_t mode) : _i2c(p_i2c) 00044 { 00045 LPS25H_addr = addr; 00046 LPS25H_mode = mode; 00047 init(); 00048 } 00049 00050 /////////////// Initialize //////////////////////////////// 00051 void LPS25H::init(void) 00052 { 00053 _i2c.frequency(100000); 00054 // Check acc is available of not 00055 dt[0] = LPS25H_WHO_AM_I; 00056 _i2c.write(LPS25H_addr, dt, 1, true); 00057 _i2c.read(LPS25H_addr, dt, 1, false); 00058 if (dt[0] == I_AM_LPS25H) { 00059 LPS25H_id = I_AM_LPS25H; 00060 LPS25H_ready = 1; 00061 } else { 00062 LPS25H_id = 0; 00063 LPS25H_ready = 0; 00064 return; // acc chip is NOT on I2C line then terminate 00065 } 00066 if (LPS25H_mode == FIFO_HW_FILTER){ 00067 // Hardware digital filter 00068 // AN4450 April 2014 Rev1 P20/26, Filter enabling and suggested configuration 00069 dt[0] = LPS25H_RES_CONF; 00070 dt[1] = 0x05; 00071 _i2c.write(LPS25H_addr, dt, 2, false); 00072 dt[0] = LPS25H_FIFO_CTRL; 00073 dt[1] = 0xdf; 00074 _i2c.write(LPS25H_addr, dt, 2, false); 00075 dt[0] = LPS25H_CTRL_REG2; 00076 dt[1] = 0x40; 00077 _i2c.write(LPS25H_addr, dt, 2, false); 00078 dt[0] = LPS25H_CTRL_REG1; 00079 dt[1] = 0x90; 00080 _i2c.write(LPS25H_addr, dt, 2, false); 00081 } else { 00082 dt[0] = LPS25H_CTRL_REG2; 00083 dt[1] = 0x0; 00084 _i2c.write(LPS25H_addr, dt, 2, false); 00085 dt[0] = LPS25H_CTRL_REG1; 00086 dt[1] = CR_STD_SET; 00087 _i2c.write(LPS25H_addr, dt, 2, false); 00088 } 00089 } 00090 00091 /////////////// Start conv. and gwt all data ////////////// 00092 void LPS25H::get(void) 00093 { 00094 if (LPS25H_ready == 0) { 00095 press = 0; 00096 temp = 0; 00097 return; 00098 } 00099 dt[0] = LPS25H_PRESS_POUT_XL | 0x80; 00100 _i2c.write(LPS25H_addr, dt, 1, true); 00101 _i2c.read(LPS25H_addr, dt, 3, false); 00102 press = dt[2] << 16 | dt[1] << 8 | dt[0]; 00103 dt[0] = LPS25H_TEMP_OUT_L | 0x80; 00104 _i2c.write(LPS25H_addr, dt, 1, true); 00105 _i2c.read(LPS25H_addr, dt, 2, false); 00106 temp = dt[1] << 8 | dt[0]; 00107 } 00108 00109 /////////////// Read data from sensor ///////////////////// 00110 float LPS25H::pressure() 00111 { 00112 return (float)press / 4096; 00113 } 00114 00115 /////////////// Read data from sensor ///////////////////// 00116 float LPS25H::temperature() 00117 { 00118 return (float)temp / 480 + 42.5f; //added 'f' to stop warning regarding single precision implicit conversion to double MS 29/03/2017 00119 } 00120 00121 /////////////// ID //////////////////////////////////////// 00122 uint8_t LPS25H::read_id() 00123 { 00124 dt[0] = LPS25H_WHO_AM_I; 00125 _i2c.write(LPS25H_addr, dt, 1, true); 00126 _i2c.read(LPS25H_addr, dt, 1, false); 00127 return (uint8_t)dt[0]; 00128 } 00129 00130 /////////////// I2C Freq. ///////////////////////////////// 00131 void LPS25H::frequency(int hz) 00132 { 00133 _i2c.frequency(hz); 00134 } 00135 00136 /////////////// General purpose R/W /////////////////////// 00137 uint8_t LPS25H::read_reg(uint8_t addr) 00138 { 00139 if (LPS25H_ready == 1) { 00140 dt[0] = addr; 00141 _i2c.write(LPS25H_addr, dt, 1, true); 00142 _i2c.read(LPS25H_addr, dt, 1, false); 00143 } else { 00144 dt[0] = 0xff; 00145 } 00146 return (uint8_t)dt[0]; 00147 } 00148 00149 void LPS25H::write_reg(uint8_t addr, uint8_t data) 00150 { 00151 if (LPS25H_ready == 1) { 00152 dt[0] = addr; 00153 dt[1] = data; 00154 _i2c.write(LPS25H_addr, dt, 2, false); 00155 } 00156 }
Generated on Tue Jul 12 2022 19:35:12 by
1.7.2
