Использовать lowpower-library и продолжать использовать последовательное соединение и другие вещи

Мне удалось заставить работать библиотеку LowPower на моем Arduino Micro. Этот код работает отлично:

#include <LowPower.h>

void setup() {
  // инициализируем цифровой вывод LED_BUILTIN как выход.
  pinMode(LED_BUILTIN, OUTPUT);
}

// функция цикла выполняется снова и снова вечно
void loop() {
  digitalWrite(LED_BUILTIN, HIGH);   // включаем светодиод (HIGH — уровень напряжения)
  LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);                      // ждем секунду
  digitalWrite(LED_BUILTIN, LOW);    // выключаем светодиод, понизив напряжение
  LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);                  // ждем секунду
}

Однако. Я также пробовал использовать его с последовательным соединением, чтобы периодически выводить текст. Но я думаю, что lowpower-libary отключает эту функцию — в целях экономии энергии. Так что теперь я беспокоюсь, что она также отключает некоторые другие вещи, которые мне, возможно, придется использовать, но они не будут работать. Например, OneWire или I2C. Также было бы неплохо работать с работающим режимом ожидания во время разработки, где последовательный вывод жизненно важен, хотя это и не обязательно, потому что я могу смоделировать его с помощью простой задержки. Поэтому мой вопрос: как я могу использовать lowpower-libary И иметь последовательное соединение. И повлияет ли эта библиотека на OneWire или I2C? Если да, то есть ли способ, как поддерживать эти «службы» в рабочем состоянии? Или, может быть, есть другая библиотека, которая также экономит энергию похожим образом, но в которой у вас больше возможностей настроить то, что вы хотите отключить?

, 👍0


1 ответ


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

4

Да, активация режима пониженного энергопотребления отключает UART, но только когда он находится в спящем режиме.

Чтобы использовать последовательный порт, вам просто нужно убедиться, что вы используете его только тогда, когда он не находится в спящем режиме, а из-за прерываний и буферизации последовательного драйвера это не так просто, как просто печать.

Однако это легко сделать: просто сбросьте последовательный порт перед сном. Это гарантирует, что любые ожидающие последовательные данные будут отправлены через последовательный порт до того, как вы перейдете в режим сна:

void loop() {
  Serial.println("Turning LED on");
  digitalWrite(LED_BUILTIN, HIGH);   // включаем светодиод (HIGH — уровень напряжения)
  Serial.flush();
  LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);                      // ждем секунду
  Serial.println("Turning LED off");
  digitalWrite(LED_BUILTIN, LOW);    // выключаем светодиод, понизив напряжение
  Serial.flush();
  LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);                  // ждем секунду
}

Если это не поможет, вам, возможно, придется выключить и включить последовательный порт самостоятельно с любой стороны отключения питания:

void loop() {
  Serial.begin(115200);
  Serial.println("Turning LED on");
  digitalWrite(LED_BUILTIN, HIGH);   // включаем светодиод (HIGH — уровень напряжения)
  Serial.flush();
  Serial.end();
  LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);                      // ждем секунду
  Serial.begin(115200);
  Serial.println("Turning LED off");
  digitalWrite(LED_BUILTIN, LOW);    // выключаем светодиод, понизив напряжение
  Serial.flush();
  Serial.end();
  LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);                  // ждем секунду
}

Обновление:

Я только что заметил, что вы используете Micro. Это имеет большое значение. Объект Serial Micro и Leonardo на самом деле является эмуляцией последовательного порта USB CDC/ACM, а не UART. Вы не можете поддерживать соединение USB во время сна. Поэтому оно будет разорвано.

Чтобы использовать связь во время сна, вам придется переключиться на правильное соединение UART с адаптером USB-TTL UART (например, FT232RL) для подключения к контактам TX/RX и использовать вместо этого Serial1.

,

К сожалению, это не сработало. При просмотре диспетчера устройств Windows не отображается ни одного COM-порта. Просто при сбросе Arduino он на короткое время появляется, но затем — в обеих версиях кода — отключается. Затем Windows уже блокирует мой запрос на доступ к COMx, отвечая, что такого порта нет., @Cowboy_Patrick

А, я вижу, что вы отметили его как использующий Micro. Это имеет большое значение. Это USB, а не UART. И да, USB будет убит. Вам нужно будет использовать UART, а не USB., @Majenko

А можно ли как-то использовать UART на микроконтроллере?, @Cowboy_Patrick

Да. Я говорю как в приложении к своему ответу., @Majenko

Или просто оставайтесь в режиме ожидания вместо перехода в режим Power-down. Экономия будет меньше, но USB останется включенным., @Ignacio Vazquez-Abrams