Timed sleep with wlinterrupt

Sure, since I’m asking about either ArduinoLowPower or NRF I guess it could be two things.

If we’re talking about ArduinoLowPower, I’d be using the MG24 and the code I’ve tried that does not interrupt and wake up the sleep in the middle if it’s 10 second sleep would look like this:

#include <Arduino.h>
#include <ArduinoLowPower.h>

#define PIN_WAKEUP D3 // I tried D0, D1, D2, D3, D7, D8, D9, & D10

void setup() {
  Serial.begin(115200);
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, LED_BUILTIN_INACTIVE);
  Serial.println("Sleep with timed wakeup");
}

void loop() {
  digitalWrite(LED_BUILTIN, LED_BUILTIN_ACTIVE);
  delay(5000);
  digitalWrite(LED_BUILTIN, LED_BUILTIN_INACTIVE);
  delay(500);

  Serial.printf("Going to sleep at %lu\n", millis());
  LowPower.attachInterruptWakeup(PIN_WAKEUP, nullptr, RISING);
  LowPower.sleep(10000);
}

If we’re talking about the NRF methods, I’d be using the nRF52840. That one I’ve seen the interrupt work well, but not with a timed sleep. Maybe the question is can you even do a timed sleep with the nRF52840:

#include <Adafruit_SPIFlash.h>

Adafruit_FlashTransport_QSPI flashTransport;

#define SLEEP_TIMEOUT 5000
#define PIN_WAKEUP (28)

unsigned long startTimeoutTime = 0;

void QSPIF_sleep(void) {
  flashTransport.begin();
  flashTransport.runCommand(0xB9);
  flashTransport.end();
}

void setupWakeUpInterrupt() {  
  myIMU.settings.gyroEnabled = 0;
  myIMU.settings.tempEnabled = 0;
  myIMU.settings.accelEnabled = 0;
  myIMU.begin();

  myIMU.writeRegister(LSM6DS3_ACC_GYRO_WAKE_UP_DUR, 0x00); // No duration
  myIMU.writeRegister(LSM6DS3_ACC_GYRO_WAKE_UP_THS, 0x02); // Set wake-up threshold
  myIMU.writeRegister(LSM6DS3_ACC_GYRO_TAP_CFG1, 0x80);    // Enable interrupts and apply slope filter; latch mode disabled
  myIMU.writeRegister(LSM6DS3_ACC_GYRO_CTRL1_XL, 0x70);    // Turn on the accelerometer
                                                           // ODR_XL = 833 Hz, FS_XL = ±2 g
  delay(4);                                                // Delay time per application note
  myIMU.writeRegister(LSM6DS3_ACC_GYRO_CTRL1_XL, 0xB0);    // ODR_XL = 1.6 Hz
  myIMU.writeRegister(LSM6DS3_ACC_GYRO_CTRL6_G, 0x10);     // High-performance operating mode disabled for accelerometer
  myIMU.writeRegister(LSM6DS3_ACC_GYRO_MD1_CFG, 0x20);     // Wake-up interrupt driven to INT1 pin

	pinMode(PIN_LSM6DS3TR_C_INT1, INPUT_PULLDOWN_SENSE);

  return;
}

void setup() {
  pinMode(LED_RED, OUTPUT);
  pinMode(LED_GREEN, OUTPUT);
  
  digitalWrite(LED_RED, HIGH);
  digitalWrite(LED_GREEN, HIGH);

  QSPIF_sleep();

  digitalWrite(LED_GREEN, LOW);
  delay(1000);
  digitalWrite(LED_GREEN, HIGH);

  NRF_POWER->DCDCEN = 1;
}

void loop() {
  if (startTimeoutTime == 0) startTimeoutTime = millis();

  if (startTimeoutTime > 0 && ((millis() - startTimeoutTime) > SLEEP_TIMEOUT)) {
    startTimeoutTime = 0;
    enterStandbySleep();
  }
}

void enterStandbySleep() {
  digitalWrite(LED_RED, LOW);
  delay(1000);
  digitalWrite(LED_RED, HIGH);

  pinMode(button1Pin, INPUT_SENSE_HIGH);
  setupWakeUpInterrupt();
  NRF_POWER->SYSTEMOFF = 1;
}