Использовать 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? Если да, то есть ли способ, как поддерживать эти «службы» в рабочем состоянии? Или, может быть, есть другая библиотека, которая также экономит энергию похожим образом, но в которой у вас больше возможностей настроить то, что вы хотите отключить?
@Cowboy_Patrick, 👍0
1 ответ
Лучший ответ:
Да, активация режима пониженного энергопотребления отключает 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
.
- Как перевести ATtiny/ATmega в режим глубокого сна (чтобы годами работать от батарей), но при этом обнаруживать нажатие кнопки?
- Вывод ESP8266 из deepSleep с помощью кнопки
- Как перевести RFID-модуль MFRC522 в спящий режим?
- Легкий сон ESP8266 — не могу проснуться
- Как отслеживать миллисекунды в спящем режиме
- Очищается ли SRAM при переводе Arduino в режим sleep_mode_pwr_down?
- Пронуться после отключения питания чтобы проверить датчик а затем снова заснуть
- Как разделить один источник питания между arduino и сервоприводами?
К сожалению, это не сработало. При просмотре диспетчера устройств Windows не отображается ни одного COM-порта. Просто при сбросе Arduino он на короткое время появляется, но затем — в обеих версиях кода — отключается. Затем Windows уже блокирует мой запрос на доступ к COMx, отвечая, что такого порта нет., @Cowboy_Patrick
А, я вижу, что вы отметили его как использующий Micro. Это имеет большое значение. Это USB, а не UART. И да, USB будет убит. Вам нужно будет использовать UART, а не USB., @Majenko
А можно ли как-то использовать UART на микроконтроллере?, @Cowboy_Patrick
Да. Я говорю как в приложении к своему ответу., @Majenko
Или просто оставайтесь в режиме ожидания вместо перехода в режим Power-down. Экономия будет меньше, но USB останется включенным., @Ignacio Vazquez-Abrams