XIAO BLE Sense - LSM6DS3 INT1 Single Tap Interrupt

/*/

// IMU Interrupt Example for XIAO BLE Sense

// This example shows how to configure LMSD6S3TR-C on XIAO BLE SENSE to interrupt

// on INT1 after a "Double Tap" was recognized.

// Additionally, the device goes into System OFF state, after 5 interrupts were

// received. Another "Double Tap" will wake up the device again.

//

// Original by chuck

//poatched and toasted by pjg

/*/

#include "LSM6DS3.h"

#include "Wire.h"

#include <U8x8lib.h>

LSM6DS3 myIMU(I2C_MODE, 0x6A); // IMU

#define int1Pin 2

U8X8_SSD1306_128X64_NONAME_HW_I2C u8x8(/* clock=/ PIN_WIRE_SCL, / data=/ PIN_WIRE_SDA, / reset=*/ U8X8_PIN_NONE);

 // OLEDs without Reset of the Display

const int buttonPin = 1;     // the number of the pushbutton pin

int buttonState = 0;         // variable for reading the pushbutton status

int BuzzerPin = A3;

uint8_t interruptCount = 0; // Amount of received interrupts

uint8_t prevInterruptCount = 0; // Interrupt Counter from last loop

void setup() {

    Serial.begin(9600);

    delay(1000); //relax...

    Serial.println("Processor came out of reset.\n");

    u8x8.begin();

    u8x8.setFlipMode(1);   // set number from 1 to 3, the screen word will rotary 180

   

    pinMode(LED_BUILTIN, OUTPUT);// initialize the LED pin as an output:

    pinMode(buttonPin, INPUT_PULLUP);// initialize the pushbutton pin as an input:

    pinMode(BuzzerPin, OUTPUT);

    pinMode(LEDR, OUTPUT);

    pinMode(LEDG, OUTPUT);

    pinMode(LEDB, OUTPUT);

    setLedRGB(false, false, true); // set blue led

    myIMU.settings.gyroEnabled = 0; // Gyro currently not used, disabled to save power

    if (myIMU.begin() != 0) {

        Serial.println("IMU error");

    } else {

        Serial.println("IMU OK!");

    }

   

    setupDoubleTapInterrupt();

   

    pinMode(int1Pin, INPUT);

    attachInterrupt(digitalPinToInterrupt(int1Pin), int1ISR, RISING);

    u8x8.setFont(u8x8_font_8x13B_1x2_r);

    u8x8.clearDisplay();

    u8x8.setCursor(0, 0);

    u8x8.print("Tap Demo");

 

}

void loop() {

    setLedRGB(false, false, true); // reset led to blue only

    u8x8.setCursor(0, 3);

    u8x8.print(interruptCount);

    Serial.print("\Iterrupt Counter: ");

    Serial.println(interruptCount);

    // if interrupt was received in this cycle

    if (interruptCount > prevInterruptCount) {

      Serial.println("\Interrupt received!");

      setLedRGB(false, true, false); // set green only

    }

   

    prevInterruptCount = interruptCount;

   

    if (interruptCount >= 5) {

      // Trigger System OFF after 5 interrupts

      goToPowerOff();

    }

   

    delay(500);

}

// -------------------- System ------------------------- //

void goToPowerOff() {

  setLedRGB(false, false, false);

  Serial.println("Going to System OFF");

  u8x8.clearDisplay();

  u8x8.setCursor(0, 3);

  u8x8.print("SLEEP");

  setupDoubleTapInterrupt(); // not needed here, if already applied..

  delay(1000); // delay seems important to apply settings, before going to System OFF

  //Ensure interrupt pin from IMU is set to wake up device

  nrf_gpio_cfg_sense_input(digitalPinToInterrupt(int1Pin), NRF_GPIO_PIN_PULLDOWN, NRF_GPIO_PIN_SENSE_HIGH);

  // Trigger System OFF

  NRF_POWER->SYSTEMOFF = 1;

}

// -------------------- Interrupts ------------------------- //

void setupDoubleTapInterrupt() {

  uint8_t error = 0;

  uint8_t dataToWrite = 0;

  // Double Tap Config

  myIMU.writeRegister(LSM6DS3_ACC_GYRO_CTRL1_XL, 0x60); //* Acc = 416Hz (High-Performance mode)// Turn on the accelerometer

  // ODR_XL = 416 Hz, FS_XL = 2g

  myIMU.writeRegister(LSM6DS3_ACC_GYRO_TAP_CFG1, 0x8E);// INTERRUPTS_ENABLE, SLOPE_FDS// Enable interrupts and tap detection on X, Y, Z-axis

  myIMU.writeRegister(LSM6DS3_ACC_GYRO_TAP_THS_6D, 0x85);// Set tap threshold 8C

  myIMU.writeRegister(LSM6DS3_ACC_GYRO_INT_DUR2, 0x7F);// Set Duration, Quiet and Shock time windows 7F

  myIMU.writeRegister(LSM6DS3_ACC_GYRO_WAKE_UP_THS, 0x80);// Single & double-tap enabled (SINGLE_DOUBLE_TAP = 1)

  myIMU.writeRegister(LSM6DS3_ACC_GYRO_MD1_CFG, 0x08);// Double-tap interrupt driven to INT1 pin

}

void int1ISR()

{

  interruptCount++;

 ;

 

}

// -------------------- Utilities ------------------------- //

void setLedRGB(bool red, bool green, bool blue) {

  if (!blue) { digitalWrite(LEDB, HIGH); } else { digitalWrite(LEDB, LOW); }

  if (!green) { digitalWrite(LEDG, HIGH); } else { digitalWrite(LEDG, LOW); }

  if (!red) { digitalWrite(LEDR, HIGH); } else { digitalWrite(LEDR, LOW); }

}

This code working i tested with pin2. Is it posible to detect usb power?