Режим энергосбережения

BSHON
Offline
Зарегистрирован: 05.06.2015

Добрый день.

Подскажите, кто разобрался, как заставить arduino снимать показания датчика (например температуру) раз в полчаса и остальное время экономить энергию.

Прерывания watchdog (макс 8 сек) - короткие по времени. Да и как-то не красиво ....

A как "заснуть" и проснуться по таймеру не понимаю.

На UNO работает не корректно

[code]
#include <TimerOne.h>
 
// This example uses the timer interrupt to blink an LED
// and also demonstrates how to share a variable between
// the interrupt and the main program.
 
 
const int led = LED_BUILTIN;  // the pin with a LED
 
#include <avr/sleep.h>
#include <avr/power.h>
 
 
 
void setup(void)
{
  pinMode(led, OUTPUT);
  Timer1.initialize( 10 * 1000 );
  Timer1.attachInterrupt(blinkLED); // blinkLED to run every 0.15 seconds
  Serial.begin(9600);
  Serial.print("blinkCount = SETUP ");
}
 
 
// The interrupt will blink the LED, and keep
// track of how many times it has blinked.
int ledState = LOW;
volatile unsigned long blinkCount = 0; // use volatile for shared variables
 
void blinkLED(void)
{
  sleep_disable(); //Запрещаем спящий режим
 
  if (ledState == LOW) {
    ledState = HIGH;
    blinkCount = blinkCount + 1;  // increase when LED turns on
  } else {
    ledState = LOW;
  }
  digitalWrite(led, ledState);
 
 
}
 
 
// The main program will print the blink count
// to the Arduino Serial Monitor
void loop(void)
{
  unsigned long blinkCopy;  // holds a copy of the blinkCount
 
  sleep_disable(); //Запрещаем спящий режим
 
  // to read a variable which the interrupt code writes, we
  // must temporarily disable interrupts, to be sure it will
  // not change while we are reading.  To minimize the time
  // with interrupts off, just quickly make a copy, and then
  // use the copy while allowing the interrupt to keep working.
//  noInterrupts();
  blinkCopy = blinkCount;
//  interrupts();
 
  Serial.print("blinkCount = ");
  Serial.println(blinkCopy);
  delay(100);
 
  set_sleep_mode(SLEEP_MODE_PWR_SAVE); //Определяем режим сна
  sleep_enable(); //Разрешаем спящий режим
  sleep_mode(); //Спим (Прерывания продолжают работать.) Программа останавливается.
 
 
}
 
[/code]

 

Результат 

blinkCount = SETUP blinkCount = 0
 
Те засыпает и не просыпается  через 10 сек ....

 

SunX
SunX аватар
Offline
Зарегистрирован: 04.10.2014

Вот эта картинка:

Все Вам объяснит - при SLEEP_MODE_PWR_SAVE можно разбудиться от второго таймера, вачдога, внешних прерываний и других не интересных нам вещей. У Вас, как я вижу, используется не второй таймер.

А вообще сон с вачдогом - вполне нормально работает - 8 секунд поспал, глянул, что надо еще спать - опять пошел спать. Зато можно в более экономный SLEEP_MODE_PWR_DOWN уходить спать.

SunX
SunX аватар
Offline
Зарегистрирован: 04.10.2014

Еще вариант - просыпаться от внешних прерываний на 2й или 3й пин, их можно генерировать, например при помощи RTC (DS3231, например), так и NE555 таймером, первое точнее и гибче, второе доступнее (NE555, несколько резисторов и пару конденсаторов легче достать, мне кажется), можно еще придумать вариантов, наверное.

ЗЫ: Если Вы озаботились энергопотреблением, то советую Вам посмтореть на Arduino Pro Mini, так как в остальных один только USB-2-COM жрет столько, что остальная ардуина на его фоне теряется в плане энергопотребления.

maksim
Offline
Зарегистрирован: 12.02.2012

Для начала сюда.

