Files
arduino-libs/arduino-cli/libraries/Adafruit_Circuit_Playground/utility/Adafruit_CPlay_LIS3DH.h
2024-07-20 22:09:06 +08:00

397 lines
17 KiB
C++

/*!
* @file Adafruit_CPlay_LIS3DH.h
*
* This is a library for the Adafruit LIS3DH Accel breakout board
*
* Designed specifically to work with the Adafruit LIS3DH Triple-Axis
*Accelerometer
* (+-2g/4g/8g/16g)
*
* Pick one up today in the adafruit shop!
* ------> https://www.adafruit.com/product/2809
*
* This sensor communicates over I2C or SPI (our library code supports
*both) so you can share it with a bunch of other sensors on the same I2C bus.
* There's an address selection pin so you can have two accelerometers share an
*I2C bus.
*
* Adafruit invests time and resources providing this open source code,
* please support Adafruit andopen-source hardware by purchasing products
* from Adafruit!
*
* K. Townsend / Limor Fried (Ladyada) - (Adafruit Industries).
*
* BSD license, all text above must be included in any redistribution
*/
#ifndef ADAFRUIT_CPLAY_LIS3DH_H
#define ADAFRUIT_CPLAY_LIS3DH_H
#include "Arduino.h"
#include <SPI.h>
#include <Wire.h>
#include "Adafruit_CPlay_Sensor.h"
/** I2C ADDRESS/BITS **/
#define LIS3DH_DEFAULT_ADDRESS (0x18) // if SDO/SA0 is 3V, its 0x19
/*!
* STATUS_REG_AUX register
* 321OR 1, 2 and 3 axis data overrun. Default value: 0
* (0: no overrun has occurred; 1: a new set of data has overwritten
* the previous ones) 3OR 3 axis data overrun. Default value: 0 (0: no
* overrun has occurred; 1: a new data for the 3-axis has overwritten the
* previous one) 2OR 2 axis data overrun. Default value: 0 (0: no overrun has
* occurred; 1: a new data for the 4-axis has overwritten the previous one) 1OR
* 1 axis data overrun. Default value: 0 (0: no overrun has occurred; 1: a new
* data for the 1-axis has overwritten the previous one) 321DA 1, 2 and 3 axis
* new data available. Default value: 0 (0: a new set of data is not yet
* available; 1: a new set of data is available) 3DA: 3 axis new data
* available. Default value: 0 (0: a new data for the 3-axis is not yet
* available; 1: a new data for the 3-axis is available) 2DA: 2 axis new data
* available. Default value: 0 (0: a new data for the 2-axis is not yet
* available; 1: a new data for the 2-axis is available) 1DA 1 axis new data
* available. Default value: 0 (0: a new data for the 1-axis is not yet
* available; 1: a new data for the 1-axis is available)
*/
#define LIS3DH_REG_STATUS1 0x07
#define LIS3DH_REG_OUTADC1_L 0x08 /**< 1-axis acceleration data. Low value */
#define LIS3DH_REG_OUTADC1_H 0x09 /**< 1-axis acceleration data. High value */
#define LIS3DH_REG_OUTADC2_L 0x0A /**< 2-axis acceleration data. Low value */
#define LIS3DH_REG_OUTADC2_H 0x0B /**< 2-axis acceleration data. High value */
#define LIS3DH_REG_OUTADC3_L 0x0C /**< 3-axis acceleration data. Low value */
#define LIS3DH_REG_OUTADC3_H 0x0D /**< 3-axis acceleration data. High value */
#define LIS3DH_REG_INTCOUNT \
0x0E /**< INT_COUNTER register [IC7, IC6, IC5, IC4, IC3, IC2, IC1, IC0] */
#define LIS3DH_REG_WHOAMI \
0x0F /**< Device identification register. [0, 0, 1, 1, 0, 0, 1, 1] */
/*!
* TEMP_CFG_REG
* Temperature configuration register.
* ADC_PD ADC enable. Default value: 0
* (0: ADC disabled; 1: ADC enabled)
* TEMP_EN Temperature sensor (T) enable. Default value: 0
* (0: T disabled; 1: T enabled)
*/
#define LIS3DH_REG_TEMPCFG 0x1F
/*!
* CTRL_REG1
* [ODR3, ODR2, ODR1, ODR0, LPen, Zen, Yen, Xen]
* ODR3-0 Data rate selection. Default value: 00
* (0000:50 Hz; Others: Refer to Datasheet Table 26, “Data rate
* configuration”) LPen Low power mode enable. Default value: 0 (0: normal
* mode, 1: low power mode) Zen Z axis enable. Default value: 1 (0: Z axis
* disabled; 1: Z axis enabled) Yen Y axis enable. Default value: 1 (0: Y
* axis disabled; 1: Y axis enabled) Xen X axis enable. Default value: 1 (0:
* X axis disabled; 1: X axis enabled)
*/
#define LIS3DH_REG_CTRL1 0x20
/*!
* CTRL_REG2
* [HPM1, HPM0, HPCF2, HPCF1, FDS, HPCLICK, HPIS2, HPIS1]
* HPM1-0 High pass filter mode selection. Default value: 00
* Refer to Table 29, "High pass filter mode configuration"
* HPCF2-1 High pass filter cut off frequency selection
* FDS Filtered data selection. Default value: 0
* (0: internal filter bypassed; 1: data from
*internal filter sent to output register and FIFO) HPCLICK High pass filter
*enabled for CLICK function. (0: filter bypassed; 1: filter enabled) HPIS2 X
*axis enable. Default value: 1 (0: X axis disabled; 1: X axis enabled) HPIS1
*High pass filter enabled for AOI function on interrupt 1, (0: filter bypassed;
*1: filter enabled)
*/
#define LIS3DH_REG_CTRL2 0x21
/*!
* CTRL_REG3
* [I1_CLICK, I1_AOI1, I1_AOI2, I1_DRDY1, I1_DRDY2, I1_WTM, I1_OVERRUN, --]
* I1_CLICK CLICK interrupt on INT1. Default value 0.
* (0: Disable; 1: Enable)
* I1_AOI1 AOI1 interrupt on INT1. Default value 0.
* (0: Disable; 1: Enable)
* I1_AOI2 AOI2 interrupt on INT1. Default value 0.
* (0: Disable; 1: Enable)
* I1_DRDY1 DRDY1 interrupt on INT1. Default value 0.
* (0: Disable; 1: Enable)
* I1_DRDY2 DRDY2 interrupt on INT1. Default value 0.
* (0: Disable; 1: Enable)
* I1_WTM FIFO Watermark interrupt on INT1. Default value 0.
* (0: Disable; 1: Enable)
* I1_OVERRUN FIFO Overrun interrupt on INT1. Default value 0.
* (0: Disable; 1: Enable)
*/
#define LIS3DH_REG_CTRL3 0x22
/*!
* CTRL_REG4
* [BDU, BLE, FS1, FS0, HR, ST1, ST0, SIM]
* BDU Block data update. Default value: 0
* (0: continuos update; 1: output registers not updated until MSB
* and LSB reading) BLE Big/little endian data selection. Default value 0.
* (0: Data LSB @ lower address; 1: Data MSB @ lower address)
* FS1-FS0 Full scale selection. default value: 00
* (00: +/- 2G; 01: +/- 4G; 10: +/- 8G; 11: +/- 16G)
* HR High resolution output mode: Default value: 0
* (0: High resolution disable; 1: High resolution Enable)
* ST1-ST0 Self test enable. Default value: 00
* (00: Self test disabled; Other: See Table 34)
* SIM SPI serial interface mode selection. Default value: 0
* (0: 4-wire interface; 1: 3-wire interface).
*/
#define LIS3DH_REG_CTRL4 0x23
/*!
* CTRL_REG5
* [BOOT, FIFO_EN, --, --, LIR_INT1, D4D_INT1, 0, 0]
* BOOT Reboot memory content. Default value: 0
* (0: normal mode; 1: reboot memory content)
* FIFO_EN FIFO enable. Default value: 0
* (0: FIFO disable; 1: FIFO Enable)
* LIR_INT1 Latch interrupt request on INT1_SRC register, with INT1_SRC
* register cleared by reading INT1_SRC itself. Default value: 0. (0: interrupt
* request not latched; 1: interrupt request latched) D4D_INT1 4D enable: 4D
* detection is enabled on INT1 when 6D bit on INT1_CFG is set to 1.
*/
#define LIS3DH_REG_CTRL5 0x24
/*!
* CTRL_REG6
* [I2_CLICKen, I2_INT1, 0, BOOT_I1, 0, --, H_L, -]
*/
#define LIS3DH_REG_CTRL6 0x25
#define LIS3DH_REG_REFERENCE 0x26 /**< REFERENCE/DATACAPTURE **/
/*!
* STATUS_REG
* [ZYXOR, ZOR, YOR, XOR, ZYXDA, ZDA, YDA, XDA]
* ZYXOR X, Y and Z axis data overrun. Default value: 0
* (0: no overrun has occurred; 1: a new set of data has overwritten
* the previous ones) ZOR Z axis data overrun. Default value: 0 (0: no
* overrun has occurred; 1: a new data for the Z-axis has overwritten the
* previous one) YOR Y axis data overrun. Default value: 0 (0: no overrun
* has occurred; 1: a new data for the Y-axis has overwritten the previous one)
* XOR X axis data overrun. Default value: 0
* (0: no overrun has occurred; 1: a new data for the X-axis has
* overwritten the previous one) ZYXDA X, Y and Z axis new data available.
* Default value: 0 (0: a new set of data is not yet available; 1: a new set of
* data is available) ZDA Z axis new data available. Default value: 0 (0: a
* new data for the Z-axis is not yet available; 1: a new data for the Z-axis is
* available) YDA Y axis new data available. Default value: 0 (0: a new
* data for the Y-axis is not yet available; 1: a new data for the Y-axis is
* available)
*/
#define LIS3DH_REG_STATUS2 0x27
#define LIS3DH_REG_OUT_X_L 0x28 /**< X-axis acceleration data. Low value */
#define LIS3DH_REG_OUT_X_H 0x29 /**< X-axis acceleration data. High value */
#define LIS3DH_REG_OUT_Y_L 0x2A /**< Y-axis acceleration data. Low value */
#define LIS3DH_REG_OUT_Y_H 0x2B /**< Y-axis acceleration data. High value */
#define LIS3DH_REG_OUT_Z_L 0x2C /**< Z-axis acceleration data. Low value */
#define LIS3DH_REG_OUT_Z_H 0x2D /**< Z-axis acceleration data. High value */
/*!
* FIFO_CTRL_REG
* [FM1, FM0, TR, FTH4, FTH3, FTH2, FTH1, FTH0]
* FM1-FM0 FIFO mode selection. Default value: 00 (see Table 44)
* TR Trigger selection. Default value: 0
* 0: Trigger event liked to trigger signal on INT1
* 1: Trigger event liked to trigger signal on INT2
* FTH4:0 Default value: 0
*/
#define LIS3DH_REG_FIFOCTRL 0x2E
#define LIS3DH_REG_FIFOSRC \
0x2F /**< FIFO_SRC_REG [WTM, OVRN_FIFO, EMPTY, FSS4, FSS3, FSS2, FSS1, FSS0] \
*/
/*!
* INT1_CFG
* [AOI, 6D, ZHIE/ZUPE, ZLIE/ZDOWNE, YHIE/YUPE, XHIE/XUPE, XLIE/XDOWNE]
* AOI And/Or combination of Interrupt events. Default value: 0. Refer
* to Datasheet Table 48, "Interrupt mode" 6D 6 direction detection
* function enabled. Default value: 0. Refer to Datasheet Table 48, "Interrupt
* mode" ZHIE/ZUPE Enable interrupt generation on Z high event or on Direction
* recognition. Default value: 0. (0: disable interrupt request; 1: enable
* interrupt request) ZLIE/ZDOWNE Enable interrupt generation on Z low event or
* on Direction recognition. Default value: 0. YHIE/YUPE Enable interrupt
* generation on Y high event or on Direction recognition. Default value: 0. (0:
* disable interrupt request; 1: enable interrupt request.) YLIE/YDOWNE Enable
* interrupt generation on Y low event or on Direction recognition. Default
* value: 0. (0: disable interrupt request; 1: enable interrupt request.)
* XHIE/XUPE Enable interrupt generation on X high event or on Direction
* recognition. Default value: 0. (0: disable interrupt request; 1: enable
* interrupt request.) XLIE/XDOWNE Enable interrupt generation on X low event or
* on Direction recognition. Default value: 0. (0: disable interrupt request; 1:
* enable interrupt request.)
*/
#define LIS3DH_REG_INT1CFG 0x30
/*!
* INT1_SRC
* [0, IA, ZH, ZL, YH, YL, XH, XL]
* IA Interrupt active. Default value: 0
* (0: no interrupt has been generated; 1: one or more interrupts have
* been generated) ZH Z high. Default value: 0 (0: no interrupt, 1: Z High
* event has occurred) ZL Z low. Default value: 0 (0: no interrupt; 1: Z Low
* event has occurred) YH Y high. Default value: 0 (0: no interrupt, 1: Y High
* event has occurred) YL Y low. Default value: 0 (0: no interrupt, 1: Y Low
* event has occurred) XH X high. Default value: 0 (0: no interrupt, 1: X High
* event has occurred) XL X low. Default value: 0 (0: no interrupt, 1: X Low
* event has occurred)
*
* Interrupt 1 source register. Read only register.
* Reading at this address clears INT1_SRC IA bit (and the interrupt signal
* on INT 1 pin) and allows the refreshment of data in the INT1_SRC register if
* the latched option was chosen.
*/
#define LIS3DH_REG_INT1SRC 0x31
#define LIS3DH_REG_INT1THS \
0x32 /**< INT1_THS register [0, THS6, THS5, THS4, THS3, THS1, THS0] */
#define LIS3DH_REG_INT1DUR \
0x33 /**< INT1_DURATION [0, D6, D5, D4, D3, D2, D1, D0] */
/*!
* CLICK_CFG
* [--, --, ZD, ZS, YD, YS, XD, XS]
* ZD Enable interrupt double CLICK-CLICK on Z axis. Default value: 0
* (0: disable interrupt request;
* 1: enable interrupt request on measured accel. value higher than
* preset threshold) ZS Enable interrupt single CLICK-CLICK on Z axis. Default
* value: 0 (0: disable interrupt request; 1: enable interrupt request on
* measured accel. value higher than preset threshold) YD Enable interrupt
* double CLICK-CLICK on Y axis. Default value: 0 (0: disable interrupt request;
* 1: enable interrupt request on measured accel. value higher than
* preset threshold) YS Enable interrupt single CLICK-CLICK on Y axis. Default
* value: 0 (0: disable interrupt request; 1: enable interrupt request on
* measured accel. value higher than preset threshold) XD Enable interrupt
* double CLICK-CLICK on X axis. Default value: 0 (0: disable interrupt request;
* 1: enable interrupt request on measured accel. value higher than preset
* threshold) XS Enable interrupt single CLICK-CLICK on X axis. Default value:
* 0 (0: disable interrupt request; 1: enable interrupt request on measured
* accel. value higher than preset threshold)
*/
#define LIS3DH_REG_CLICKCFG 0x38
/*!
* CLICK_SRC
* [-, IA, DCLICK, SCLICK, Sign, Z, Y, X]
* IA Interrupt active. Default value: 0
* (0: no interrupt has been generated; 1: one or more interrupts have
* been generated) DCLICK Double CLICK-CLICK enable. Default value: 0 (0:double
* CLICK-CLICK detection disable, 1: double CLICK-CLICK detection enable) SCLICK
* Single CLICK-CLICK enable. Default value: 0 (0:Single CLICK-CLICK detection
* disable, 1: single CLICK-CLICK detection enable) Sign CLICK-CLICK Sign.
* (0: positive detection, 1: negative detection)
* Z Z CLICK-CLICK detection. Default value: 0
* (0: no interrupt, 1: Z High event has occurred)
* Y Y CLICK-CLICK detection. Default value: 0
* (0: no interrupt, 1: Y High event has occurred)
* X X CLICK-CLICK detection. Default value: 0
* (0: no interrupt, 1: X High event has occurred)
*/
#define LIS3DH_REG_CLICKSRC 0x39
/*!
* CLICK_THS
* [-, Ths6, Ths5, Ths4, Ths3, Ths2, Ths1, Ths0]
* Ths6-Ths0 CLICK-CLICK threshold. Default value: 000 0000
*/
#define LIS3DH_REG_CLICKTHS 0x3A
/*!
* TIME_LIMIT
* [-, TLI6, TLI5, TLI4, TLI3, TLI2, TLI1, TLI0]
* TLI7-TLI0 CLICK-CLICK Time Limit. Default value: 000 0000
*/
#define LIS3DH_REG_TIMELIMIT 0x3B
/*!
* TIME_LATANCY
* [-, TLA6, TLIA5, TLA4, TLA3, TLA2, TLA1, TLA0]
* TLA7-TLA0 CLICK-CLICK Time Latency. Default value: 000 0000
*/
#define LIS3DH_REG_TIMELATENCY 0x3C
/*!
* TIME_WINDOW
* [TW7, TW6, TW5, TW4, TW3, TW2, TW1, TW0]
* TW7-TW0 CLICK-CLICK Time window
*/
#define LIS3DH_REG_TIMEWINDOW 0x3D
/** A structure to represent scales **/
typedef enum {
LIS3DH_RANGE_16_G = 0b11, // +/- 16g
LIS3DH_RANGE_8_G = 0b10, // +/- 8g
LIS3DH_RANGE_4_G = 0b01, // +/- 4g
LIS3DH_RANGE_2_G = 0b00 // +/- 2g (default value)
} lis3dh_range_t;
/** A structure to represent axes **/
typedef enum {
LIS3DH_AXIS_X = 0x0,
LIS3DH_AXIS_Y = 0x1,
LIS3DH_AXIS_Z = 0x2,
} lis3dh_axis_t;
/** Used with register 0x2A (LIS3DH_REG_CTRL_REG1) to set bandwidth **/
typedef enum {
LIS3DH_DATARATE_400_HZ = 0b0111, // 400Hz
LIS3DH_DATARATE_200_HZ = 0b0110, // 200Hz
LIS3DH_DATARATE_100_HZ = 0b0101, // 100Hz
LIS3DH_DATARATE_50_HZ = 0b0100, // 50Hz
LIS3DH_DATARATE_25_HZ = 0b0011, // 25Hz
LIS3DH_DATARATE_10_HZ = 0b0010, // 10 Hz
LIS3DH_DATARATE_1_HZ = 0b0001, // 1 Hz
LIS3DH_DATARATE_POWERDOWN = 0,
LIS3DH_DATARATE_LOWPOWER_1K6HZ = 0b1000,
LIS3DH_DATARATE_LOWPOWER_5KHZ = 0b1001,
} lis3dh_dataRate_t;
/*!
* @brief Class that stores state and functions for interacting with
* Adafruit_LIS3DH
*/
class Adafruit_CPlay_LIS3DH : public Adafruit_Sensor {
public:
Adafruit_CPlay_LIS3DH(TwoWire *Wi = &Wire);
Adafruit_CPlay_LIS3DH(int8_t cspin, SPIClass *theSPI = &SPI);
Adafruit_CPlay_LIS3DH(int8_t cspin, int8_t mosipin, int8_t misopin, int8_t sckpin);
bool begin(uint8_t addr = LIS3DH_DEFAULT_ADDRESS, uint8_t nWAI = 0x33);
uint8_t getDeviceID();
bool haveNewData();
void read();
int16_t readADC(uint8_t a);
void setRange(lis3dh_range_t range);
lis3dh_range_t getRange(void);
void setDataRate(lis3dh_dataRate_t dataRate);
lis3dh_dataRate_t getDataRate(void);
bool getEvent(sensors_event_t *event);
void getSensor(sensor_t *sensor);
void setClick(uint8_t c, uint8_t clickthresh, uint8_t timelimit = 10,
uint8_t timelatency = 20, uint8_t timewindow = 255);
uint8_t getClick(void);
int16_t x; /**< x axis value */
int16_t y; /**< y axis value */
int16_t z; /**< z axis value */
float x_g; /**< x_g axis value (calculated by selected range) */
float y_g; /**< y_g axis value (calculated by selected range) */
float z_g; /**< z_g axis value (calculated by selected scale) */
protected:
uint8_t spixfer(uint8_t x = 0xFF);
void writeRegister8(uint8_t reg, uint8_t value);
uint8_t readRegister8(uint8_t reg);
private:
TwoWire *I2Cinterface;
SPIClass *SPIinterface;
uint8_t _wai;
int8_t _cs, _mosi, _miso, _sck;
int8_t _i2caddr;
int32_t _sensorID;
};
#endif