ARDUINO Заснуть и проснутся. Метеостанция+LowPower.h

Billie

✩✩✩✩✩✩✩
2 Окт 2018
2
0
Доброго времени, никак не пойму как правильно доделать режим сна. Проснутся и заснуть должен от кнопки на третьем пине.
#include "LowPower.h"
#include <Wire.h> // Подключаем библиотеку Wire
#include <LiquidCrystal_I2C.h> // Подключаем библиотеку LiquidCrystal_I2C
#include <DallasTemperature.h> // Подключаем библиотеку DallasTempature
#define DS18B20 2 // Указываем, к какому выводу подключена DQ

byte simvol[8] = {B11100,B10100,B11100,B00000,B00000,B00000,B00000,B00000,}; // Символ градуса

LiquidCrystal_I2C lcd(0x27,16,2); // Задаем адрес и размер дисплея
OneWire oneWire(DS18B20);
DallasTemperature sensors(&oneWire);

// Используем пин 3 для пробуждения
const int wakeUpPin = 3;

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

void setup()
{
// Настраиваем наш пин на ввод и задействуем подтягивающий резистор
pinMode(wakeUpPin, INPUT_PULLUP);
sensors.begin(); // Запуск библиотеки, по умолчанию 9 бит, то есть кратность 0.5 градуса
lcd.init(); // Инициализация lcd
lcd.backlight(); // Включаем подсветку
lcd.setCursor(2,0); // Устанавливаем курсор на 1 строку, ячейка 2
lcd.print("TEMP"); // Выводим текст
lcd.setCursor(2,1); // Устанавливаем курсор на 2 строку, ячейка 2
lcd.print("www.rchip.ru"); // Выводим текст
}

void loop()
{

// Разрешаем внешние прерывание на пине 3 при низком уровне
attachInterrupt(0, wakeUp, LOW);

// Переводим Ардуино в режим power down с отключением модулей ADC и BOD
// Остальные модули в этом режиме уже отключены
LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF);
// При низком логическом уровне на пине 2 будет сгенерировано прерывание
// и после вызова обработчика wakeUp() выполнение данной функции продолжится

// Временно запретим прерывания, они пока не нужны
detachInterrupt(0);

lcd.createChar(1, simvol); // Создаем символ под номером 1
sensors.requestTemperatures(); // Считываем показания температуры
lcd.setCursor(7,0); // Устанавливаем курсор на 1 строку, ячейка 7
lcd.print(sensors.getTempCByIndex(0)); // Выводим показания температуры
lcd.setCursor(12,0); // Устанавливаем курсор на 1 строку, ячейка 12
lcd.print("\1"); // Выводим символ градуса
lcd.setCursor(13,0); // Устанавливаем курсор на 1 строку, ячейка 13
lcd.print("C"); // Выводим текст
delay(5000); // Пауза в течение 5 секунд.
}
 

AlexGyver

★★★★★★✩
Команда форума
30 Июл 2018
359
573
Проснуться из режима POWER_DOWN можно только по прерыванию, то есть кнопку надо вешать на пин 2 или 3 (для нано/уно) и подключать прерывание как в уроках. В обработчике прерывания можно оставить пустую функцию, но я бы туда флагов напихал. Пример есть в примерах либы low power (От разработчика rocket scream)
 

Billie

✩✩✩✩✩✩✩
2 Окт 2018
2
0
Проснуться из режима POWER_DOWN можно только по прерыванию, то есть кнопку надо вешать на пин 2 или 3 (для нано/уно) и подключать прерывание как в уроках. В обработчике прерывания можно оставить пустую функцию, но я бы туда флагов напихал. Пример есть в примерах либы low power (От разработчика rocket scream)
А заведется? На 2 пине сидит термодатчик.
Хорошо, попробую)
 

kshestov

✩✩✩✩✩✩✩
25 Мар 2019
2
0
Здравствуйте. У меня аналогичный вопрос. Можно ли повесить прерывание на аналоговый порт? По моему есть функция, с которой можно мапить одни порты на другие
Корень проблемы в том, что у меня есть готовое устройство, которое в качестве входа использует данные с аналогового входа. Хочется усыплять контроллер до тех пор, пока на аналоговом входе не появится высокий уровень
 

Wan-Derer

★★★★★✩✩
Команда форума
31 Июл 2018
2,132
412
Москва
wan-derer.ru
@kshestov, Мапить на АВР нельзя. Но, как видим, на Мега328 на любой порт можно назначить внешнее прерывание (PCINT):

Снимок экрана 2019-03-25 в 14.32.26.png

Правда, в Ардуино ИДЕ доступны только 2 и 3 порты. Такие дела.
 

kshestov

✩✩✩✩✩✩✩
25 Мар 2019
2
0
@kshestov, Мапить на АВР нельзя. Но, как видим, на Мега328 на любой порт можно назначить внешнее прерывание (PCINT):

Посмотреть вложение 2910

Правда, в Ардуино ИДЕ доступны только 2 и 3 порты. Такие дела.
У меня Atmega32u4. Сигнал идет на PF5/ADC5
Или вариант будить по таймеру?
 

Wan-Derer

★★★★★✩✩
Команда форума
31 Июл 2018
2,132
412
Москва
wan-derer.ru
@kshestov, ADC продолжает работать в следующих режимах энергосбережения:
7.1 Idle Mode
When the SM2..0 bits are written to 000, the SLEEP instruction makes the MCU enter Idle mode, stopping the
CPU but allowing the USB, SPI, USART, Analog Comparator, ADC, 2-wire Serial Interface, Timer/Counters,
Watchdog, and the interrupt system to continue operating. This sleep mode basically halts clkCPU and clkFLASH,
while allowing the other clocks to run.
Idle mode enables the MCU to wake up from external triggered interrupts as well as internal ones like the Timer
Overflow and USART Transmit Complete interrupts. If wake-up from the Analog Comparator interrupt is not
required, the Analog Comparator can be powered down by setting the ACD bit in the Analog Comparator
Control and Status Register – ACSR. This will reduce power consumption in Idle mode. If the ADC is enabled, a
conversion starts automatically when this mode is entered.

7.2 ADC Noise Reduction Mode
When the SM2..0 bits are written to 001, the SLEEP instruction makes the MCU enter ADC Noise Reduction
mode, stopping the CPU but allowing the ADC, the external interrupts, 2-wire Serial Interface address match
and the Watchdog to continue operating (if enabled). This sleep mode basically halts clkI/O, clkCPU, and
clkFLASH, while allowing the other clocks to run (including clkUSB).
This improves the noise environment for the ADC, enabling higher resolution measurements. If the ADC is
enabled, a conversion starts automatically when this mode is entered. Apart form the ADC Conversion
Complete interrupt, only an External Reset, a Watchdog System Reset, a Watchdog interrupt, a Brown-out
Reset, a 2-wire serial interface interrupt, an SPM/EEPROM ready interrupt, an external level interrupt on INT6,
an external interrupt on INT3:0 or a pin change interrupt can wake up the MCU from ADC Noise Reduction
mode.
Можно, конечно нарулить вачдог и использовать:
7.3 Power-down Mode
When the SM2..0 bits are written to 010, the SLEEP instruction makes the MCU enter Power-down mode. In
this mode, the external Oscillator is stopped, while the external interrupts, the 2-wire Serial Interface, and the
Watchdog continue operating (if enabled). Only an External Reset, a Watchdog Reset......
Но это, по-моему, изврат какой-то. Лучше вывести PCINT.