at0mix, в данном случае за что купил - за то продал. Параметры смотрел в спецификации на батарейку. Как до дачи доберусь, вскрою контроллер и погляжу, что на самой батарее написано.
Схему в итоге я собрал, поставил правда АКБ свинцовый. Литиевый к моменту запуска отработал положенные 4 года и почил. Из-за сложностей контроля заряда-разряди литиевой АКБ поставил простой свинцовый. Он еще и к температурам не требователен.
Ну суть не в этом. Столкнулся с другой задачей: при падении напряжения питания контрллера ниже 4 в. он начинает перезагружаться и заново запускаться. Есть какой-то правильный способ увести его в сон или отключить до появления стабильных 5в. на питание?
Схему в итоге я собрал, поставил правда АКБ свинцовый. Литиевый к моменту запуска отработал положенные 4 года и почил. Из-за сложностей контроля заряда-разряди литиевой АКБ поставил простой свинцовый. Он еще и к температурам не требователен.
Ну суть не в этом. Столкнулся с другой задачей: при падении напряжения питания контрллера ниже 4 в. он начинает перезагружаться и заново запускаться. Есть какой-то правильный способ увести его в сон или отключить до появления стабильных 5в. на питание?
Добрый день.
Подскажите Вы нашли решение проблемы, что бы не перезагружался Микроконтроллер?
Решение вроде нашел, а вот как его реализовать - пока не совсем.
Можно уводить контроллер в сон. И затем пробуждать по прерыванию. Вот в сон я его уводить научился, а как пробудить, пока не пойму :) Даже не то, чтобы "не пойму".. Как обойтись штатными средствами, не задействуя реле. С помощью реле коммутацию понятно как можно сделать. А мне нужно, чтобы при понижении напряжения до определенного уровня, ардуина уходила в сон, а затем, при появлении напряжения вновь просыпалась. При этом напряжение на ноге, которая настроена на прерывание, имеется в процессе нормальной работы, пропадает лишь когда ардуину нужно увести в сон, и затем, как только напряжение появилось (на этой же ноге), ардуина должна проснуться. Вот как это сделать без реле - пока не допетрил. Скетч дома, как доберусь - выложу.
dr.lmg, думаете спящему МК питание совсем по барабану? Он так же глюканет как и не спящий. В меге есть встроенная фишка - супервайзер питания, браун-аут. Когда питание проседает ниже запрограммированного уровня (по умолчанию в ардуино уно -2,7вольта) супервайзер прижимает ресет к земле. Соответссно мк потребляет крохи, при 4 вольтах -примерно 1,5ма. При 1,8 в -примерно 100мкА. Так что ничего делать не нужно, всё уже предусмотрено производителем.
Питание естественно будет. В сон необходимо уходить, когда внешнее питание отключено, и заряд батареи достигает определенного значения. При возобновлении внешнего питания ардуино должен проснуться и начать работать.
По сути у меня вызов sleepNow() происходит из функции контроля разряда батареи. Достигли по напряжению определенного минимума - уходим в сон, и слушаем прерывания на 2 ноге по высокому сигналу. Однако на высокий сигнал она не реагирует, а вот почему - не пойму.
// Подключаем библиотеки
// управление питанием контроллера (спящий режим)
#include <avr/sleep.h>
int wakePin = 2; // пин для ухода / выхода спящего режима
int sleepStatus = 0; // Переменная для хранения статуса (спим, проснулись)
int LedPin=13; // Светодиод
void wakeUpNow() // Прерывание сработает после пробуждения
{
if (sleepStatus) // Если мы спали,
{
sleep_disable(); // то первое, что нужно сделать после просыпания - выключить спящий режим
digitalWrite(LedPin, HIGH); // Включаем светодиод
sleepStatus = 0; // В переменную заносим статус бодрствования
}
// else
// {
// Serial.println("Timer: Entering Sleep mode");
// delay(1000); // Этот делэй необходим, чтоб функция sleep не вызывала ошибку по Serial
// sleepNow(); // Вызов функции sleep() для засыпания
// }
// Код, который здесь выполнится перед возвращением в цикл loop()
// Таймеы и код, использующий таймеры (serial.print и др...) здесь не будет работать
// Также мы не должны выполнять какие-то спец. функции здесь,
// Т.к. здесь мы просто просыпаемся
}
void setup() {
// задаем пин для контроля внешнего питания для режима сна
pinMode(wakePin, INPUT);
digitalWrite(wakePin, LOW);
// Используем прерывание 0 (pin 2) для выполнения функции wakeUpNow (прерывание вызывается только при смене значения на порту с LOW на HIGH - подтянуть на ногу 2 на 5в.)
attachInterrupt(0, wakeUpNow, RISING);
}
void sleepNow() // Функция увода ардуины в спячку.
{
digitalWrite(LedPin, LOW); // Выключаем светодиод
set_sleep_mode(SLEEP_MODE_PWR_DOWN); // Здесь устанавливается режим сна
sleep_enable(); // Включаем sleep-бит в регистре mcucr. Теперь возможен слип
//attachInterrupt(0,wakeUpNow, LOW); // Используем прерывание 0 (pin 2) для выполнения функции wakeUpNow при появлении низкого уровня на пине 2
//count = 0; // Обнуляем счетчик прошедших секунд
sleepStatus = 1; // В переменную заносим статус сна
sleep_mode(); // Здесь устройство перейдет в режим сна!!!
// -----------------------------------------------ПОСЛЕ ПРОСЫПАНИЯ ВЫПОЛНЕНИЕ КОДА ПРОДОЛЖИТСЯ ОТСЮДА!!!
//sleep_disable(); // Первое, что нужно сделать после просыпания - выключить спящий режим
//detachInterrupt(0); // Выключаем прерывание - при нормальном режиме wakeUpNow() не будет вызываться
}
void loop() {
// здесь выполняется всякий код и проверка на разряд батареи
if ((pwr_AC < 4) && (step_pwr_ACC == 4))
{
msgSMS = msgSMS + "!!! pwr ACC: Battery is DISCHARGED (" + String(pwr_AC) + "v)\r\n";
++step_pwr_ACC;
goSMS();
EndSMS();
ST_RL_Power = false; // выключаем все реле
goRelay();
sleepNow(); // Вызов функции sleep() для засыпания
}
}
Коллеги, какие есть мнения? Без реле, имея изначально высокий уровень на второй ноге, который при отключении внешнего питания практически падает в ноль, уходить в сон (не задействуя на это прерывания), а пробуждать именно при появлении высокого сигнала (возобновление внешнего питания) по прерыванию на второй ноге.
Если питание и прерывание подаются одновременно, то Ардуина не замечает, что произошло прерывание. Нужно сделать задержку между подачей питания и сигналом прерывания.
Вот ссылка на зарядник.
Батарея у меня LiFePO4 (12 В / 1,3 А/ч).
Хочу поправить доктора имиджа - 12В можно получить из 6 банок свинцовых по 2В или 10 банок никеля по 1.2В. ВСЕ!
Элемент ЛиФеПо дает 3.3В - и ни при каких ухищрениях 12 В получить нельзя.
ЛиИон и ЛиПо - 3.6-3.7В
https://ru.wikipedia.org/wiki/%D0%AD%D0%BB%D0%B5%D0%BA%D1%82%D1%80%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%B0%D0%BA%D0%BA%D1%83%D0%BC%D1%83%D0%BB%D1%8F%D1%82%D0%BE%D1%80
at0mix, в данном случае за что купил - за то продал. Параметры смотрел в спецификации на батарейку. Как до дачи доберусь, вскрою контроллер и погляжу, что на самой батарее написано.
Оживлю темку..
Схему в итоге я собрал, поставил правда АКБ свинцовый. Литиевый к моменту запуска отработал положенные 4 года и почил. Из-за сложностей контроля заряда-разряди литиевой АКБ поставил простой свинцовый. Он еще и к температурам не требователен.
Ну суть не в этом. Столкнулся с другой задачей: при падении напряжения питания контрллера ниже 4 в. он начинает перезагружаться и заново запускаться. Есть какой-то правильный способ увести его в сон или отключить до появления стабильных 5в. на питание?
Оживлю темку..
Схему в итоге я собрал, поставил правда АКБ свинцовый. Литиевый к моменту запуска отработал положенные 4 года и почил. Из-за сложностей контроля заряда-разряди литиевой АКБ поставил простой свинцовый. Он еще и к температурам не требователен.
Ну суть не в этом. Столкнулся с другой задачей: при падении напряжения питания контрллера ниже 4 в. он начинает перезагружаться и заново запускаться. Есть какой-то правильный способ увести его в сон или отключить до появления стабильных 5в. на питание?
Добрый день.
Подскажите Вы нашли решение проблемы, что бы не перезагружался Микроконтроллер?
Спасибо.
Решение вроде нашел, а вот как его реализовать - пока не совсем.
Можно уводить контроллер в сон. И затем пробуждать по прерыванию. Вот в сон я его уводить научился, а как пробудить, пока не пойму :) Даже не то, чтобы "не пойму".. Как обойтись штатными средствами, не задействуя реле. С помощью реле коммутацию понятно как можно сделать. А мне нужно, чтобы при понижении напряжения до определенного уровня, ардуина уходила в сон, а затем, при появлении напряжения вновь просыпалась. При этом напряжение на ноге, которая настроена на прерывание, имеется в процессе нормальной работы, пропадает лишь когда ардуину нужно увести в сон, и затем, как только напряжение появилось (на этой же ноге), ардуина должна проснуться. Вот как это сделать без реле - пока не допетрил. Скетч дома, как доберусь - выложу.
dr.lmg, думаете спящему МК питание совсем по барабану? Он так же глюканет как и не спящий. В меге есть встроенная фишка - супервайзер питания, браун-аут. Когда питание проседает ниже запрограммированного уровня (по умолчанию в ардуино уно -2,7вольта) супервайзер прижимает ресет к земле. Соответссно мк потребляет крохи, при 4 вольтах -примерно 1,5ма. При 1,8 в -примерно 100мкА. Так что ничего делать не нужно, всё уже предусмотрено производителем.
dimax, дело не в питании. Нужно лишь, чтобы мега корректно заснула, и когда питание восстановилось - так же корректно проснулась.
dr.lmg, так что вы ей предлагаете спать, без питания? Она отключится и всё. Хотя бы 2 вольта должно быть что б не отрубилась.
Питание естественно будет. В сон необходимо уходить, когда внешнее питание отключено, и заряд батареи достигает определенного значения. При возобновлении внешнего питания ардуино должен проснуться и начать работать.
Скетч для ухода в сон и просыпания я взял отсюда: http://arduino.ru/forum/obshchii/spyashchii-rezhim#comment-54855 с небольшими допилами под свой скетч.
По сути у меня вызов sleepNow() происходит из функции контроля разряда батареи. Достигли по напряжению определенного минимума - уходим в сон, и слушаем прерывания на 2 ноге по высокому сигналу. Однако на высокий сигнал она не реагирует, а вот почему - не пойму.
dr.lmg, а что собссно к 2 ноге подключено?
+5 в. с делителя по внешнему питанию.
Коллеги, какие есть мнения? Без реле, имея изначально высокий уровень на второй ноге, который при отключении внешнего питания практически падает в ноль, уходить в сон (не задействуя на это прерывания), а пробуждать именно при появлении высокого сигнала (возобновление внешнего питания) по прерыванию на второй ноге.
Если питание и прерывание подаются одновременно, то Ардуина не замечает, что произошло прерывание. Нужно сделать задержку между подачей питания и сигналом прерывания.