Ошибка при питании от батареи

supersuperoleg
Offline
Зарегистрирован: 05.11.2015

Прошу помощи с проектом.

Решил сделать простейший сигнализатор занятости туалета для офиса. Суть - на дверь вешается герконовый датчик. Когда в туалете никого нет - дверь всегда открыта. Когда кто-то внутри, то дверь закрыта на шпингалет => герконовый датчик срабатывает, загорается светодиод => всем ясно, что туалет занят.

Для экономии батареи реализовал засыпание по watchdog-таймеру - каждые 8 секунд аудрина просыпается, проверяет состояние геркона, если он замкнут - зажигает светодио. Если геркон не замкнут - ардуина засыпает.

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

Но суть вопроса в следующем: при питании от USB все работает, однако при подключении внешнего питания от батареи какое-то время все работает, а потом перестает, status-LED начинает хаотично мигать, ардуина зависает.

ПОЧЕМУ? Пробовал с несколькими разными ардуино про мини 3.3В, 5В... Может встроенный стабилизатор напряжения V-input плохой? Ардуинки китайские...

Внешнее питание подавал на RAW-пин. Пробовал как крону, так и 2xAA.

Схема:

арудино про мини 3.3V. Резисторы 120 Ом, 10кОм.

Скетч:


#include <avr/sleep.h>
#include <avr/power.h>
#include <avr/wdt.h>
int count = 0;                   // Счетчик
#define LED_PIN 11
int Door_Sensor_Pin = 2; // контакт для датчика
int val = 0; // переменная для хранения состояния датчика

volatile int f_wdt = 1;



/***************************************************
 *  Name:        ISR(WDT_vect)
 *
 *  Returns:     Nothing.
 *
 *  Parameters:  None.
 *
 *  Description: Watchdog Interrupt Service. This
 *               is executed when watchdog timed out.
 *
 ***************************************************/
ISR(WDT_vect)
{
  if (f_wdt == 0)
  {
    f_wdt = 1;
  }
  else
  {
    //  Serial.println("WDT Overrun!!!");
  }
}


/***************************************************
 *  Name:        enterSleep
 *
 *  Returns:     Nothing.
 *
 *  Parameters:  None.
 *
 *  Description: Enters the arduino into sleep mode.
 *
 ***************************************************/
void enterSleep(void)
{
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);   /* EDIT: could also use SLEEP_MODE_PWR_DOWN for lowest power consumption. */
  sleep_enable();

  /* Now enter sleep mode. */
  sleep_mode();

  /* The program will continue from here after the WDT timeout*/
  sleep_disable(); /* First thing to do is disable sleep. */

  /* Re-enable the peripherals. */
  power_all_enable();
}



/***************************************************
 *  Name:        setup
 *
 *  Returns:     Nothing.
 *
 *  Parameters:  None.
 *
 *  Description: Setup for the serial comms and the
 *                Watch dog timeout.
 *
 ***************************************************/
void setup()
{
  /*  Serial.begin(9600);
    Serial.println("Initialising...");*/
  delay(100); //Allow for serial print to complete.

  pinMode(LED_PIN, OUTPUT);
  pinMode(Door_Sensor_Pin, INPUT); // установить Door_Sensor_Pin как вход
  /*** Setup the WDT ***/

  /* Clear the reset flag. */
  MCUSR &= ~(1 << WDRF);

  /* In order to change WDE or the prescaler, we need to
   * set WDCE (This will allow updates for 4 clock cycles).
   */
  WDTCSR |= (1 << WDCE) | (1 << WDE);

  /* set new watchdog timeout prescaler value */
  WDTCSR = 1 << WDP0 | 1 << WDP3; /* 8.0 seconds */

  /* Enable the WD interrupt (note no reset). */
  WDTCSR |= _BV(WDIE);

  /* Serial.println("Initialisation complete.");
   delay(100); //Allow for serial print to complete.*/
}



/***************************************************
 *  Name:        enterSleep
 *
 *  Returns:     Nothing.
 *
 *  Parameters:  None.
 *
 *  Description: Main application loop.
 *
 ***************************************************/