BSHON пишет:

Прерывания watchdog (макс 8 сек) - короткие по времени. Да и как-то не красиво ....

Да вы прям эстет. А вы думаете таймер, на котором вы пытетесь это сделать тикает реже? TIMER1 при частоте кварца 16МГц может тикать с минимальной частотой около 20 Гц. То есть 20 раз в секунду по сравнению с 1 разом в 8 секунд.

BSHON пишет:

A как "заснуть" и проснуться по таймеру не понимаю.

Никак, потому как таймер1 тактируется тем же источником, который останавливается в спячке.

zalias7
Offline
Зарегистрирован: 18.03.2015

По теме спячки :)

мега2560 уходим в сон (SLEEP_MODE_PWR_DOWN) , вся схема потребляет 1.7мА (не это главное) , просыпаемся включаем прибор пином HIGH , делаем работу , отключаем пин LOW . Вроде всё отлично, но потребление 3мА, на пине ~0.01 вольт.  Почему не отключается до конца ? :)

a5021
Offline
Зарегистрирован: 07.07.2013

Потому, что все прозвучавшие здесь рецепты и способы -- бред собачий. Есть же весьма подробный разбор режимов энергосбережения от австралийца Nick Gammon, так нет, внешний генератор на NE555 колхозить будет. Нагрузки на ноги вешать. Никто не против. Колхозьте и вешайте. Только про микропотребление постарайтесь больше не думать, чтобы потом не расстраиваться.

Delphin
Offline
Зарегистрирован: 17.05.2019

Добрый день всем!  Подскажите пожалуйста: А какая точность вообще при пробуждении от Watch Dog Timer ? 

У меня 40 устройств, должны просыпаться в заданное время и отсылать по радиоканалу информацию, если их усыпить в одно время, к примеру по широковещательному пакету, просыпаются они все как им захочется, все в разное время. Я устанавливаю что бы просыпались от Watch Dog Timer, Сон самый глубокий - SLEEP_MODE_PWR_DOWN, точность времени просыпания при таких параметрах и на большом времени уплывает в небытие.. Подскажите пожалуйста как можно добиться максимальной точности для пробуждений от таймеров к примеру раз в час, и при минимальном потреблении ?

andycat
andycat аватар
Онлайн
Зарегистрирован: 07.09.2017

Так себе точность, вам конкретно какая нужна? +-минута или час?

Delphin
Offline
Зарегистрирован: 17.05.2019

При пробуждении раз в час, но просыпаться они должны с разборсом хотябы не больше чем 10 секунд.

У меня идея была такая: ложить все устройства спать широковещательным пакетом, после получения данного пакета каждое устройство должно отсчитать задержку 10 секунд умноженный на адрес (адреса от 1 до 40) Соответственно они должны просыпаться с 1 по 40, с периодичностью 10 секунд. Но они по факту просыпаються не в свою очередь, на маленьких промежутках времени это еще работает а если увеличивать счетчики они все уплывают по времени, и получается кто в лес кто по дрова.. 

sadman41
Offline
Зарегистрирован: 19.10.2016

Delphin пишет:

У меня 40 устройств, 

Каких устройств, на базе чего - чугунного утюга?

Delphin
Offline
Зарегистрирован: 17.05.2019
sadman41
Offline
Зарегистрирован: 19.10.2016

Я там вижу не кварц, а резонатор (так вроде называется). Вроде как они от температуры плавают.

Выход один, думаю - просыпаться чаще, синхронизироваться.

b707
Онлайн
Зарегистрирован: 26.05.2017

Delphin пишет:

При пробуждении раз в час, но просыпаться они должны с разборсом хотябы не больше чем 10 секунд.

без дополнительного и очень серьезного гемороя - абсолютно нераеально. Если при таких вводных 40 устройств дадут разброс хотя бы в 5 минут - считайте. что повезло.

Delphin
Offline
Зарегистрирован: 17.05.2019

