気圧センサ LPS25H を I2C 接続で使うためのライブラリ. Library for atmospheric pressure sensor LPS25H using I2C interface.

Dependents:   Demo_LPS25H

LPS25H_I2C.cpp

Committer:
MikamiUitOpen
Date:
2016-12-18
Revision:
0:888288e9f8d5

File content as of revision 0:888288e9f8d5:

//---------------------------------------------------------
//  Class for atmospheric pressure sensor LPS25H
//
//      Interface: I2C only
//
//  2016/12/18, Copyright (c) 2016 MIKAMI, Naoki
//---------------------------------------------------------

#include "LPS25H_I2C.hpp"

namespace Mikami
{
    // Constructor
    Lps25hI2c::Lps25hI2c(PinName sda, PinName scl, uint8_t addr)
        : ADDR_(addr), i2cPtr_(new I2C(sda, scl))
    {
        i2cPtr_->write(ADDR_, (char[]){0x0F}, 1); // 0x0F: WHO_AM_I register address
        char whoAmI;
        i2cPtr_->read(ADDR_, &whoAmI, 1);

        printf("LPS25H\'s WHO_AM_I = 0x%X\r\n", whoAmI);

        if (whoAmI != 0xBD)
            error("Failed to connect to LPS25H: register WHO_AM_I was not 0xBD.\r\n");

        // 0x20: CTRL_REG1 register address
        // 0x90: No Power-Save, 1Hz
        i2cPtr_->write(ADDR_, (char[]){0x20, 0x90}, 2);
    }

    float Lps25hI2c::Read()
    {
        union { uint32_t u32; char press[4]; } rawData = { .u32 = 0 };

        i2cPtr_->write(ADDR_, (char[]){0x28}, 1);
        i2cPtr_->read(ADDR_, &rawData.press[0], 1);   // lowest part

        i2cPtr_->write(ADDR_, (char[]){0x29}, 1);
        i2cPtr_->read(ADDR_, &rawData.press[1], 1);   // middle part

        i2cPtr_->write(ADDR_, (char[]){0x2A}, 1);
        i2cPtr_->read(ADDR_, &rawData.press[2], 1);   // highest part

        return rawData.u32/4096.0f;
    }
}