Ошибка при питании от батареи
- Войдите на сайт для отправки комментариев
Прошу помощи с проектом.
Решил сделать простейший сигнализатор занятости туалета для офиса. Суть - на дверь вешается герконовый датчик. Когда в туалете никого нет - дверь всегда открыта. Когда кто-то внутри, то дверь закрыта на шпингалет => герконовый датчик срабатывает, загорается светодиод => всем ясно, что туалет занят.
Для экономии батареи реализовал засыпание по 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. */ } }
Решил сделать простейший сигнализатор занятости туалета для офиса. Суть - на дверь вешается герконовый датчик. Когда в туалете никого нет - дверь всегда открыта. Когда кто-то внутри, то дверь закрыта на шпингалет => герконовый датчик срабатывает, загорается светодиод => всем ясно, что туалет занят.
о_О а ардуина тут нахрена???
1. Если схема собрана именно так, как нарисована, один из резисторов не нужен. Совсем.
2. У 2хАА всего 3 вольта. Это для питания Ардуины явно недостаточно. Особенно, еси подавать на вход стабилизатора. Крона же обладает довольно малой нагрузочной способностью. Поэтому вполне естественно, что ее вскоре перестает хватать.
Вы бы измерили напряжение на Vcc.
Изобретаем велосипеды? Пилим бюджет? Без ардуины никак?
Вот эта реализация поинтересней будет : http://habrahabr.ru/post/216059/
Читал эту статью. В нашем туалете свет включен постоянно. Герконовый датчик в этой ситуации подходит лучше.
Это первый этап проекта. В будущем планируется довесить еще немного функций. По Вашей схеме диод будет гореть постоянно при смыкании геркона, как его заставить мигать для экономии батареи?
Кроны не хватит для данного проекта? Понимаю, что это не лучшее решение..
При питании от 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), но пока он дойдет из Китая...
Читал в интернете множество примеров того, как проекты на ардуино питаются от кроны, и у всех все вроде бы нормально...
Читал в интернете множество примеров того, как проекты на ардуино питаются от кроны, и у всех все вроде бы нормально...
У всех свои границы понятия "нормально". Помнится в начале 2000х годов купил первый мини-сиди плеер, в то время плееров на флэшпамяти ещё не было, у него время работы от комплекта батареек было всего 1,5 часа, если ставить очень хорошие батарейки, то 2 часа. Видимо производитель счёл, что это нормально. Думаю сейчас никто не согласится с тем, что это нормально) Так вот, Ардуино и крона -вещи практически несовместимые друг с другом. Первая рассеивает половину напряжения в тепло, вторая в принципе вещь дохлая, около 200ма/ч если не изменяет память. Получается как в моём примере. Всё работает, но очень недолго. Нафига такое счастье? Единственной моделью ардуино, которая хорошо дружит с батарейками является ардуино минипро 8мГц 3,3в. Её можно запитать от одной банки лития, или 3х пальчиковых батареек по 1,5 в. Подключив на пин Vcc Т.к. напряжение питания укладывается в разрешенный диапазон Vcc ( 2,7...5,5в ) Если вы подключаете в Raw, то мало того, что теряете на понижении около вольта, так ещё батарейка будет всё время разряжаться через стабилизатор, даже если сама ардуина в это время мирно спит.
supersuperoleg,
> status-LED начинает хаотично мигать, ардуина зависает
1. Вы используете watchdog. Заменили ли вы бутлоадер на wdt-совместимый?
> Можно было бы реализовать пробуждение и по внешнему прерыванию, то есть ардуина просыпалась бы при замкании геркона... Я делал так, и все работает, однако иногда происходит зависание, если с высокой частотой смыкать геркон (реализовывал защиту от дребезга, но дело не в этом), потому решил отказатья от внешнего прерывания.
2. Тут просыпаетесь по low? Я считаю, что тут важно перед засыпанием проверить, что вход high. У меня была такая проблема.
3. для экономии батареи можно спать и при горящем светодиоде.
Это как?
Как можно экономить батарею при горящем светодиоде?
Читал в интернете множество примеров того, как проекты на ардуино питаются от кроны, и у всех все вроде бы нормально...
У всех свои границы понятия "нормально". Помнится в начале 2000х годов купил первый мини-сиди плеер, в то время плееров на флэшпамяти ещё не было, у него время работы от комплекта батареек было всего 1,5 часа, если ставить очень хорошие батарейки, то 2 часа. Видимо производитель счёл, что это нормально. Думаю сейчас никто не согласится с тем, что это нормально) Так вот, Ардуино и крона -вещи практически несовместимые друг с другом. Первая рассеивает половину напряжения в тепло, вторая в принципе вещь дохлая, около 200ма/ч если не изменяет память. Получается как в моём примере. Всё работает, но очень недолго. Нафига такое счастье? Единственной моделью ардуино, которая хорошо дружит с батарейками является ардуино минипро 8мГц 3,3в. Её можно запитать от одной банки лития, или 3х пальчиковых батареек по 1,5 в. Подключив на пин Vcc Т.к. напряжение питания укладывается в разрешенный диапазон Vcc ( 2,7...5,5в ) Если вы подключаете в Raw, то мало того, что теряете на понижении около вольта, так ещё батарейка будет всё время разряжаться через стабилизатор, даже если сама ардуина в это время мирно спит.
Спасибо за разъяснение. Как лучше всего подключить к ПроМини 3 пальчиковых батарейки? :)
Я прикупил такую штуку, но к ней надо заказать повышающий преобразователь.
Плаваю в этом вопросе. Для прошивки использовал его.
Не помню, вроде бы проверку, что вход по хай, делал. Скетч дома, посмотреть смогу только вечером.
Про сон при горящем светодиоде и в голову не пришло, интересная идея!
Спасибо за разъяснение. Как лучше всего подключить к ПроМини 3 пальчиковых батарейки? :) Я прикупил такую штуку, но к ней надо заказать повышающий преобразователь.
Нет, эта штука не годится, нужно такую же на 3 батарейки. И к пину Vcc напрямую. Повышающий преобразователь убъёт то, за что боролись -, он будет всё время работать и сажать батарейки.
Её можно запитать от одной банки лития, .... Подключив на пин Vcc Т.к. напряжение питания укладывается в разрешенный диапазон Vcc ( 2,7...5,5в )
Вы имеете в виду 18650? Нагуглил для них неплохой бокс
supersuperoleg, угу, 18650, годный бокс:)
supersuperoleg, угу, 18650, годный бокс:)
supersuperoleg, угу, 18650, годный бокс:)
Спасибо за ликбез, dimax, узнал много нового!
это не бокс, это держатель для аккумуляторов (holder). удобная штука, я на таких 2x 4 шт сделал держатель для зарядки сразу 8 аккумуляторов 18650 с балансиром через iMAX B6
и это... зачем сигнализатор занятости, если есть шпингалет ? ))
это не бокс, это держатель для аккумуляторов (holder). удобная штука, я на таких 2x 4 шт сделал держатель для зарядки сразу 8 аккумуляторов 18650 с балансиром через iMAX B6
и это... зачем сигнализатор занятости, если есть шпингалет ? ))
Расстояние по коридору от кабинета до туалета большое, и вот идешь-идешь, а там занято.. и не ясно, то ли дождаться, то ли назад пойти...
то ли дождаться, то ли назад пойти...
в подъезде отлить. :D
Расстояние по коридору от кабинета до туалета большое, и вот идешь-идешь, а там занято.. и не ясно, то ли дождаться, то ли назад пойти...
Нормальные пацаны для этого уже видеокамеры используют. В коридоре, понятное дело. :)
Нет, эта штука не годится, нужно такую же на 3 батарейки. И к пину Vcc напрямую. Повышающий преобразователь убъёт то, за что боролись -, он будет всё время работать и сажать батарейки.
Может быть не совсем в тему затронутую топикстартером, но все же хочется сказать, что если принять все меры к снижению потребляемой ардуиной мощности, то двух батарей будет за глаза. Даже для 16мгц версии. Выпаять LDO, набортный светодиод, прескалером сбросить частоту тактирования ядра до 1 - 4мгц, выключить АЦП, неиспользуемую периферию и оно уйдет на уровень потребления в пару-тройку миллиампер в активном режими и единиц микроампер в фазе сна. Преобразователь все равно будет нужен для запитки того, чем там будет управлять ардуино, но включать этот преобразователь можно лишь по мере надобности. Если подавать на светодиод импульсы длительносью 10-20мс при токе 2-5 миллиампер, то такая индикация будет хорошо различима при весьма умеренном потреблении.
a5021, вы про BODLEVEL забыли упомянуть) Фузики придёться перепрограммировать, по умолчанию то 2,7 вольта.
Да-да, справедливое замечание. БОД однозначно надо отключать, что для питания от пониженных напряжений, что для снижения потребления.
Может быть не совсем в тему затронутую топикстартером, но все же хочется сказать, что если принять все меры к снижению потребляемой ардуиной мощности, то двух батарей будет за глаза. Даже для 16мгц версии. Выпаять LDO, набортный светодиод, прескалером сбросить частоту тактирования ядра до 1 - 4мгц, выключить АЦП, неиспользуемую периферию и оно уйдет на уровень потребления в пару-тройку миллиампер в активном режими и единиц микроампер в фазе сна. Преобразователь все равно будет нужен для запитки того, чем там будет управлять ардуино, но включать этот преобразователь можно лишь по мере надобности. Если подавать на светодиод импульсы длительносью 10-20мс при токе 2-5 миллиампер, то такая индикация будет хорошо различима при весьма умеренном потреблении.
из всего вышеперечисленного лишь убрал питание светодиода. Про другое - не в курсе даже.. Где можно найти подробнее на русском? И что даст больший эффект?
Про русский не скажу, но на здешнем форум уже много раз вспоминали сайт австралийца Ника Гаммона, где много чего собрано по ардуине, в том числе очень подробно рассмотрен режим пониженного потребления. Текста там не много, т.ч. можно и со словарем осилить, а вот примеры кода там просто замечательные.
Конечно микроконтроллер для этой задачи вообще не нужен (про это уже писали), но если хочется делать именно на Arduino, то по-моему лучше взять 5-тивольтовую версию Pro Mini и запитать её через простейший DC-DC преобразователь. Хватит одного единственного акума типа 18650, если прикрутить к нему универсальный контроллер заряда и защиты.
Решил сделать простейший сигнализатор занятости туалета для офиса. Суть - на дверь вешается герконовый датчик. Когда в туалете никого нет - дверь всегда открыта. Когда кто-то внутри, то дверь закрыта на шпингалет => герконовый датчик срабатывает, загорается светодиод => всем ясно, что туалет занят.
о_О а ардуина тут нахрена???
Как это нахрена?
Потом можно будет нарисовать датчик движения, газоанализатор, wifi видео на ютюб опять же.
Ну и ИК пульт, чтобы заранее «бронировать» ватерклозет для себя любимого :)