Синхронизация устройств требует больше памяти в конечных устройствах и центральном устройстве, а с моим кодом пока её не особо хватает.. А дополнительные обвязки внешними часами требуют скорее разработки отдельного устройства с "встроенными" часами на борту. Наверное буду использовать внешние часы, но позже, когда дело дойдет до разработки своего устройства. А сейчас хочу выжать максимальную точность для встроенных таймеров при самом низком потреблении.  Для WDT используется внутренний генератор 128 кГц. А если использовать режим "SLEEP_MODE_PWR_SAVE" + Таймер 2, то я так понимаю будет использоваться геренатор (резанатор) внешний, может так будет точнее?

b707
Онлайн
Зарегистрирован: 26.05.2017

Delphin пишет:

А если использовать режим "SLEEP_MODE_PWR_SAVE" + Таймер 2, то я так понимаю будет использоваться геренатор (резанатор) внешний, может так будет точнее?

будет безусловно точнее, но 10 сек в час. имхо, все равно фантастика

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

sadman41 пишет:

Я там вижу не кварц, а резонатор (так вроде называется). Вроде как они от температуры плавают.

Кварц это тоже резонатор, он так и называется - кварцевый резонатор. А по ссылке выше керамический резонатор. Да, керамический резонатор хуже кварцевого резонатора.

Green
Offline
Зарегистрирован: 01.10.2015

Тактирование от intrc, часовой кварц вместо. Но power save, что очень много. Либо менять идею.

Green
Offline
Зарегистрирован: 01.10.2015

b707 пишет:

будет безусловно точнее, но 10 сек в час. имхо, все равно фантастика

С таймером2 можно даже лучше 10 сек/сутки.)

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

если такие требования к одновременности, то можно режим сна сделать послабже и тянуть к каждому контроллеру отдельную линию IRQ, тогда они все по прерыванию проснуцца одновременно.  Буферы только не забыть, усиливающие. 

Delphin
Offline
Зарегистрирован: 17.05.2019

Green пишет:

Тактирование от intrc, часовой кварц вместо. Но power save, что очень много. Либо менять идею.

А можно поподробней разжевать?. А то чего то я не понял. В режиме "Power save" используется INTRC ? Что очень много, всмысле точности или чего? 

Delphin
Offline
Зарегистрирован: 17.05.2019

DetSimen пишет:

 и тянуть к каждому контроллеру отдельную линию IRQ, тогда они все по прерыванию проснуцца одновременно.  

Суть в том что устрйства работают на радиоканалах и батарейках. Если тянуть провода между устройствами тогда теряется вообще весь смысл.. 

Радиоканал может работать в постоянном приеме и реагировать на команды, но он кушает в этом режиме около 12мА, чего для батарейного питания очень много. Вот мне и надо ложить в сон и процессор и радиоканал, а когда проснуться сказать центральному радиоканалу что они проснулись и ждут команды для работы, иначе опять засыпают. Если они будут просыпаться одновременно будет накладка по радиочастоте и друг друга будут перебивать. Поэтому и родилась идея их ложить в сон с задержкой по времени, чтобы они просыпались в разное время.  

Delphin
Offline
Зарегистрирован: 17.05.2019

Green пишет:

b707 пишет:

будет безусловно точнее, но 10 сек в час. имхо, все равно фантастика

С таймером2 можно даже лучше 10 сек/сутки.)

Интересно, можно подробней, проводили какие то тесты? В сон ложили в это время? 

Green
Offline
Зарегистрирован: 01.10.2015

Я уже не помню точно. Что то в районе 25 мка от 3 вольт. В общем, на порядок больше чем в дауне.

sadman41
Offline
Зарегистрирован: 19.10.2016

Jeka_M пишет:

sadman41 пишет:

Я там вижу не кварц, а резонатор (так вроде называется). Вроде как они от температуры плавают.