void loop()
{

  if (f_wdt == 1)
  {

    val = digitalRead(Door_Sensor_Pin); // читать Door_Sensor_Pin
    while (val)
    {
      /*  Serial.print("waking up");
        Serial.print("\n");*/


      digitalWrite(LED_PIN, HIGH); //включить светодиод 
      delay(1000);
      digitalWrite(LED_PIN, LOW);
      delay(1000);
      val = digitalRead(Door_Sensor_Pin); // читать Door_Sensor_Pin
    }
    // Отображаем информацию о счетчике
    /*  Serial.print("will sleep for ");
      Serial.print(count);
      Serial.println("sec");
      count = count + 8;
      delay(1000);                           // Ждем секунду
    */
    /*    Don't forget to clear the flag. */
    f_wdt = 0;
    /* Re-enter sleep mode. */
    enterSleep();
  }
  else
  {
    /* Do nothing. */
  }
}

 

vk007
Offline
Зарегистрирован: 16.06.2015

supersuperoleg пишет:

Решил сделать простейший сигнализатор занятости туалета для офиса. Суть - на дверь вешается герконовый датчик. Когда в туалете никого нет - дверь всегда открыта. Когда кто-то внутри, то дверь закрыта на шпингалет => герконовый датчик срабатывает, загорается светодиод => всем ясно, что туалет занят.

о_О а ардуина тут нахрена???

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

1. Если схема собрана именно так, как нарисована, один из резисторов не нужен. Совсем.

2. У 2хАА всего 3 вольта. Это для питания Ардуины явно недостаточно. Особенно, еси подавать на вход стабилизатора. Крона же обладает довольно малой нагрузочной способностью. Поэтому вполне естественно, что ее вскоре перестает хватать.

Вы бы измерили напряжение на Vcc.

vk007
Offline
Зарегистрирован: 16.06.2015

Изобретаем велосипеды? Пилим бюджет? Без ардуины никак?

Araris
Offline
Зарегистрирован: 09.11.2012

Вот эта реализация поинтересней будет : http://habrahabr.ru/post/216059/

supersuperoleg
Offline
Зарегистрирован: 05.11.2015

Читал эту статью. В нашем туалете свет включен постоянно. Герконовый датчик в этой ситуации подходит лучше.

supersuperoleg
Offline
Зарегистрирован: 05.11.2015

Это первый этап проекта. В будущем планируется довесить еще немного функций. По Вашей схеме диод будет гореть постоянно при смыкании геркона, как его заставить мигать для экономии батареи?

Кроны не хватит для данного проекта? Понимаю, что это не лучшее решение..

При питании от 2хАА думал прикупить повышающий стабилизатор (DC-DC Step Up Boost Module 5V Input 1-3V , Output 5V. Use this if you need to power 5V sensors from a 3.3V Arduino Pro Mini), но пока он дойдет из Китая...

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

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

supersuperoleg пишет:

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

У всех свои границы понятия "нормально".  Помнится в начале 2000х годов  купил первый мини-сиди плеер, в то время плееров на флэшпамяти ещё не было, у него время работы от комплекта батареек было всего 1,5 часа, если ставить очень хорошие батарейки, то 2 часа. Видимо производитель счёл, что это нормально. Думаю сейчас никто не согласится с тем, что это нормально) Так вот, Ардуино и крона -вещи практически несовместимые друг с другом. Первая рассеивает половину напряжения в тепло, вторая в принципе вещь дохлая, около 200ма/ч если не изменяет память. Получается как в моём примере. Всё работает, но очень недолго. Нафига такое счастье? Единственной моделью ардуино, которая хорошо дружит с батарейками является ардуино минипро 8мГц 3,3в.  Её можно запитать от одной банки лития, или 3х пальчиковых батареек по 1,5 в.  Подключив на пин Vcc Т.к. напряжение питания укладывается в  разрешенный диапазон Vcc ( 2,7...5,5в ) Если вы подключаете в Raw, то мало того, что теряете на понижении около вольта, так ещё батарейка будет всё время разряжаться через стабилизатор, даже если сама ардуина в это время мирно спит.

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

supersuperoleg,

> status-LED начинает хаотично мигать, ардуина зависает

1. Вы используете watchdog. Заменили ли вы бутлоадер на wdt-совместимый?

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

2. Тут просыпаетесь по low? Я считаю, что тут важно перед засыпанием проверить, что вход high. У меня была такая проблема.

3. для экономии батареи можно спать и при горящем светодиоде.

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

toc пишет:
3. для экономии батареи можно спать и при горящем светодиоде.

Это как?

