Почему в спящем режими потреблении больше чем в активном
- Войдите на сайт для отправки комментариев
Сб, 09/03/2019 - 22:48
Приветствую! Столкнулся с такой проблемой, что в спящем режими потреблении больше чем в активном, с чем это может быть связано? скетч прилагаю
#define coin_amount 4 // число монет, которые нужно распознать
byte coin_value[coin_amount] = {1.0, 2.0, 5.0, 10.0}; // стоимость монет
String currency = "RUB"; // валюта (английские буквы!!!)
int stb_time = 10000; // время бездействия, через которое система уйдёт в сон (миллисекунды)
//-------НАСТРОЙКИ---------
#include "TM1637.h"
#define CLK 10
#define DIO 9
TM1637 disp(CLK, DIO);
int coin_signal[coin_amount]; // тут хранится значение сигнала для каждого размера монет
int coin_quantity[coin_amount]; // количество монет
byte empty_signal; // храним уровень пустого сигнала
unsigned long standby_timer, reset_timer; // таймеры
int summ_money = 0; // сумма монет в копилке
//-------БИБЛИОТЕКИ---------
#include "LowPower.h"
#include "EEPROMex.h"
#include "LCD_1602_RUS.h"
//-------БИБЛИОТЕКИ---------
LCD_1602_RUS lcd(0x27, 16, 2); // создать дисплей
// если дисплей не работает, замени 0x27 на 0x3f
boolean recogn_flag, sleep_flag = true; // флажки
//-------КНОПКИ---------
#define button 2 // кнопка "проснуться"
#define calibr_button 3 // скрытая кнопка калибровкии сброса
#define disp_power 7 // питание дисплея
#define LEDpin 6 // питание светодиода
#define IRpin 5 // питание фототранзистора
#define IRsens 14 // сигнал фототранзистора
//-------КНОПКИ---------
int sens_signal, last_sens_signal;
boolean coin_flag = false;
void setup() {
Serial.begin(9600); // открыть порт для связи с ПК для отладки
delay(500);
disp.init(); // инициализация
disp.set(3);
// подтягиваем кнопки
pinMode(button, INPUT_PULLUP);
pinMode(calibr_button, INPUT_PULLUP);
// пины питания как выходы
pinMode(disp_power, OUTPUT);
pinMode(LEDpin, OUTPUT);
pinMode(IRpin, OUTPUT);
// подать питание на дисплей и датчик
digitalWrite(disp_power, 1);
digitalWrite(LEDpin, 1);
digitalWrite(IRpin, 1);
// подключить прерывание
attachInterrupt(0, wake_up, CHANGE);
empty_signal = analogRead(IRsens); // считать пустой (опорный) сигнал
if (!digitalRead(calibr_button)) { // если при запуске нажата кнопка калибровки
Serial.print("Сервис");
///////////////////////////////////////////////////////////
delay(500);
reset_timer = millis();
while (1) { // бесконечный цикл
if (millis() - reset_timer > 3000) { // если кнопка всё ещё удерживается и прошло 3 секунды
// очистить количество монет
for (byte i = 0; i < coin_amount; i++) {
coin_quantity[i] = 0;
EEPROM.writeInt(20 + i * 2, 0);
}
Serial.print("Память очищена");
digitalWrite(disp_power, 1);
// tm1637.display(1111);
delay(500);
digitalWrite(disp_power, 0);
///////////////////////////////////////////////////////////
delay(100);
}
if (digitalRead(calibr_button)) { // если отпустили кнопку, перейти к калибровке
Serial.print("Калибровка");
break;
}
}
while (1) {
for (byte i = 0; i < coin_amount; i++) {
// tm1637.display(coin_value[i]);
Serial.print(coin_value[i]); // отобразить цену монеты, размер которой калибруется
Serial.print(currency); // отобразить валюту
last_sens_signal = empty_signal;
while (1) {
sens_signal = analogRead(IRsens); // считать датчик
if (sens_signal > last_sens_signal) last_sens_signal = sens_signal; // если текущее значение больше предыдущего
if (sens_signal - empty_signal > 3) coin_flag = true; // если значение упало почти до "пустого", считать что монета улетела
if (coin_flag && (abs(sens_signal - empty_signal)) < 2) { // если монета точно улетела
coin_signal[i] = last_sens_signal; // записать максимальное значение в память
EEPROM.writeInt(i * 2, coin_signal[i]);
coin_flag = false;
break;
}
}
}
break;
}
}
// при старте системы считать из памяти сигналы монет для дальнейшей работы, а также их количество в банке
for (byte i = 0; i < coin_amount; i++) {
coin_signal[i] = EEPROM.readInt(i * 2);
coin_quantity[i] = EEPROM.readInt(20 + i * 2);
summ_money += coin_quantity[i] * coin_value[i]; // ну и сумму сразу посчитать, как произведение цены монеты на количество
}
/*
// для отладки, вывести сигналы монет в порт
for (byte i = 0; i < coin_amount; i++) {
Serial.println(coin_signal[i]);
}
*/
standby_timer = millis(); // обнулить таймер ухода в сон
}
void loop() {
if (sleep_flag) { // если проснулись после сна, инициализировать дисплей и вывести текст, сумму и валюту
delay(500);
Serial.print(summ_money);
//////////////////////////////////////////////////////////
empty_signal = analogRead(IRsens);
sleep_flag = false;
}
// далее работаем в бесконечном цикле
last_sens_signal = empty_signal;
while (1) {
sens_signal = analogRead(IRsens); // далее такой же алгоритм, как при калибровке
if (sens_signal > last_sens_signal) last_sens_signal = sens_signal;
if (sens_signal - empty_signal > 3) coin_flag = true;
if (coin_flag && (abs(sens_signal - empty_signal)) < 2) {
recogn_flag = false; // флажок ошибки, пока что не используется
// в общем нашли максимум для пролетевшей монетки, записали в last_sens_signal
// далее начинаем сравнивать со значениями для монет, хранящимися в памяти
for (byte i = 0; i < coin_amount; i++) {
int delta = abs(last_sens_signal - coin_signal[i]); // вот самое главное! ищем АБСОЛЮТНОЕ (то бишь по модулю)
// значение разности полученного сигнала с нашими значениями из памяти
if (delta < 30) { // и вот тут если эта разность попадает в диапазон, то считаем монетку распознанной
summ_money += coin_value[i]; // к сумме тупо прибавляем цену монетки (дада, сумма считается двумя разными способами. При старте системы суммой всех монет, а тут прибавление
Serial.print(summ_money);
digitalWrite(disp_power, 1);
disp.displayInt(summ_money);
delay(500);
disp.clearDisplay();
/////////////////////////////////////////////////////////////
coin_quantity[i]++; // для распознанного номера монетки прибавляем количество
recogn_flag = true;
break;
}
}
coin_flag = false;
standby_timer = millis(); // сбросить таймер
break;
}
// если ничего не делали, времят аймера вышло, спим
if (millis() - standby_timer > stb_time) {
good_night();
break;
}
// если монетка вставлена (замыкает контакты) и удерживается 2 секунды
/* while (!digitalRead(button)) {
if (millis() - standby_timer > 2000) {
lcd.clear();
// отобразить на дисплее: сверху цены монет (округлено до целых!!!!), снизу их количество
for (byte i = 0; i < coin_amount; i++) {
lcd.setCursor(i * 3, 0); Serial.print((int)coin_value[i]);
lcd.setCursor(i * 3, 1); Serial.print(coin_quantity[i]);
}
}
}
*/
}
}
// функция сна
void good_night() {
// перед тем как пойти спать, записываем в EEPROM новые полученные количества монет по адресам начиная с 20го (пук кек)
for (byte i = 0; i < coin_amount; i++) {
EEPROM.updateInt(20 + i * 2, coin_quantity[i]);
}
sleep_flag = true;
// вырубить питание со всех дисплеев и датчиков
digitalWrite(disp_power, 0);
digitalWrite(LEDpin, 0);
digitalWrite(IRpin, 0);
delay(100);
// и вот теперь спать
LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF);
}
// просыпаемся по ПРЕРЫВАНИЮ (эта функция - обработчик прерывания)
void wake_up() {
// возвращаем питание на дисплей и датчик
digitalWrite(disp_power, 1);
digitalWrite(LEDpin, 1);
digitalWrite(IRpin, 1);
standby_timer = millis(); // и обнуляем таймер
}
Потребление чего и чем?
Потребления тока. к ардуино нано подключен тм1637, фотодиод и фототранзистор. В обычном режиме потребление 0.03 ( не знаю чего, поставил переключатель как на фото. Это милиамперы?), а когда уходит в спящий режим, потребление 0.08
Приветствую! Столкнулся с такой проблемой, что в спящем режими потреблении больше чем в активном
У вас устройство НИКОГДА не попадет в спящий режим. Скетч нерабочий. Код ваш или где-то накопипастили?
копипаст, переделал как смог под свой дисплей
вот оригинальный скетч
Ардуину в принципе нет смысла загонять в LowPower не снеся с неё 80% деталей.
Ардуину в принципе нет смысла загонять в LowPower не снеся с неё 80% деталей.
Не скажите, потребление снижается в разы, а если еще сделать эти действия, то вообще гуд https://www.youtube.com/watch?v=MmgMjlzpkfE&t=3s&index=3&list=LL1qffs-v9BeKv03Pi3dXq6w
Какие там разы??? На плате остаются линейный стабилизатор и USB-UART мост, они потребляют не меньше микроконтроллера.
Не скажите, потребление снижается в разы
если выкинуть ардуину и взять голую микросхему - потребление снижается в ТЫСЯЧИ РАЗ (абсолютно серьезно - с миллиампер до микроампер)
Так что ваши РАЗЫ - это абсолютно ни о чем. Какая разница, проработает девайс на батерейке один день или три, когда нормальное мобильное устройство должно работать месяцы и годы.
Какие там разы??? На плате остаются линейный стабилизатор и USB-UART мост, они потребляют не меньше микроконтроллера.
Хорошо, преувеличил, но сравнению без использовании режима сна и действий что на видео, можно добиться хорошего результата, если верить источникам)
Не скажите, потребление снижается в разы
если выкинуть ардуину и взять голую микросхему - потребление снижается в ТЫСЯЧИ РАЗ (абсолютно серьезно - с миллиампер до микроампер)
Так что ваши РАЗЫ - это абсолютно ни о чем. Какая разница, проработает девайс на батерейке один день или три, когда нормальное мобильное устройство должно работать месяцы и годы.
Это конечно хорошо, но желания возиться с голой МК - нет, да и не умею если на то пошло) Сейчас при потреблении 0.02 мА и емкостью аккумулятора 7500 мА/ч, все это должно проработать около 2 месяцев? или я не прав?
Сейчас при потреблении 0.02 мА и емкостью аккумулятора 7500 мА/ч, все это должно проработать около 2 месяцев? или я не прав?
При использовании готовой ардуины 0.02mA вы никогда не получите. Это абсолютно невозможно.
Похоже вы ошиблись и хотели написать 0.02А ? - то есть 20 мА. Это вполне похоже на правду.
Но в обоих случаях у вас с математикой явные проблемы. Для потребления 0.02мА с батарейкой 7500мАч девайс проработал бы 42 года, а в случае 20 мА = 2 недели.
Индикатор почаще гасите и не надо будет с псевдо-LowPower страдать. Саморазряд аккумулятора может быть гораздо сильнее, чем разница между потреблением во сне и в режиме работы. Тем более, что сон у вас в разы прожорливей вышел.
При использовании готовой ардуины 0.02mA вы никогда не получите. Это абсолютно невозможно.
Похоже вы ошиблись и хотели написать 0.02А ? - то есть 20 мА. Это вполне похоже на правду.
Но в обоих случаях у вас с математикой явные проблемы. Для потребления 0.02мА с батарейкой 7500мАч девайс проработал бы 42 года, а в случае 20 мА = 2 недели.
Так, переключатель я поставил как на фото
Показало 0.02, что это? И да, считал онлайн калькулятором
Что есть индикатор? Фотодиод и фототранзистор?
Какие там разы??? На плате остаются линейный стабилизатор и USB-UART мост, они потребляют не меньше микроконтроллера.
Вы даже ссылку на видео не глянули, а там сразу аж "три совета от гайвера". Я бы не стал спорить :)
Так, переключатель я поставил как на фото
Показало 0.02, что это? И да, считал онлайн калькулятором
Я не знаю, что вы меряли - я просто точно знаю, что опустить потребление покупной ардуины ниже 5мА нереально. То есть получить 0.02 вы не могли в принципе. Либо прибор неисправен, либо вы им пользоваться не умеете.
На фоне того, что вы 7500 на 0.02 не смогли правильно поделить даже на калькуляторе и ошиблись в 250 раз - ошибка с мультметром не удивляет.
Ухх, какие мы умные. В любом случае спасибо за попытку помочь
Ухх, какие мы умные. В любом случае спасибо за попытку помочь
умные или нет - это еще вопрос. А вот то, что возня со спящим режимом для готовой платы ардуино - вещь абсолютно бессмысленная - давно установленный факт.
Хотите мобильности - переходите на голые контроллеры. Это совсем не сложно.
ЗЫ кстати - то, что у вас в спящем режиме потребление больше, чем в активном - тоже может говорить о том, что вы просто неправильно измеряете
умные или нет - это еще вопрос. А вот то, что возня со спящим режимом для готовой платы ардуино - вещь абсолютно бессмысленная - давно установленный факт.
Хотите мобильности - переходите на голые контроллеры. Это совсем не сложно.
ЗЫ кстати - то, что у вас в спящем режиме потребление больше, чем в активном - тоже может говорить о том, что вы просто неправильно измеряете
Что может быть не правильного? Амперметр в разрыв цепи между ист. пит. и ардуйней?
На картинке выше выбран предел измерения 10 ампер, а не миллиампер. Цифра 0.02 означает 0.02 ампера, т.е. 20 миллиампер. И это очень грубое измерение. Мерять нужно на пределах 200m, 20m, 2000u
Тут чел смог ограничить потребление до 0.07 мА, так что не знаю о каких 5 мА вы говорите. Все тот же гайвер https://m.youtube.com/watch?v=lH4qfGlK2Qk&t=644s
Оо, хоть что то полезное, благодарю
Тут чел смог ограничить потребление до 0.07 мА, так что не знаю о каких 5 мА вы говорите.
Вы это видео внимательно смотрели? - там говорится, что для снижения потребления надо удалить с ардуино лишние детали. Реально у него на плате один контроллер и остается - как раз именно про это мы вам и талдычим.
Можно взять готовую ардуину и срезать с нее все лишнее, оставив только контроллер. А можно сразу взять голый МК
Тут чел смог ограничить потребление до 0.07 мА, так что не знаю о каких 5 мА вы говорите.
Вы это видео внимательно смотрели? - там говорится, что для снижения потребления надо удалить с ардуино лишние детали. Реально у него на плате один контроллер и остается - как раз именно про это мы вам и талдычим.
Можно взять готовую ардуину и срезать с нее все лишнее, оставив только контроллер. А можно сразу взять голый МК
угу, взять голый МК,я так понимаю что еще припаивать обвязку для прошивки, помоему с готовым все проще, не?
угу, взять голый МК,я так понимаю что еще припаивать обвязку для прошивки, помоему с готовым все проще, не?
А что есть обвязка для прошивки, в вашем представлении?
Может прошивка для обвязки?)
Ардуины разные бывают. Про Мини без светодиода и 78l05, но с nRF24L01 показывала 5 мка как то.
угу, взять голый МК,я так понимаю что еще припаивать обвязку для прошивки, помоему с готовым все проще, не?
А что есть обвязка для прошивки, в вашем представлении?
Сейчас нашел, посмотрел. Нужно несколько кондеров, кварц при надобности и резистор, разве игра стоит свеч?
это конечно не для прошивки, а для работы)
Если для работы, то достаточно одного конденсатора 0,1 мкф. И контроллера, ес-но.)
угу, взять голый МК,я так понимаю что еще припаивать обвязку для прошивки, помоему с готовым все проще, не?
Так, переключатель я поставил как на фото
Показало 0.02, что это? И да, считал онлайн калькулятором
Я не знаю, что вы меряли - я просто точно знаю, что опустить потребление покупной ардуины ниже 5мА нереально. То есть получить 0.02 вы не могли в принципе. Либо прибор неисправен, либо вы им пользоваться не умеете.
угу, взять голый МК,я так понимаю что еще припаивать обвязку для прошивки, помоему с готовым все проще, не?
Если весь девайс будет состоять из одной проминьки и изоленты, то да. А если делать плату, нахрена проминька?
Как раз, что он мерял, прекрасно видно на картинке: измерял ток на пределе 10А. Соответственно, получил 0.02А = 20 мА, что вполне логичо. Ну а то, что он не може отличить А от мА, это уже другое дело.
я думаю что и щуп не был переставлен на нужное место при измерении, так что там мерялось - загадка.
загадка.
Ну, почему сразу загадка? Никаких загадок - цена на прошлогодний овёс.
Вообщем разобрался с работой мультиметра :D Теперь потребление у меня меньше 2 мА, мне хватит) Проблема была строчке 207 в стартовом топике, я ее убрал и все гуд. Почему то при отключении питания с тм1637 ток возрастал.
Если для работы, то достаточно одного конденсатора 0,1 мкф. И контроллера, ес-но.)
Давайте уточним, кондер и резистор на резет, т.к. было дело без этого не стартовал, и по питанию один,(это уже два) если работаем без кварца. С кварцем желательно еще два пиковых на землю. Я так на резет еще и электролит 1-2 мкФ плюсом ставлю. или что не так?
Давайте уточним, кондер и резистор на резет, т.к. было дело без этого не стартовал, и по питанию один,(это уже два) если работаем без кварца. С кварцем желательно еще два пиковых на землю. Я так на резет еще и электролит 1-2 мкФ плюсом ставлю. или что не так?
давайте разделять понятия "я ставлю" и "необходимо". В реальных схемах я тоже много чего ставлю - но если говорить о минимальном наборе - то Атмега328, Тини85 и Тини13 у меня отлично работали в полном одиночестве - и без кондеров, и без кварца, и без подтяжки РЕСЕТа
Согласен большинство и у меня работало, без всего, но до поры до времени, а так гарантированно работает и не глючит.
угу, взять голый МК,я так понимаю что еще припаивать обвязку для прошивки, помоему с готовым все проще, не?
Pro mini рулит с ободранным обвесом особенно :)
Вообщем разобрался с работой мультиметра :D Теперь потребление у меня меньше 2 мА, мне хватит)
скорее всего опять в 10 раз ошибся при измерении. Если это Нано, из которой ничего не выпаивали - должно быть где-то 10-15 мА
скорее всего опять в 10 раз ошибся
Блин, ну только человек обрадовался, заулыбался, напитался положительными эмоциями, а тут пришёл поручик Ржевский ...
Вообщем разобрался с работой мультиметра :D Теперь потребление у меня меньше 2 мА, мне хватит)
скорее всего опять в 10 раз ошибся при измерении. Если это Нано, из которой ничего не выпаивали - должно быть где-то 10-15 мА
выпаяд стабилизатор, светодиод и отправил в спящий режим, думаете будет больше 2 мА?
Очень точное описание меня
выпаяд стабилизатор, светодиод и отправил в спящий режим, думаете будет больше 2 мА?
нет, если все это выпаял - то нормально. Если удалить еще USB - есть шанс получить ток, близкий к цифрам в видео Гувера
выпаяд стабилизатор, светодиод и отправил в спящий режим, думаете будет больше 2 мА?
нет, если все это выпаял - то нормально. Если удалить еще USB - есть шанс получить ток, близкий к цифрам в видео Гувера
USB, что?
USB, что?
отключить USB-UART
отключить USB-UART
Первый раз это слышу, не подскажете как?
Как раз, что он мерял, прекрасно видно на картинке: измерял ток на пределе 10А. Соответственно, получил 0.02А = 20 мА, что вполне логичо. Ну а то, что он не може отличить А от мА, это уже другое дело.
я думаю что и щуп не был переставлен на нужное место при измерении, так что там мерялось - загадка.
отключить USB-UART
Первый раз это слышу, не подскажете как?
Значить, рано тебе еще энэргию сберегать...
отключить USB-UART
Первый раз это слышу, не подскажете как?
Значить, рано тебе еще энэргию сберегать...
Эм, я что то заблудился, а на про мини, он хде?