Кварц это тоже резонатор, он так и называется - кварцевый резонатор. А по ссылке выше керамический резонатор. Да, керамический резонатор хуже кварцевого резонатора.

Да, постоянно  из головы вылетает научное название этого пятилапого. Там же внутри ещё два конденсатора стоят вроде?

Green
Offline
Зарегистрирован: 01.10.2015

Это керамический резонатор. От кварцевого отличается меньшей добротностью и худшей стабильностью.
Ой, Jeka_M уже объяснил.)

SLKH
Offline
Зарегистрирован: 17.08.2015

DS3231 - не?

Delphin
Offline
Зарегистрирован: 17.05.2019

SLKH пишет:

DS3231 - не?

Интересный вариант. Дело в том что у меня уже 40 устройств собрано, в коробочке, с батарейками, и этот модуль туда просто не влезет.. 

Оставлю на заметку когда будем свою плату разрабатывать.. )

Green
Offline
Зарегистрирован: 01.10.2015

Глупости всё это. Повторяю, идею менять надо.

Delphin
Offline
Зарегистрирован: 17.05.2019

Green пишет:

Глупости всё это. Повторяю, идею менять надо.

Слишком загрузился этой проблемой, что пока свежих идей нет..

И как еще можно по другому сохранить энергию в батарейках при этом не потеряв функционала? 

Green
Offline
Зарегистрирован: 01.10.2015

Сервер (база, ведущий, мастер...) должен быть всегда на приёме, а клиенты (ведомые, датчики) должны изредка просыпаться и быстренько передавать данные.

sadman41
Offline
Зарегистрирован: 19.10.2016

Чую, что тут пахнет новомодным увлечением mesh+lora.

Delphin
Offline
Зарегистрирован: 17.05.2019

Green пишет:

Сервер (база, ведущий, мастер...) должен быть всегда на приёме, а клиенты (ведомые, датчики) должны изредка просыпаться и быстренько передавать данные.

Это так, если ведомым устройствам не нужно многовенно выполнять каких либо действий по команде сервера.  

Delphin
Offline
Зарегистрирован: 17.05.2019

sadman41 пишет:

Чую, что тут пахнет новомодным увлечением mesh+lora.

До сети - mesh пока не доросли, возможно в будущем)

На данном этапе сеть типа "Звезда".

Green
Offline
Зарегистрирован: 01.10.2015

Delphin пишет:

Это так, если ведомым устройствам не нужно многовенно выполнять каких либо действий по команде сервера.  

Температуру значит раз в пол часа, а команды мгновенно?

Delphin
Offline
Зарегистрирован: 17.05.2019

Green пишет:

Delphin пишет:

Это так, если ведомым устройствам не нужно многовенно выполнять каких либо действий по команде сервера.  

Температуру значит раз в пол часа, а команды мгновенно?

У меня ведомые радио - устройства пока температуру не меряют, возможно в будущем..

Они пока только как исполнительные устройства, щелкают Latch клапанами для полива в поле. И если нужно включить полив, он должен сразу включиться, а не через пол часа.. )  

Green
Offline
Зарегистрирован: 01.10.2015

Ну так а насколько может убежать wdt за пол часа... Проснулся, связался, получил команду и свободен.

Delphin
Offline
Зарегистрирован: 17.05.2019

Green пишет:

Ну так а насколько может убежать wdt за пол часа... Проснулся, связался, получил команду и свободен.

Все хорошо когда одно устройство просыпается, а если их 40 шт. 

Таймер wdt очень сильно плавает, на одном устройстве за час убежал + 2 минуты, на другом -2 минуты, и не предсказуемо.. Я ложу спать устройства со смещением 8 секунд, но просыпаются они не по очереди, а как им захочется..  Вопрос на сколько максимум может уйти от реального времени wdt таймер пока мне не понятен.. 

И когда одновременно проснуться несколько устройств, начнут отправку данных шлюз их приймет как мусор и откинет по ошибке CRC, так как они будут смешаны в радио..