Ардуино - энергосбережение

Votmax
Offline
Зарегистрирован: 18.06.2016

Добрый день! Хочу сделать простой проект. Есть Ардуино нано, светодиод (штатный) и батарейка.

Хочу запустить проект на подобии Blink:

 

void setup() {
  pinMode(13, OUTPUT);
 }

void loop() {
  digitalWrite(13, HIGH);   
  delay(5000);              
  digitalWrite(13, LOW);    
  delay(5000);              
}

Но так, чтобы лампа моргала как можно дольше. (Что то вроде маячка). В идеале месяц от кроны или 6хАА.

Я нашел функции по отключению переферии и мой проект стал  выглядеть так:

 

 

#include <avr/power.h>

void setup() {

  pinMode(13, OUTPUT);
  power_adc_disable();
  power_spi_disable();
  power_timer1_disable();
  power_timer2_disable();
  power_twi_disable();
  power_usart0_disable(); 
}

void loop() {
  digitalWrite(13, HIGH);   
  delay(5000);              
  digitalWrite(13, LOW);    
  delay(5000);              
}

 

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

Еще думаю, что возможно интервал моргания увеличить до 10 секунд, а в это время вводить контроллер в сон. Но устройство должно работать автономно. Думаю, вожможно ли вводить ардуино в сон, а выводить его срабатыванию внутреннего таймера. Если кто сталкивался, очень сильно прошу вашей помощи!!!

Может быть есть пример? Буду признателен.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Votmax, тут энергосбережением не пахнет вообще. Ни от вашего скетча, ни от применения ардуино-нано, ни от кроны или 6"АА". Все эти три пункта вместе или по отдельности исключают энергосбережение в принципе. Вопрос как и что делать тут разжевывался много раз, гугл в помощь.

Votmax
Offline
Зарегистрирован: 18.06.2016

И не лень такое писать??? Не хотите не отвечайте. А такие ответы от "Гуру" как у вас к чему? Всегда удивляюсь, зачем тогда нужны специализированные форумы? Ведь форум и нужем, чтобы спрашивать... Ну давайте тогда о погоде поговорим? У нас +15, а у вас?

Может у кого то есть готовый пример или кто то с этим уже сталкивался?

В гугле я как раз и нашел как отключать периферию. Остальное нет, вот и обращаюсь на форум.

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

Про питание бОльшим напряжением (9 вольт) с понижением его до 5 вольт (3,3 вольт) на встроенном в ардуину стабилизаторе сразу забудьте. Энергия батареек будет уходить в тепло. А у 9 вольтовой кроны вообще ёмкость маленькая. Питать надо 3,3В - 5В напрямую на ножку VCC.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

да-да, и отпаять/отрезать питание от чипа интерфеса USB-UART , ибо тоже жрёт  тыц

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

Да там и стабилизатор по ходу выпаивать надо. В общем, проще взять отдельно Атмегу. Заодно и кварц на меньшую тактовую частототу поставить, для мигалки много не надо. Ну или вообще от внутреннего осциллятора.

Votmax
Offline
Зарегистрирован: 18.06.2016

Спасибо за ответы! Понятно, что можно много чего отпаять с платы, тогда уж проще взять отдельный контроллер и сделать ему минимально необходимую обвязку в виде кварца и питания. Но нет под рукой программатора и с паяльником я не очень в ладах. Поэтому и остановился на ардуино. Оговорюсь, что понимаю, что минимального энергототребления не добиться, я к этому и не стремлюсь. Хочу его снизить на столько на сколько это возможно в рамках ардуино нано и среды разработки. Я все таки думал про программное решение. В моем случае, можно ли на 5 сек  (то есть вместо delay(5000)) уводить контроллер в сон, затем по срабатыванию внешнего таймера выводить? Все таки какая то экономия. Как думаете?

uragan
Offline
Зарегистрирован: 23.02.2015

Так nano и есть готовый программатор.  Если питать от батарейки, то и контроллер обвязывать не надо. Т е батарейка, простейший контроллер и диод с резистором. 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А чё, спаять два транзистора в симметричный мультивибратор или, ещё лучше, взять экономичный КМОП'овский 555 таймер (хоть ICM7555IPA или GLC555) - типа "не наш метод"? 

Votmax
Offline
Зарегистрирован: 18.06.2016

ЕвгенийП пишет:

А чё, спаять два транзистора в симметричный мультивибратор или, ещё лучше, взять экономичный КМОП'овский 555 таймер (хоть ICM7555IPA или GLC555) - типа "не наш метод"? 

 

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

Никто не работал с таймером  на прерываниях?

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Так еще интересней. Всунул в панель запрограммировал . Высунул и вставил в схему.

https://static12.insales.ru/images/products/1/3688/35843688/arduino-uno....

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Votmax пишет:

Никто не работал с таймером  на прерываниях?

Что Вы под этим понимаете? 

toc
Offline
Зарегистрирован: 09.02.2013

Можно сделать всё. И частоту понизить програмно, и от внутреннего таймера просыпаться для выключения и включения лампочки.

Кладезь знаний по теме http://gammon.com.au/power (англ.)

arduinec
Offline
Зарегистрирован: 01.09.2015
Votmax
Offline
Зарегистрирован: 18.06.2016

 

По моему то что и искал))) Включаем светодиод, уходим в сон, просыпаемся, выключаем светодиод, уходим в сон и т.д. Спасибо буду разбираться!

 

P.S. Кстати Крона (Варта) продержалась на нано с мигающим каждые 10 секунд светодиодом 36 часов. Правда еще все время горел светодиод питания. Вот им, я думаю, пожертвовать можно.

arduinec
Offline
Зарегистрирован: 01.09.2015

Votmax пишет:

