Почему в спящем режими потреблении больше чем в активном
- Войдите на сайт для отправки комментариев
Сб, 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
Первый раз это слышу, не подскажете как?
Значить, рано тебе еще энэргию сберегать...
Эм, я что то заблудился, а на про мини, он хде?