LPS22HB library
Diff: LPS22HB.h
- Revision:
- 1:5f21b0eac2c2
- Child:
- 2:b6cb5c37b974
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/LPS22HB.h Wed Nov 30 17:45:08 2016 +0000 @@ -0,0 +1,230 @@ +/* + * mbed library program + * LPS25H MEMS pressure sensor: 260-1260 hPa absolute digital output barometer + * made by STMicroelectronics + * http://www.st-japan.co.jp/web/catalog/sense_power/FM89/SC1316/PF255230 + * + * Copyright (c) 2015 Kenji Arai / JH1PJL + * http://www.page.sannet.ne.jp/kenjia/index.html + * http://mbed.org/users/kenjiArai/ + * Created: Feburary 21st, 2015 + * Revised: Feburary 22nd, 2015 + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE + * AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +/* + *---------------- REFERENCE ---------------------------------------------------------------------- + * Original Information + * http://www.st-japan.co.jp/web/jp/catalog/sense_power/FM89/SC1316/PF255230 + * AN4450 Application Note (as follows) + * http://www.st.com/st-web-ui/static/active/jp/ + * resource/technical/document/application_note/DM00108837.pdf + * Device kit + * http://akizukidenshi.com/catalog/g/gK-08338/ + */ + +#ifndef LPS22HB_H +#define LPS22HB_H + +#include "mbed.h" + +// LPS22HB Address +// 7bit address = 0b101110x(0x5c or 0x5d depends on SA0/SDO) +#define LPS22HB_G_CHIP_ADDR (0x5c << 1) // SA0(=SDO pin) = Ground +#define LPS22HB_V_CHIP_ADDR (0x5d << 1) // SA0(=SDO pin) = Vdd + +// MODE Selection +//#define FIFO_HW_FILTER 1 +//#define FIFO_BYPASS 0 + +// LPS22HB ID +#define I_AM_LPS22HB 0xb1 + +// Register's definition +#define LPS22HB_WHO_AM_I 0x0f +#define LPS22HB_RES_CONF 0x1a + +#define LPS22HB_CTRL_REG1 0x10 +#define LPS22HB_CTRL_REG2 0x11 +#define LPS22HB_CTRL_REG3 0x12 + +#define LPS22HB_STATUS_REG 0x27 +#define LPS22HB_PRESS_POUT_XL 0x28 +#define LPS22HB_PRESS_OUT_L 0x29 +#define LPS22HB_PRESS_OUT_H 0x2a +#define LPS22HB_TEMP_OUT_L 0x2b +#define LPS22HB_TEMP_OUT_H 0x2c + +#define LPS22HB_FIFO_CTRL 0x14 +#define LPS22HB_FIFO_STATUS 0x26 + +// Control Reg. +/*//#define PD (0UL << 7) +//#define ACTIVE (1UL << 7) +#define ODR_ONESHOT (0UL << 4) +#define ODR_1HZ (1UL << 4) +#define ODR_7HZ (1UL << 4) +#define ODR_12R5HZ (2UL << 4) +#define ODR_25HZ (3UL << 4) +#define BDU_SET (1UL << 2) +#define CR_STD_SET (ACTIVE + ODR_7HZ + BDU_SET)*/ + +// FIFO Control +/*#define FIFO_MEAN_MODE 0xc0 +#define FIFO_SAMPLE_2 0x01 +#define FIFO_SAMPLE_4 0x03 +#define FIFO_SAMPLE_8 0x07 +#define FIFO_SAMPLE_16 0x0f +#define FIFO_SAMPLE_32 0x1f*/ + +/** Interface for STMicronics MEMS pressure sensor + * Chip: LPS22HB + * + * @code + * #include "mbed.h" + * #include "LPS22HB.h" + * + * // I2C Communication + * LPS22HB baro(p_sda, p_scl, LPS22HB_G_CHIP_ADDR); + * // If you connected I2C line not only this device but also other devices, + * // you need to declare following method. + * I2C i2c(dp5,dp27); // SDA, SCL + * LPS22HB baro(i2c, LPS22HB_G_CHIP_ADDR); + * + * int main() { + * while( trure){ + * baro.get(); + * printf("Presere: 0x%6.1f, Temperature: 0x%+4.1f\r\n", baro.pressue(), baro.temperature()); + * wait(1.0); + * } + * } + * @endcode + */ + +class LPS22HB +{ +public: + + enum lps22hb_odr { + LPS22HB_PD = 0x00, + LPS22HB_ODR_1HZ = 0x10, + LPS22HB_ODR_10HZ = 0x20, + LPS22HB_ODR_25HZ = 0x30, + LPS22HB_ODR_50HZ = 0x40, + LPS22HB_ODR_75HZ = 0x50 + }; + + enum lps22hb_lpf { + LPS22HB_LPF_DISABLE = 0x00, + LPS22HB_LPF_BW9 = 0x08, + LPS22HB_LPF_BW20 = 0x0c + }; + + enum lps22hb_drdy { + LPS22HB_DRDY_DISABLE = 0x00, + LPS22HB_DRDY_ENABLE = 0x04 + }; + + /** Configure data pin + * @param data SDA and SCL pins + * @param device address LPS22HB(SA0=0 or 1), LPS22HB_G_CHIP_ADDR or LPS22HB_V_CHIP_ADDR + * @param Operation mode FIFO_HW_FILTER(default) or FIFO_BYPASS (Option parameter) + */ + LPS22HB(PinName p_sda, PinName p_scl, uint8_t addr); + //LPS22HB(PinName p_sda, PinName p_scl, uint8_t addr, uint8_t mode); + + /** Configure data pin (with other devices on I2C line) + * @param I2C previous definition + * @param device address LPS22HB(SA0=0 or 1), LPS22HB_G_CHIP_ADDR or LPS22HB_V_CHIP_ADDR + * @param Operation mode FIFO_HW_FILTER(default) or FIFO_BYPASS (Option parameter) + */ + LPS22HB(I2C& p_i2c, uint8_t addr); + //LPS22HB(I2C& p_i2c, uint8_t addr, uint8_t mode); + + /** Start convertion & data save + * @param none + * @return none + */ + void get(void); + + /** Read pressure data + * @param none + * @return humidity + */ + float pressure(void); + + /** Read temperature data + * @param none + * @return temperature + */ + float temperature(void); + + /** Read a ID number + * @param none + * @return if STM MEMS LPS22HB, it should be I_AM_ LPS22HB + */ + uint8_t read_id(void); + + /** Read Data Ready flag + * @param none + * @return 1 = Ready + */ + uint8_t data_ready(void); + + /** Set I2C clock frequency + * @param freq. + * @return none + */ + void frequency(int hz); + + /** Read register (general purpose) + * @param register's address + * @return register data + */ + uint8_t read_reg(uint8_t addr); + + /** Write register (general purpose) + * @param register's address + * @param data + * @return none + */ + void write_reg(uint8_t addr, uint8_t data); + + /** Set output data rate (add by user) + * @param data rate config + * @return none + */ + void set_odr(lps22hb_odr odrcfg = LPS22HB_ODR_75HZ); + + /** LPF (add by user) + * @param LPF config + * @return none + */ + void set_lpf(lps22hb_lpf lpfcfg = LPS22HB_LPF_DISABLE); + + /** DRDY (add by user) + * @param DRDY config + * @return none + */ + void drdy(lps22hb_drdy drdycfg = LPS22HB_DRDY_DISABLE); + +protected: + I2C _i2c; + + void init(void); + +private: + char dt[6]; // working buffer + uint8_t LPS22HB_addr; // Sensor address + uint8_t LPS22HB_id; // ID + uint8_t LPS22HB_ready; // Device is on I2C line = 1, not = 0 + uint8_t LPS22HB_mode; // Operation mode + uint32_t press; // pressure raw data + int16_t temp; // temperature raw data +}; + +#endif // LPS22HB_H