Перевод платы на базе samd в спящий режим

Я использую плату на базе SAMD21G18A - arduino zero, для носимого проекта с батарейным питанием (типа компьютерной мыши). Я пытаюсь понять, как перевести устройство в спящий режим, когда оно не перемещалось в течение некоторого времени. Я использую данные с подключенного гироскопа, которые хранятся в массиве. Если сумма данных в массиве меньше некоторого порога, то я перевожу устройство в спящий режим, используя функцию sleep из библиотеки arduino с низким энергопотреблением. Я пробуждаю устройство с помощью прерывания от датчика.

void nomotion_sleep(float x_value) {
  static float sleep_threshold = 15;
  static float sleep_array[15];
  static byte sa_size = 15;
  static float asum; // сумма массива
  static byte i = 0;
  static uint32_t array_timer;

  if (timer1(array_timer, 60000)) { // таймер f, проверяет каждую минуту
    sleep_array[i] = abs(x_value); // x_value - от гироскопа
    asum += sleep_array[i];
    i += 1;
    if (i == sa_size - 1) {
      if (asum < sleep_threshold) {
        //спать
        LowPower.sleep();
      }
      for (byte ii = 0; ii < sa_size; ii += 1) {
        sleep_array[i] = 0;
      }
      asum = 0;
      i = 0;
    }
  }
}

Проблема в том, что если устройство переходит в спящий режим, то значение суммы массива не равно = 0 для следующей итерации. Не знаю, как это исправить. Должен ли я сделать ее изменчивой глобальной переменной и изменить при пробуждении в ISR?

Есть ли лучший способ сделать это? Спасибо вам за попытку помочь.

, 👍1

Обсуждение

sleep_array[] не имеет смысла: просто выполните asum += fabs(x_value); (думаю, вы имеете в виду fabs, а не abs)., @Edgar Bonet

Спасибо, Эдгар. Я пропустил оба эти пункта!, @Zhelyazko Grudov

Спасибо, что нашли время, чтобы помочь, я очень ценю это. Это решило мою проблему :), @Zhelyazko Grudov