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;
}