Как можно экономить батарею при горящем светодиоде?

supersuperoleg
Offline
Зарегистрирован: 05.11.2015

dimax пишет:

supersuperoleg пишет:

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

У всех свои границы понятия "нормально".  Помнится в начале 2000х годов  купил первый мини-сиди плеер, в то время плееров на флэшпамяти ещё не было, у него время работы от комплекта батареек было всего 1,5 часа, если ставить очень хорошие батарейки, то 2 часа. Видимо производитель счёл, что это нормально. Думаю сейчас никто не согласится с тем, что это нормально) Так вот, Ардуино и крона -вещи практически несовместимые друг с другом. Первая рассеивает половину напряжения в тепло, вторая в принципе вещь дохлая, около 200ма/ч если не изменяет память. Получается как в моём примере. Всё работает, но очень недолго. Нафига такое счастье? Единственной моделью ардуино, которая хорошо дружит с батарейками является ардуино минипро 8мГц 3,3в.  Её можно запитать от одной банки лития, или 3х пальчиковых батареек по 1,5 в.  Подключив на пин Vcc Т.к. напряжение питания укладывается в  разрешенный диапазон Vcc ( 2,7...5,5в ) Если вы подключаете в Raw, то мало того, что теряете на понижении около вольта, так ещё батарейка будет всё время разряжаться через стабилизатор, даже если сама ардуина в это время мирно спит.

Спасибо за разъяснение. Как лучше всего подключить к ПроМини 3 пальчиковых батарейки? :)

Я прикупил такую штуку, но к ней надо заказать повышающий преобразователь.

supersuperoleg
Offline
Зарегистрирован: 05.11.2015

toc пишет:
supersuperoleg, > status-LED начинает хаотично мигать, ардуина зависает 1. Вы используете watchdog. Заменили ли вы бутлоадер на wdt-совместимый? > Можно было бы реализовать пробуждение и по внешнему прерыванию, то есть ардуина просыпалась бы при замкании геркона... Я делал так, и все работает, однако иногда происходит зависание, если с высокой частотой смыкать геркон (реализовывал защиту от дребезга, но дело не в этом), потому решил отказатья от внешнего прерывания. 2. Тут просыпаетесь по low? Я считаю, что тут важно перед засыпанием проверить, что вход high. У меня была такая проблема. 3. для экономии батареи можно спать и при горящем светодиоде.

Плаваю в этом вопросе. Для прошивки использовал его.

Не помню, вроде бы проверку, что вход по хай, делал. Скетч дома, посмотреть смогу только вечером.

Про сон при горящем светодиоде и в голову не пришло, интересная идея!

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

supersuperoleg пишет:

Спасибо за разъяснение. Как лучше всего подключить к ПроМини 3 пальчиковых батарейки? :) Я прикупил такую штуку, но к ней надо заказать повышающий преобразователь.

Нет, эта штука не годится, нужно такую же на 3 батарейки. И к пину Vcc напрямую.   Повышающий преобразователь убъёт то, за что боролись -, он будет всё время работать и сажать батарейки.

supersuperoleg
Offline
Зарегистрирован: 05.11.2015

dimax пишет:

 Её можно запитать от одной банки лития, ....  Подключив на пин Vcc Т.к. напряжение питания укладывается в  разрешенный диапазон Vcc ( 2,7...5,5в )

Вы имеете в виду 18650? Нагуглил для них неплохой бокс

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

supersuperoleg, угу, 18650,  годный бокс:)

supersuperoleg
Offline
Зарегистрирован: 05.11.2015

dimax пишет:

supersuperoleg, угу, 18650,  годный бокс:)

dimax пишет:

supersuperoleg, угу, 18650,  годный бокс:)

Спасибо за ликбез, dimax, узнал много нового!

Maverik
Offline
Зарегистрирован: 12.09.2012

это не бокс, это держатель для аккумуляторов (holder).  удобная штука, я на таких 2x 4 шт сделал держатель для зарядки сразу 8 аккумуляторов 18650 с балансиром через iMAX B6

и это... зачем сигнализатор занятости, если есть шпингалет ? ))

 

 

supersuperoleg
Offline
Зарегистрирован: 05.11.2015

Maverik пишет:

это не бокс, это держатель для аккумуляторов (holder).  удобная штука, я на таких 2x 4 шт сделал держатель для зарядки сразу 8 аккумуляторов 18650 с балансиром через iMAX B6

