Сколько arduino uno проработает от батарейки?

Тема в разделе "Arduino & Shields", создана пользователем Jazz777, 9 июл 2015.

  1. Jazz777

    Jazz777 Нерд

    В моем проекте большинство времени горит и иногда мигает пара светодиодов (другой нагрузки решим, что нет). Какие батарейки лучше использовать и сколько они протянут? Мне желательно решение от года и выше..
     
  2. Максим B

    Максим B Гуру

    От года выше навряд ли вам посоветуют что-то, но если использовать прерывания и спящие режимы - то можно поставить 2-е батарейки AA или 4-е батарейки и посмотреть сколько протянет. А так лучше не ардуино, а что-нибудь из attiny 2313 меньше кушает.
     
  3. Jazz777

    Jazz777 Нерд

    Погуглил, плат на нем, я так понял, нету, там предлагают прям от микросхемы всё распаивать - для меня не вариант - мне уровня не хватит и не очень интересно.
    Собираю не для себя. И, соответственно, не удобно будет раз в две недели звонить и спрашивать не сдохло ли. Поэтому в теме и спрашивал оценочные сроки, чтобы понять вообще начинать заморачиваться или нет.
     
  4. DrProg

    DrProg Вечный нерд

    Автомобильный аккумулятор. Или мотоциклетный. А вообще для дежурного режима и простой повербанки хватит надолго. А еще можно использовать Nano, если не ошибаюсь, у нее потребление в режиме ожидание ниже во много раз.
     
  5. Jazz777

    Jazz777 Нерд

    Ну нет, на столике должно стоять, глаз радовать ))
    У меня сделано так:
    unsigned long ms = millis();
    if ( ms % 180000 == 0 ) { // пора проверить пару моментов
    ...
    }
    Это катит за режим ожидания?
     
  6. DrProg

    DrProg Вечный нерд

    Формально да, но Уно даже в таком режиме потребляет прилично, в сравнении с Нано. Та вроде чуть ли специально заточена под задачи "ждать в засаде".
     
  7. Jazz777

    Jazz777 Нерд

    Хорошо. C nano понятно. С режимом ожидания тоже.
    Если я правильно понял, они дадут 3 вольта и ничего не заработает. Или не так?
     
  8. Megakoteyka

    Megakoteyka Оракул Модератор

    Нет, котроллер все равно будет постоянно выполнять программу. Нужно заводить таймер и уводить контроллер в спящий режим. Контроллер должен просыпаться по прерыванию таймера, делать свои дела и снова засыпать. Чтобы светодиоды меньше жрали, нужно понизить их яркость, увеличив номинал резисторов.
     
  9. Jazz777

    Jazz777 Нерд

    Со светодиодами понятно, спасибо. Я даже думаю поискать какие-нибудь совсем маленькие (типа тех, что на самой плате стоят).
    Мне так не понятно. Мой уровень - это матрешка Z, но с логикой дружу. Можно пример кода?
     
  10. DrProg

    DrProg Вечный нерд

    А как программно сделать усыпление и пробуждение?
     
  11. Deniss

    Deniss Гик

    Код (Text):
    #include <avr/sleep.h>
    #include <avr/power.h>
    int pin = 2;
    void wakeUp()
    {
      Serial.print("WakeUp"); //Проснулись
      detachInterrupt(0); //Отключаем прерывания
      while(1); //Бесконечный цикл
    }
    void EnterSleep()
    {
      attachInterrupt(0, wakeUp, LOW); //Если на 0-вом прерываниии - ноль, то просыпаемся.
      delay(100);
      sleep_enable(); //Разрешаем спящий режим
      sleep_mode(); //Спим (Прерывания продолжают работать.) Программа останавливается.
      sleep_disable(); //Запрещаем спящий режим
    }
    void setup()
    {
      Serial.begin(9600);
      set_sleep_mode(SLEEP_MODE_PWR_DOWN); //Определяем режим сна
      pinMode(pin, INPUT);
    }
    void loop()
    {
    Serial.print("Hello World");
    delay(5000)
    Serial.print("Sleep");
    EnterSleep(); //Пора спать
    }

    Варианты сна:
    SLEEP_MODE_IDLE - Режим ожидания (общий для всех моделей). В этом режим останавливается ЦПУ, а периферия — SPI, USART, Аналоговый компаратор, ADC, TWI, таймеры/счетчики, сторожевой таймер и система прерываний продолжает работать.
    SLEEP_MODE_ADC - В этом режиме останавливается процессор, но АЦП, внешние прерывания, TWI, таймер / счетчик2, сторожевой таймер (если включен) продолжают работать.
    SLEEP_MODE_PWR_SAVE - Этот режим похож на Power-down mode. Отличается он тем, что если Таймер/счетчик2 работает асинхронно, то он продолжит свою работу и во время сна. Это может пригодиться при реализации часов реального времени на микроконтроллере.
    SLEEP_MODE_STANDBY - Этот режим также похож на режим Power-down mode. Но в этом режиме тактовый генератор продолжает работать (если установлен внешний кварц). Из этого режима МК просыпается за 6 тактов.
    SLEEP_MODE_PWR_DOWN - Общий для всех микроконтроллеров AVR. В этом режиме останавливается все что есть в микроконтроллере, кроме сторожевого таймера, внешних прерываний и TWI. Самый экономный режим.

    Но для экономии питания в первую очередь я бы вместо UNO взял pro mini, понизил частоту работы и перевел бы ее на встроенный кварц.
     
    DrProg нравится это.
  12. Limoney

    Limoney Гик

    Контроллер пойдет спать, а просыпаться будет по нажатию кнопки?
    каждую секунду нужно нажимать кнопку, чтобы светодиодик поморгал.
    Правильно делать прерывание по таймеру.

    Одинаковый mega328p в зависимости от модели от 3.3В при частоте 8 МГц, другая - от 5В при 16 МГц
     
    Последнее редактирование: 10 июл 2015
  13. DrProg

    DrProg Вечный нерд

    На сколько хватит, например Кроны, для работы Мини на 8Гц? Хотя очень сильно зависит от того какая работа.
     
  14. Deniss

    Deniss Гик

    Не больше месяца, если не ложить спать... Длительность работы прямо пропорционально частоте. Частота ниже в 2 раза, в 2 раза меньше потребление...

    Если его ложить спать каждую секунду, то батарея сядет еще быстрее чем без сна... К тому же если диод/диоды должны гореть, то сон не подходит для этого режима.
     
  15. Limoney

    Limoney Гик

    Не используйте крону. Она очень слабая.
    Понятно, что хочется подключить крону 9в + стабилизатор напряжения на 5v.
    Лучше батарейки 4-шт или акум и малопотребляющий стабилизатор LP2950Z. Все зависит от потребления нагрузки.
    Потребление будет больше по сравнению с частотой. Контроллер будет дольше выполнять программу и больше скушает. В 40% меньше потребление.
    По-вашему, зачем тогда придумали режимы пониженного потребления?
    Откройте документацию там все расписано!
     
  16. Jazz777

    Jazz777 Нерд

    Deniss, я правильно понял, просыпаться в твоем примере он должен по нажатию кнопки? Если да, то так не пойдет - я не планирую постоянно рядом с ним находиться. Есть варианты пробуждения раз в три минуты по таймеру?
     
  17. DrProg

    DrProg Вечный нерд

    Сдается мне, что большой пользы от сна не будет большого, и программа усложнится неоправданно. Может блок аккумуляторов в связке с солнечной батареей выручит?
     
  18. Jazz777

    Jazz777 Нерд

    )) ну как вариант. Смотрю есть не дорогие 5V 0.8 W 160ma. Нагрузки у меня вроде почти никакой нету.. Должно потянуть?
     
  19. Jazz777

    Jazz777 Нерд

    Хотя и усложнения программы я тоже не боюсь, если есть вариант как просыпаться по таймеру - скиньте код, я за всё потестировать..
     
  20. geher

    geher Гуру

    Я думаю, что месяц - чрезвычайно оптимистичный прогноз. По факту не более нескольких недель, да и то, если бороться за энергосбережение ("спилить" лишние светодиоды, отправлять поспать).

    Хотя "Кроны" тоже бывают разные.

    Есть вариант с WatchDog.
    Реально в данном случае он будет просыпаться раз в секунду. А потому что-то делаться будет не на каждое пробуждение, а только на каждое третье.
    Есть константы и больше, для 2 и 4 секунд, но, насколько я понял, они поддерживаются не всеми МК.

    Код (Text):

    #include <avr/io.h>
    #include <avr/wdt.h> // здесь организована работа с ватчдогом
    #include <inttypes.h>
    #include <avr/interrupt.h>
    #include <avr/sleep.h> // здесь описаны режимы сна
    #include <util/delay.h>

    volatile int wdcounter=0;
    volatile int nexttick=1;
    uint16_t counter = 0;

    void setup()
    {

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

    void loop()
    {
      if (nexttick){
        nexttick=0;
        //что-то делаем
        // ----------
      }
      sleep_enable(); // разрешаем сон
      sleep_cpu(); // спать!
    }

    ISR (WDT_vect) {
      wdcounter++;
      if (wdcounter>=3){
        // прошло три секундных цикла - значит надо что-то сделать
        // сбрасываем счетчик и вывешиваем флаг  nexttick
        wdcounter=0;
        nexttick=1;
      }
      WDTCR |= _BV(WDIE); // разрешаем прерывания по ватчдогу. Иначе будет резет.
    }
    [CODE]