Официальный сайт компании Arduino по адресу arduino.cc
Режим энергосбережения
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Чт, 11/06/2015 - 23:05
Добрый день.
Подскажите, кто разобрался, как заставить 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 сек ....
Вот эта картинка:
Все Вам объяснит - при SLEEP_MODE_PWR_SAVE можно разбудиться от второго таймера, вачдога, внешних прерываний и других не интересных нам вещей. У Вас, как я вижу, используется не второй таймер.
А вообще сон с вачдогом - вполне нормально работает - 8 секунд поспал, глянул, что надо еще спать - опять пошел спать. Зато можно в более экономный SLEEP_MODE_PWR_DOWN уходить спать.
Еще вариант - просыпаться от внешних прерываний на 2й или 3й пин, их можно генерировать, например при помощи RTC (DS3231, например), так и NE555 таймером, первое точнее и гибче, второе доступнее (NE555, несколько резисторов и пару конденсаторов легче достать, мне кажется), можно еще придумать вариантов, наверное.
ЗЫ: Если Вы озаботились энергопотреблением, то советую Вам посмтореть на Arduino Pro Mini, так как в остальных один только USB-2-COM жрет столько, что остальная ардуина на его фоне теряется в плане энергопотребления.
Для начала сюда.
Прерывания watchdog (макс 8 сек) - короткие по времени. Да и как-то не красиво ....
A как "заснуть" и проснуться по таймеру не понимаю.
По теме спячки :)
мега2560 уходим в сон (SLEEP_MODE_PWR_DOWN) , вся схема потребляет 1.7мА (не это главное) , просыпаемся включаем прибор пином HIGH , делаем работу , отключаем пин LOW . Вроде всё отлично, но потребление 3мА, на пине ~0.01 вольт. Почему не отключается до конца ? :)
Потому, что все прозвучавшие здесь рецепты и способы -- бред собачий. Есть же весьма подробный разбор режимов энергосбережения от австралийца Nick Gammon, так нет, внешний генератор на NE555 колхозить будет. Нагрузки на ноги вешать. Никто не против. Колхозьте и вешайте. Только про микропотребление постарайтесь больше не думать, чтобы потом не расстраиваться.
Добрый день всем! Подскажите пожалуйста: А какая точность вообще при пробуждении от Watch Dog Timer ?
У меня 40 устройств, должны просыпаться в заданное время и отсылать по радиоканалу информацию, если их усыпить в одно время, к примеру по широковещательному пакету, просыпаются они все как им захочется, все в разное время. Я устанавливаю что бы просыпались от Watch Dog Timer, Сон самый глубокий - SLEEP_MODE_PWR_DOWN, точность времени просыпания при таких параметрах и на большом времени уплывает в небытие.. Подскажите пожалуйста как можно добиться максимальной точности для пробуждений от таймеров к примеру раз в час, и при минимальном потреблении ?
Так себе точность, вам конкретно какая нужна? +-минута или час?
При пробуждении раз в час, но просыпаться они должны с разборсом хотябы не больше чем 10 секунд.
У меня идея была такая: ложить все устройства спать широковещательным пакетом, после получения данного пакета каждое устройство должно отсчитать задержку 10 секунд умноженный на адрес (адреса от 1 до 40) Соответственно они должны просыпаться с 1 по 40, с периодичностью 10 секунд. Но они по факту просыпаються не в свою очередь, на маленьких промежутках времени это еще работает а если увеличивать счетчики они все уплывают по времени, и получается кто в лес кто по дрова..
У меня 40 устройств,
Каких устройств, на базе чего - чугунного утюга?
https://www.electrodragon.com/product/atmega328p-arduino-plus-lora-sx1278-board-loraduino/
на базе Atmega328p
Я там вижу не кварц, а резонатор (так вроде называется). Вроде как они от температуры плавают.
Выход один, думаю - просыпаться чаще, синхронизироваться.
При пробуждении раз в час, но просыпаться они должны с разборсом хотябы не больше чем 10 секунд.
без дополнительного и очень серьезного гемороя - абсолютно нераеально. Если при таких вводных 40 устройств дадут разброс хотя бы в 5 минут - считайте. что повезло.
Синхронизация устройств требует больше памяти в конечных устройствах и центральном устройстве, а с моим кодом пока её не особо хватает.. А дополнительные обвязки внешними часами требуют скорее разработки отдельного устройства с "встроенными" часами на борту. Наверное буду использовать внешние часы, но позже, когда дело дойдет до разработки своего устройства. А сейчас хочу выжать максимальную точность для встроенных таймеров при самом низком потреблении. Для WDT используется внутренний генератор 128 кГц. А если использовать режим "SLEEP_MODE_PWR_SAVE" + Таймер 2, то я так понимаю будет использоваться геренатор (резанатор) внешний, может так будет точнее?
А если использовать режим "SLEEP_MODE_PWR_SAVE" + Таймер 2, то я так понимаю будет использоваться геренатор (резанатор) внешний, может так будет точнее?
будет безусловно точнее, но 10 сек в час. имхо, все равно фантастика
Я там вижу не кварц, а резонатор (так вроде называется). Вроде как они от температуры плавают.
Кварц это тоже резонатор, он так и называется - кварцевый резонатор. А по ссылке выше керамический резонатор. Да, керамический резонатор хуже кварцевого резонатора.
Тактирование от intrc, часовой кварц вместо. Но power save, что очень много. Либо менять идею.
будет безусловно точнее, но 10 сек в час. имхо, все равно фантастика
С таймером2 можно даже лучше 10 сек/сутки.)
если такие требования к одновременности, то можно режим сна сделать послабже и тянуть к каждому контроллеру отдельную линию IRQ, тогда они все по прерыванию проснуцца одновременно. Буферы только не забыть, усиливающие.
Тактирование от intrc, часовой кварц вместо. Но power save, что очень много. Либо менять идею.
А можно поподробней разжевать?. А то чего то я не понял. В режиме "Power save" используется INTRC ? Что очень много, всмысле точности или чего?
и тянуть к каждому контроллеру отдельную линию IRQ, тогда они все по прерыванию проснуцца одновременно.
Суть в том что устрйства работают на радиоканалах и батарейках. Если тянуть провода между устройствами тогда теряется вообще весь смысл..
Радиоканал может работать в постоянном приеме и реагировать на команды, но он кушает в этом режиме около 12мА, чего для батарейного питания очень много. Вот мне и надо ложить в сон и процессор и радиоканал, а когда проснуться сказать центральному радиоканалу что они проснулись и ждут команды для работы, иначе опять засыпают. Если они будут просыпаться одновременно будет накладка по радиочастоте и друг друга будут перебивать. Поэтому и родилась идея их ложить в сон с задержкой по времени, чтобы они просыпались в разное время.
будет безусловно точнее, но 10 сек в час. имхо, все равно фантастика
С таймером2 можно даже лучше 10 сек/сутки.)
Интересно, можно подробней, проводили какие то тесты? В сон ложили в это время?
Я уже не помню точно. Что то в районе 25 мка от 3 вольт. В общем, на порядок больше чем в дауне.
Я там вижу не кварц, а резонатор (так вроде называется). Вроде как они от температуры плавают.
Кварц это тоже резонатор, он так и называется - кварцевый резонатор. А по ссылке выше керамический резонатор. Да, керамический резонатор хуже кварцевого резонатора.
Да, постоянно из головы вылетает научное название этого пятилапого. Там же внутри ещё два конденсатора стоят вроде?
Это керамический резонатор. От кварцевого отличается меньшей добротностью и худшей стабильностью.
Ой, Jeka_M уже объяснил.)
DS3231 - не?
DS3231 - не?
Интересный вариант. Дело в том что у меня уже 40 устройств собрано, в коробочке, с батарейками, и этот модуль туда просто не влезет..
Оставлю на заметку когда будем свою плату разрабатывать.. )
Глупости всё это. Повторяю, идею менять надо.
Глупости всё это. Повторяю, идею менять надо.
Слишком загрузился этой проблемой, что пока свежих идей нет..
И как еще можно по другому сохранить энергию в батарейках при этом не потеряв функционала?
Сервер (база, ведущий, мастер...) должен быть всегда на приёме, а клиенты (ведомые, датчики) должны изредка просыпаться и быстренько передавать данные.
Чую, что тут пахнет новомодным увлечением mesh+lora.
Сервер (база, ведущий, мастер...) должен быть всегда на приёме, а клиенты (ведомые, датчики) должны изредка просыпаться и быстренько передавать данные.
Это так, если ведомым устройствам не нужно многовенно выполнять каких либо действий по команде сервера.
Чую, что тут пахнет новомодным увлечением mesh+lora.
До сети - mesh пока не доросли, возможно в будущем)
На данном этапе сеть типа "Звезда".
Это так, если ведомым устройствам не нужно многовенно выполнять каких либо действий по команде сервера.
Температуру значит раз в пол часа, а команды мгновенно?
Это так, если ведомым устройствам не нужно многовенно выполнять каких либо действий по команде сервера.
Температуру значит раз в пол часа, а команды мгновенно?
У меня ведомые радио - устройства пока температуру не меряют, возможно в будущем..
Они пока только как исполнительные устройства, щелкают Latch клапанами для полива в поле. И если нужно включить полив, он должен сразу включиться, а не через пол часа.. )
Ну так а насколько может убежать wdt за пол часа... Проснулся, связался, получил команду и свободен.
Ну так а насколько может убежать wdt за пол часа... Проснулся, связался, получил команду и свободен.
Все хорошо когда одно устройство просыпается, а если их 40 шт.
Таймер wdt очень сильно плавает, на одном устройстве за час убежал + 2 минуты, на другом -2 минуты, и не предсказуемо.. Я ложу спать устройства со смещением 8 секунд, но просыпаются они не по очереди, а как им захочется.. Вопрос на сколько максимум может уйти от реального времени wdt таймер пока мне не понятен..
И когда одновременно проснуться несколько устройств, начнут отправку данных шлюз их приймет как мусор и откинет по ошибке CRC, так как они будут смешаны в радио..