Преобразование стандартной схемы настройки/цикла в приложение с низким энергопотреблением?

Предположим, у меня есть типичный скетч в стиле настройки/цикла, например, такой, который включает светодиод при нажатии кнопки.

Как мне изменить это так, чтобы оно переходило в режим низкого энергопотребления, просыпалось при нажатии кнопки и возвращалось в режим низкого энергопотребления после завершения работы логики?

void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(buttonPin, INPUT);
  // желательно: введите здесь режим пониженного энергопотребления
}
void loop() {
  int buttonState = digitalRead(buttonPin);
  // желательно: выход из режима низкого энергопотребления здесь
  if (buttonState == HIGH) {
    digitalWrite(ledPin, HIGH);
    delay(1000);
    digitalWrite(ledPin, LOW);
  }
  // желательно: вернуться в режим пониженного энергопотребления здесь
}

, 👍5

Обсуждение

Для какой платы Arduino?, @Jot

@Jot, я открыт для комментариев по любому из них. Если некоторые из них особенно хороши для маломощных приложений, мне было бы интересно услышать об этом., @Mark Harrison

Некоторые из них. Например, "голый скелет" atmega328p. Смотрите: https://www.gammon.com.au/power Некоторые платы Arduino MKR могут питаться от батареи Lipo. Процессор ARM M0+ плат MKR может переходить в спящий режим, но я не знаю, есть ли библиотека для этого, которая поддерживает все режимы. Я также не знаю, какие платы MKR используют очень мало тока для остальных компонентов платы., @Jot


1 ответ


Лучший ответ:

6

Этот скетч почти идентичен скетчу powerDownWakeExternalInterrupt.ino, который идет с библиотекой LowPower. Я использую INPUT_PULLUP и кнопку NO, чтобы запустить его для пробуждения и включения светодиода.

#include "LowPower.h"
const byte wakeUpPin = 2;

// Просто обработчик прерывания контакта.
void wakeUp(){}

void setup(){

  // Настройте вывод пробуждения как вход.
  // Это потребляет несколько мкА тока.
  pinMode(wakeUpPin, INPUT_PULLUP);
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, LOW);

}

void loop(){

  // Разрешить выводу пробуждения вызывать прерывание при низком уровне.
  attachInterrupt(0, wakeUp, LOW);

  // Вход в состояние выключения питания с отключенными модулями АЦП и BOD.
  // Просыпаться, когда на выводе пробуждения низкий уровень.
  LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF);

  // Отключить внешнее прерывание вывода на выводе пробуждения.
  detachInterrupt(0); 

  // Сделайте что-нибудь здесь.
  digitalWrite(LED_BUILTIN, HIGH);
  delay(2000);
  digitalWrite(LED_BUILTIN, LOW);

}
,