/ Adafruit_H3LIS331.cpp
Adafruit_H3LIS331.cpp
  1  /*!
  2   * @file Adafruit_H3LIS331.cpp
  3   */
  4  
  5  #include "Arduino.h"
  6  
  7  #include <Adafruit_H3LIS331.h>
  8  #include <Wire.h>
  9  
 10  /*!
 11   *  @brief  Instantiates a new H3LIS331 class
 12   */
 13  Adafruit_H3LIS331::Adafruit_H3LIS331(){};
 14  
 15  /*!
 16   *    @brief  Sets up the hardware and initializes I2C
 17   *    @param  i2c_address
 18   *            The I2C address to be used.
 19   *    @param  wire
 20   *            The Wire object to be used for I2C connections.
 21   *    @param  sensor_id
 22   *            The user-defined ID to differentiate different sensors
 23   *    @return True if initialization was successful, otherwise false.
 24   */
 25  bool Adafruit_H3LIS331::begin_I2C(uint8_t i2c_address, TwoWire *wire,
 26                                    int32_t sensor_id) {
 27    if (i2c_dev) {
 28      delete i2c_dev; // remove old interface
 29    }
 30  
 31    i2c_dev = new Adafruit_I2CDevice(i2c_address, wire);
 32  
 33    if (!i2c_dev->begin()) {
 34      return false;
 35    }
 36  
 37    return _init(sensor_id);
 38  }
 39  
 40  /*!
 41   *    @brief  Sets up the hardware and initializes hardware SPI
 42   *    @param  cs_pin The arduino pin # connected to chip select
 43   *    @param  theSPI The SPI object to be used for SPI connections.
 44   *    @param  sensor_id
 45   *            The user-defined ID to differentiate different sensors
 46   *    @return True if initialization was successful, otherwise false.
 47   */
 48  bool Adafruit_H3LIS331::begin_SPI(uint8_t cs_pin, SPIClass *theSPI,
 49                                    int32_t sensor_id) {
 50    i2c_dev = NULL;
 51  
 52    if (spi_dev) {
 53      delete spi_dev; // remove old interface
 54    }
 55    spi_dev = new Adafruit_SPIDevice(cs_pin,
 56                                     1000000,               // frequency
 57                                     SPI_BITORDER_MSBFIRST, // bit order
 58                                     SPI_MODE0,             // data mode
 59                                     theSPI);
 60    if (!spi_dev->begin()) {
 61      return false;
 62    }
 63  
 64    return _init(sensor_id);
 65  }
 66  
 67  /*!
 68   *    @brief  Sets up the hardware and initializes software SPI
 69   *    @param  cs_pin The arduino pin # connected to chip select
 70   *    @param  sck_pin The arduino pin # connected to SPI clock
 71   *    @param  miso_pin The arduino pin # connected to SPI MISO
 72   *    @param  mosi_pin The arduino pin # connected to SPI MOSI
 73   *    @param  sensor_id
 74   *            The user-defined ID to differentiate different sensors
 75   *    @return True if initialization was successful, otherwise false.
 76   */
 77  bool Adafruit_H3LIS331::begin_SPI(int8_t cs_pin, int8_t sck_pin,
 78                                    int8_t miso_pin, int8_t mosi_pin,
 79                                    int32_t sensor_id) {
 80    i2c_dev = NULL;
 81  
 82    if (spi_dev) {
 83      delete spi_dev; // remove old interface
 84    }
 85    spi_dev = new Adafruit_SPIDevice(cs_pin, sck_pin, miso_pin, mosi_pin,
 86                                     1000000,               // frequency
 87                                     SPI_BITORDER_MSBFIRST, // bit order
 88                                     SPI_MODE0);            // data mode
 89    if (!spi_dev->begin()) {
 90      return false;
 91    }
 92  
 93    return _init(sensor_id);
 94  }
 95  
 96  /*!  @brief Initializer for post i2c/spi init
 97   *   @param sensor_id Optional unique ID for the sensor set
 98   *   @returns True if chip identified and initialized
 99   */
100  bool Adafruit_H3LIS331::_init(int32_t sensor_id) {
101  
102    uint8_t device_id = getDeviceID();
103    /* Check connection */
104    if (device_id != LIS331_CHIP_ID) {
105      /* No H3LIS331 detected ... return false */
106      // Serial.print("Chip ID: 0x");Serial.println(device_id, HEX);
107      return false;
108    }
109    Adafruit_BusIO_Register _ctrl1 = Adafruit_BusIO_Register(
110        i2c_dev, spi_dev, ADDRBIT8_HIGH_TOREAD, LIS331_REG_CTRL1, 1);
111    _ctrl1.write(0x07); // enable all axes, normal mode
112    enableHighPassFilter(false);
113    setDataRate(LIS331_DATARATE_1000_HZ);
114    setRange(H3LIS331_RANGE_400_G);
115  
116    return true;
117  }
118  
119  void Adafruit_H3LIS331::_scaleValues(void) {
120  
121    // actually 12 bit but left justified
122    x >>= 4;
123    y >>= 4;
124    z >>= 4;
125    uint8_t range = getRange();
126    uint16_t scale_max = 1;
127    if (range == H3LIS331_RANGE_100_G)
128      scale_max = 100;
129    if (range == H3LIS331_RANGE_200_G)
130      scale_max = 200;
131    if (range == H3LIS331_RANGE_400_G)
132      scale_max = 400;
133  
134    float lsb_value = 2 * scale_max * (float)1 / 4096;
135  
136    x_g = ((float)x * lsb_value);
137    y_g = ((float)y * lsb_value);
138    z_g = ((float)z * lsb_value);
139  }
140  
141  /**
142   *  @brief  Sets the measurement range for the H3LIS331
143   *  @param  range The range to set
144   */
145  
146  void Adafruit_H3LIS331::setRange(h3lis331dl_range_t range) {
147    writeRange((uint8_t)range);
148  }
149  
150  /**
151   *   @brief  Gets the measurement range for the H3LIS331
152   *   @return The range value
153   */
154  h3lis331dl_range_t Adafruit_H3LIS331::getRange(void) {
155  
156    return (h3lis331dl_range_t)readRange();
157  }