По моему то что и искал))) Включаем светодиод, уходим в сон, просыпаемся, выключаем светодиод, уходим в сон и т.д. Спасибо буду разбираться!

Если стоит задача только мигать светодиодом, то проще воспользоваться советом ЕвгенийП и применить 555 таймер.
http://radiokot.ru/articles/01/

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Votmax пишет:

По моему то что и искал))) Включаем светодиод, уходим в сон, просыпаемся, выключаем светодиод, уходим в сон и т.д. Спасибо буду разбираться!

 

P.S. Кстати Крона (Варта) продержалась на нано с мигающим каждые 10 секунд светодиодом 36 часов. Правда еще все время горел светодиод питания. Вот им, я думаю, пожертвовать можно.

Помнится, в начальной школе изучали такую науку - Арифметика называется.

Итак: На светодиоды обычно ставятся резисторы по 1к, следовательно (с учетом падения 2В на самом светодиоде) ток составит 3 мА. Это у того, что в питании. Скважность того, что мигает, составляет 2, следовательно, жрет он в 2 раза меньше - примероно 1.5 мА. Стабилизатор питания жрет около 3 мА и еще около 0.25 мА - CH340. Итого набирается почти 8 мА.

За 36 часов из батарейки только указанными цепями (не считая самомго контроллера) было высосано 8*36 = ~290 Ма/ч.

Заявленная емкость Кроны составляет 500 мА/ч, а реальная - в 2-3 раза меньше http://www.chipdip.ru/video/id000282900/

Собственно, судя по результатам либо контроллер не потреблял ток от Кроны, а сам выполнял роль батареи, либо Вам очень повезло, и Ваша Крона продемонстрировала емкость заметно выше средней.

В общем, пытаться загнать контроллер в сон при потреблении остальными элементами схемы 8 мА - занятие явно неблагодарное.

Рекомендации:

0. Питать от чего-то 3.3-5-вольтового. Например, от трех пальчиковых батареек или одной 18650.

1. Выпаять светодиод в питании.

2. Выпаять стабилизатор.

3. Увеличить скважность сигнала на индикаторном светодиоде. Например, чтобы длительность вспышки составляла 0.1с при 9.9 с. паузы.

4. Вероятно выпаять (или перерезать питание) CH340, а также светодиоды RX, TX.

После этого повторить эксперимент, но, все-таки, надежнее - измерить амперметром потребляемый ток.

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

PS. И еще раз подумать о применении 555 таймера.

Votmax
Offline
Зарегистрирован: 18.06.2016

Добрый день! Спасибо за хороший ответ!

Расскажу каких результатов я добился. Воспользовался примером по ссылке выше + отключил периферию. Выпаял светодиод питания (Ну как выпаяил, похоже отломал).

Программу я сделал так (код прикреплю вечером): контроллер включает светодиод и сразу уход в сон, через секунду просыпается, выключает светодиод и на 8 секунд опять уход в сон. То есть работает, когда переключает питание светодиода. Батарейку использовал такую же как и раньше, обычная желтая Варта. Светодиод моргал 4,5 суток.

До своего нужного месяца не дотянул)). Так что воспользуюсь вашеми советами про таймер 555.

Всем спасибо!

P.S. Воспользовался арифметикой)) Примерно вышел на теже показатели емкости батарейки.

Logik
Offline
Зарегистрирован: 05.08.2014

А "самомигающий" не? http://www.aliexpress.com/item-img/Free-Shipping-One-Lot-100pcs-3mm-red-flashing-led-water-clear-blinking-F-R/1870412974.html?spm=2114.10010208.0.52.9cv5IU

Использовал такой для иммитации сигнализации. Замечаний небыло.

Votmax
Offline
Зарегистрирован: 18.06.2016
#include <avr/io.h>
#include <avr/wdt.h> // здесь организована работа с ватчдогом
#include <avr/sleep.h> // здесь описаны режимы сна
#include <avr/interrupt.h> // работа с прерываниями
#include <avr/power.h>

int i;

ISR (WDT_vect) {
      //  PORTB ^= _BV(PB5); // переключаем светодиод


        
        WDTCSR |= _BV(WDIE); // разрешаем прерывания по ватчдогу. Иначе будет резет.

if (i==0)
{
 digitalWrite(13, HIGH);
wdt_enable(WDTO_1S); 
  
  i=1;
  }
  else
  {
digitalWrite(13, LOW);
wdt_enable(WDTO_8S);
  i=0; 
  }
WDTCSR |= _BV(WDIE); // разрешаем прерывания по ватчдогу. Иначе будет резет.

   
                
   
        
}

int main() {



  power_adc_disable();
  power_spi_disable();
  power_twi_disable();
  power_usart0_disable(); 
  i=0;      

        //инициализация ватчдога
        wdt_reset(); // сбрасываем
        wdt_enable(WDTO_8S); // разрешаем ватчдог 1 сек
        WDTCSR |= _BV(WDIE); // разрешаем прерывания по ватчдогу. Иначе будет резет.
        sei(); // разрешаем прерывания
        
        set_sleep_mode(SLEEP_MODE_PWR_DOWN); // если спать - то на полную
        while(1) {
                sleep_enable(); // разрешаем сон
                sleep_cpu(); // спать!
        }
}

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

 

 

Votmax
Offline
Зарегистрирован: 18.06.2016

Logik пишет:

А "самомигающий" не? http://www.aliexpress.com/item-img/Free-Shipping-One-Lot-100pcs-3mm-red-flashing-led-water-clear-blinking-F-R/1870412974.html?spm=2114.10010208.0.52.9cv5IU

Использовал такой для иммитации сигнализации. Замечаний небыло.

 

А это кстати интересная идея. Нужно будет посмотреть. А на сколько батарейки хватает?