и это... зачем сигнализатор занятости, если есть шпингалет ? ))

Расстояние по коридору от кабинета до туалета большое, и вот идешь-идешь, а там занято.. и не ясно, то ли дождаться, то ли назад пойти...

Клапауций 911
Offline
Зарегистрирован: 18.10.2015

supersuperoleg пишет:

то ли дождаться, то ли назад пойти...

в подъезде отлить. :D

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

supersuperoleg пишет:

Расстояние по коридору от кабинета до туалета большое, и вот идешь-идешь, а там занято.. и не ясно, то ли дождаться, то ли назад пойти...

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

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

dimax пишет:

Нет, эта штука не годится, нужно такую же на 3 батарейки. И к пину Vcc напрямую.   Повышающий преобразователь убъёт то, за что боролись -, он будет всё время работать и сажать батарейки.

Может быть не совсем в тему затронутую топикстартером, но все же хочется сказать, что если принять все меры к снижению потребляемой ардуиной мощности, то двух батарей будет за глаза. Даже для 16мгц версии. Выпаять LDO, набортный светодиод, прескалером сбросить частоту тактирования ядра до 1 - 4мгц, выключить АЦП, неиспользуемую периферию и оно уйдет на уровень потребления в пару-тройку миллиампер в активном режими и единиц микроампер в фазе сна. Преобразователь все равно будет нужен для запитки того, чем там будет управлять ардуино, но включать этот преобразователь можно лишь по мере надобности. Если подавать на светодиод импульсы длительносью 10-20мс при токе 2-5 миллиампер, то такая индикация будет хорошо различима при весьма умеренном потреблении.

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

a5021, вы про BODLEVEL забыли упомянуть) Фузики придёться перепрограммировать, по умолчанию то 2,7 вольта.

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

Да-да, справедливое замечание. БОД однозначно надо отключать, что для питания от пониженных напряжений, что для снижения потребления.

supersuperoleg
Offline
Зарегистрирован: 05.11.2015

a5021 пишет:

Может быть не совсем в тему затронутую топикстартером, но все же хочется сказать, что если принять все меры к снижению потребляемой ардуиной мощности, то двух батарей будет за глаза. Даже для 16мгц версии. Выпаять LDO, набортный светодиод, прескалером сбросить частоту тактирования ядра до 1 - 4мгц, выключить АЦП, неиспользуемую периферию и оно уйдет на уровень потребления в пару-тройку миллиампер в активном режими и единиц микроампер в фазе сна. Преобразователь все равно будет нужен для запитки того, чем там будет управлять ардуино, но включать этот преобразователь можно лишь по мере надобности. Если подавать на светодиод импульсы длительносью 10-20мс при токе 2-5 миллиампер, то такая индикация будет хорошо различима при весьма умеренном потреблении.

из всего вышеперечисленного лишь убрал питание светодиода. Про другое - не в курсе даже.. Где можно найти подробнее на русском? И что даст больший эффект?

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

Про русский не скажу, но на здешнем форум уже много раз вспоминали сайт австралийца Ника Гаммона, где много чего собрано по ардуине, в том числе очень подробно рассмотрен режим пониженного потребления. Текста там не много, т.ч. можно и со словарем осилить, а вот примеры кода там просто замечательные.

strannik
Offline
Зарегистрирован: 30.07.2015

Конечно микроконтроллер для этой задачи вообще не нужен (про это уже писали), но если хочется делать именно на Arduino, то по-моему лучше взять  5-тивольтовую версию  Pro Mini и запитать её через  простейший DC-DC преобразователь. Хватит одного единственного акума типа 18650, если прикрутить к нему универсальный контроллер заряда и защиты.

n006
Offline
Зарегистрирован: 12.02.2015

vk007 пишет:

supersuperoleg пишет:

Решил сделать простейший сигнализатор занятости туалета для офиса. Суть - на дверь вешается герконовый датчик. Когда в туалете никого нет - дверь всегда открыта. Когда кто-то внутри, то дверь закрыта на шпингалет => герконовый датчик срабатывает, загорается светодиод => всем ясно, что туалет занят.

о_О а ардуина тут нахрена???

Как это нахрена?

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

Ну и ИК пульт, чтобы заранее «бронировать» ватерклозет для себя любимого :)