Перевод платы на базе 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?
Есть ли лучший способ сделать это? Спасибо вам за попытку помочь.
0
- Достижение низкой мощности с Seeeduino Cortex-M0+ работает от батареи 12V
- Как сгенерировать аппаратное прерывание в mpu6050 для пробуждения Arduino из режима SLEEP_MODE_PWR_DOWN?
- Как перевести ATtiny/ATmega в режим глубокого сна (чтобы годами работать от батарей), но при этом обнаруживать нажатие кнопки?
- Вывод ESP8266 из deepSleep с помощью кнопки
- Как назначить прерывание на нажатие кнопки с помощью ATtiny? (прерывание не срабатывает с моим кодом)
- Как перевести RFID-модуль MFRC522 в спящий режим?
- Легкий сон ESP8266 — не могу проснуться
- Как отслеживать миллисекунды в спящем режиме
sleep_array[]
не имеет смысла: просто выполнитеasum += fabs(x_value);
(думаю, вы имеете в видуfabs
, а неabs
)., @Edgar BonetСпасибо, Эдгар. Я пропустил оба эти пункта!, @Zhelyazko Grudov
Спасибо, что нашли время, чтобы помочь, я очень ценю это. Это решило мою проблему :), @Zhelyazko Grudov