From c4bb3d907e214664e8292d8fe1fc2a1b7d7b5d85 Mon Sep 17 00:00:00 2001 From: caternuson Date: Thu, 17 Mar 2022 13:56:27 -0700 Subject: [PATCH] add shake --- Adafruit_LSM6DS.cpp | 24 ++++++++++- Adafruit_LSM6DS.h | 3 +- .../adafruit_lsm6ds33_shake.ino | 40 +++++++++++++++++++ 3 files changed, 64 insertions(+), 3 deletions(-) create mode 100644 examples/adafruit_lsm6ds33_shake/adafruit_lsm6ds33_shake.ino diff --git a/Adafruit_LSM6DS.cpp b/Adafruit_LSM6DS.cpp index 45b10bd..bc0d811 100644 --- a/Adafruit_LSM6DS.cpp +++ b/Adafruit_LSM6DS.cpp @@ -708,8 +708,8 @@ void Adafruit_LSM6DS::enablePedometer(bool enable) { @param thresh The threshold (sensitivity) */ /**************************************************************************/ -void Adafruit_LSM6DS::enableWakeup(bool enable, uint8_t duration = 0, - uint8_t thresh = 20) { +void Adafruit_LSM6DS::enableWakeup(bool enable, uint8_t duration, + uint8_t thresh) { // enable or disable functionality Adafruit_BusIO_Register tapcfg = Adafruit_BusIO_Register( i2c_dev, spi_dev, ADDRBIT8_HIGH_TOREAD, LSM6DS_TAP_CFG); @@ -748,6 +748,26 @@ bool Adafruit_LSM6DS::awake(void) { return wake_evt.read(); } +/**************************************************************************/ +/*! + @brief Simple shake detection. Must call enableWakeup() first. + @returns True if shake (wake) detected, otherwise false. +*/ +/**************************************************************************/ +bool Adafruit_LSM6DS::shake(void) { + Adafruit_BusIO_Register tapcfg = Adafruit_BusIO_Register( + i2c_dev, spi_dev, ADDRBIT8_HIGH_TOREAD, LSM6DS_TAP_CFG); + Adafruit_BusIO_RegisterBits slope_en = + Adafruit_BusIO_RegisterBits(&tapcfg, 1, 4); + Adafruit_BusIO_RegisterBits timer_en = + Adafruit_BusIO_RegisterBits(&tapcfg, 1, 7); + // only check if enabled + if (slope_en.read() && timer_en.read()) { + return awake(); + } + return false; +} + /**************************************************************************/ /*! @brief Reset the pedometer count diff --git a/Adafruit_LSM6DS.h b/Adafruit_LSM6DS.h index 837a4c4..c3647d8 100644 --- a/Adafruit_LSM6DS.h +++ b/Adafruit_LSM6DS.h @@ -170,8 +170,9 @@ class Adafruit_LSM6DS { void configInt2(bool drdy_temp, bool drdy_g, bool drdy_xl); void highPassFilter(bool enabled, lsm6ds_hp_filter_t filter); - void enableWakeup(bool enable, uint8_t duration, uint8_t thresh); + void enableWakeup(bool enable, uint8_t duration = 0, uint8_t thresh = 20); bool awake(void); + bool shake(void); void enablePedometer(bool enable); void resetPedometer(void); diff --git a/examples/adafruit_lsm6ds33_shake/adafruit_lsm6ds33_shake.ino b/examples/adafruit_lsm6ds33_shake/adafruit_lsm6ds33_shake.ino new file mode 100644 index 0000000..3b3894f --- /dev/null +++ b/examples/adafruit_lsm6ds33_shake/adafruit_lsm6ds33_shake.ino @@ -0,0 +1,40 @@ +// Basic demo for accelerometer/gyro readings from Adafruit LSM6DS33 + +#include + +// For SPI mode, we need a CS pin +#define LSM_CS 10 +// For software-SPI mode we need SCK/MOSI/MISO pins +#define LSM_SCK 13 +#define LSM_MISO 12 +#define LSM_MOSI 11 + +Adafruit_LSM6DS33 lsm6ds33; +void setup(void) { + Serial.begin(115200); + while (!Serial) + delay(10); // will pause Zero, Leonardo, etc until serial console opens + + Serial.println("Adafruit LSM6DS33 shake test!"); + + if (!lsm6ds33.begin_I2C()) { + // if (!lsm6ds33.begin_SPI(LSM_CS)) { + // if (!lsm6ds33.begin_SPI(LSM_CS, LSM_SCK, LSM_MISO, LSM_MOSI)) { + Serial.println("Failed to find LSM6DS33 chip"); + while (1) { + delay(10); + } + } + + Serial.println("LSM6DS33 Found!"); + + // enable shake detection + lsm6ds33.enableWakeup(true); +} + +void loop() { + // check for shake + if (lsm6ds33.shake()) { + Serial.println("SHAKE!"); + } +} \ No newline at end of file