Arduino.ru
спящий режим
Люди добрые, помогите!
Пишу программу на мегу 2560, для авто. Очень нужен спящий режим, с выходом из него по прерыванию.
Help, как вывести из спячки мегу?
По ее мотивам переписал код для вас. Проверить не на чем пока, должно работать:
Почему при нажатии кнопки (wakePin = 2;) во время бодорствования Arduino UNO зависает?
Чуть переделанный мною код для пробуждения не только по кнопке, но и по WDT.
Можно корректный пример перевода, просыпания ардуины в спящий режим. Все что сдесь есть работает некорректно. Либо намертво засыпает, либо работает через раз и засыпает намертво(((
вот 100% работающий код (вчера был загружен в две платки для тестов):
P.S. watchdog используется? В этом случае возможны такие проблемы со стандартным загрузчиком: https://geektimes.ru/post/255800/
Облазил пол интернета и фиг
Облазил пол интернета и фиг
если у вас есть программа Arduino, то у вас уже есть эта библиотека.
Доброго времени суток. Подскажите, как на Ардуино нано(Atmega328p) сделать следующее: уходить в сон по нажатию кнопки и просыпаться по нажатию той же кнопки(подключенной к D2) и по таймеру, если в ходе обработки прерывания от таймера выполнилось условие равенства между моими константами и данными прочитанными по SPI, то необходимо выйти из сна и запретив прервания перейти к выполнению основной программы.
А какое потребление енергии в спящем режиме ардуины? можно ли приравнять к отключеному питанию?
Использование режима сна для экономии энергии
http://www.gammon.com.au/power
А каким образом можно реализовать не спящий режим а отключение питания (почти полностю), принцип как в электронных устройствах, плеерах, мобилках, чтоб при нажатии допустим 5с включался аппарат и при таком же нажатии вырубался.
а с чего ты взял, что они полностью выключаются? Там скорее всего такой же сон, с микроамперным потреблением.
Но если очень надо, то можно и полное отрубание.
Вот схема на реле:
Посоветуйте пожалуйста как лучше сделать. Нужно сделать чтоб ардуина просыпалась по внешнему сигналу, и по времени. С внешним сигналом я разобрался, а вот с таймером возникли вопросы. Во всех примерах пробуждения во Watсhdog-у используются корткие интервалы (от миллисекунд до десятков секунд), мне же нужны интервалы поболее (1ч. 2ч. 4ч. 8ч. и 16ч.). Всвязи с этим встаёт резонный вопрос, можно ли настроить сторожевой таймер на такие интервалы, и если да, то будет ли это правильно. Или рациональней будет использовать часы реального времени?
сторожевой таймер имеет максимальный интервал 8 сек.
Но никто тебе не мешает завести переменную, куда каждые 8 сек записывать приращение на единичку.
Как только значение переменной превысит 450/900/1800/3600,значит пора просыпаться
О! Спасибо за подсказку. Отличная идея, а то у меня на ардуинке всего 3 ноги свободных осталось, и с часами реального времени будет проблемка.
сторожевой таймер имеет максимальный интервал 8 сек.
важно понимать, что 8сек относятся именно к atmega328, у других МК надо даташит смотреть, может быть меньше
здесь дело такое. просыпаться по времени можно от обычного таймера, но обычный таймер требует использования менее экономного режима сна, т.е. если пробуждаться от обычного таймера потребление во время сна будет в разы больше
watchdog изначально придуман для другого поэтому не расчитан на длительное время между прерываниями, но его фишка как раз в том что для его работы требуется меньше энергии
НО. если RTC уже есть и они уже жрут свои микроватты энергии, то просыпание по RTC позволит сэкономить еще чуточку, ибо хоть watchdog есть мало, но все равно ест. Если его отключить то можно довести потребление во сне до почти абсолютного минимума, особенно если еще все остальное отключить (в частности детектор низкого напряжения)
RTC нету, но скорее всего придётся ставить. Так как нужно определять время сработки датчика. Я на каком то форуме, недели 2 назад читал что у часов можно запрограммировать какой то выход, чтоб на нём раз в час менялся лог. уровень. Буду весьма признателен если кто нибудь подскажет как, и где можно посмотреть пример использования RTC для этих целей. Облазил пол инета и ни где ни чего вразумительного не нашёл.
Ds3231 имеет два будильника, можно на конкретное время настроить
PCF8563, это RTC с таймером. Таймер весьма гибок (256 отсчетов от
2мкс до 1 мин на отсчёт), выход таймера настраивается (изм. лог. уровня / импульс), низкое потребление (
500 nA). Подробности в техдоке.
Использую весьма давно.
какой минимальный ток потребления удавалось достичь?
а если остальные ноги нагружены чемто, то тогда как с величиной потребления кристала по питанию?
Насчёт минимального потребляемого тока.
Экспериментировал с Digispark.
На этой плате три пассивных потребителя энергии:
— светодиод питания: выпаял его резистор;
— подтягивающий резистор, обеспечивающий работу с USB: переставил его и подпаял пару проводков, чтобы их замыкать при заливке скетчей.
Получилось вот так:
За основу кода взял пример отсюда.
Код подкорректировал по своему разумению, получилось так:
С этим скетчем Digispark выходит из спящего режима по Watchdog или по высокому уровню на третьем пине.
То есть тысячу миллиампер-часов энергии плата съест в этом режиме за 16 лет.
Продолжил эксперименты со спящим режимом в Digispark. У меня в нём навернулся загрузчик (сам не понял, почему). Я восстановил его, подробнее здесь. Теперь с загрузчиком micronucleus-1.06.hex минимальный ток составляет 28 мкА (что тоже неплохо).
Кстати, как я понял, для экономного спящего режима нужно отправить (digitalWrite) перед засыпанием на использовавшиеся пины уровень LOW.
Вернул энергопотребление Digispark на уровень 7 мкА. Для этого прошил загрузчик micronucleus-1.06.hex (см. ссылку на моё описание этого процесса в предыдущем посте), но с другими значениями fuses. Фрагмент моего файла boards.txt:
Здесь отключены детекторы низкого напряжения питания.
Как оказалось, включение «Brown-out Detector trigger level» на уровень 2.7 В (BODLEVEL1) увеличивало энергопотребление в SLEEP_MODE_PWR_DOWN режиме с 7 до 28 мкА.
7мка для голой атмеги многовато. У меня беспроводной сенсор, состоящий из МК, трех I2C датчиков, передатчика NRF24L01 и DC-DC преобразователя, в периоды, когда все это хозяйство включено, но «спит», потребляет 4.5мка.
7мка для голой атмеги многовато. У меня беспроводной сенсор, состоящий из МК, трех I2C датчиков, передатчика NRF24L01 и DC-DC преобразователя, в периоды, когда все это хозяйство включено, но «спит», потребляет 4.5мка.
можете пример привести что и как использовали?
У меня менее пары милиампер чтото не получалось на 328, хотя паял только проц на отдельной плате.
Так с мегой вообще ничего не нужно делать. Все, что требуется, она сама с рождения умеет:
Остается только внимательно все поотключать перед отправкой в сон, снизить тактовую и пусть она дремлет на наноамперах.
Моя Ардуина, с которой я так долго воевал, сейчас потребляет в спящем режиме 0,7 мкА. Добился такого так:
Вместо WatchDog-а использую часы реального времени, пробуждение происходит по прерыванию которое генерится часами (будильником).
В Атмеге при уходе в сон, отключается всё что может отключаться.
На плате Ардуино про мини, отпаял практически всю обвязку контроллера (светодиоды, стабилизатор на 3,3v, оставил только саму Атмегу, кварц с двумя кондёрами на 22пФ, подтягивающий резитор на ноге Reset (увеличил с 10к до 220к) и кондёр для формирования импульса сброса при программировани.
При уходе в сон, тактовая частота понижается до 1мГц, а напряжение питания Ардуины, падает практически до предела 1,9v (предел по даташиту 1,8v, хотя мне попадались образцы, прекрасно работающие и на 0,7v.
Отключаются все элементы схемы кроме МК и одного датчика (приёмник-пришлось купить японский с потреблнием 1,2мкА, и доработать его под собственные нужды, нужен он чтоб постоянно слушать эфир. Когда кто нибудь подходит с передатчиком он будит МК и последний ждёт кодовой посылки).
Все датчики, кроме дымового я использовал типа «сухой контакт» без всяких микросхем, диодов и т.д. Дымовой датчик установил изотопный, ток потребления у него в рабочем состоянии 0,4мкА в состоянии «Пожар» 5мА.
Вот и все хитрости.
З.Ы. вся схема в итоге потребляет около 2,5мкА в спящем режиме, а у моей схемы это основной режим.
Вы либо что-то путаете, либо неправильно измерения производили. От 0.7в атмега не будет работать в принципе. Скорее всего паразитное питание откуда-то заходило. Например, от программатора.
Тоже что-то совсем необычное. Какие-то данные по модели этого приемника вы можете озвучить?
Пришёл к выводу, что для моей поделки потребуется Pro Mini, а Digispark не подойдёт (у него всего одно прерывание, его не хватит). В связи с этим просьба к знающим людям: не могли бы вы привести образец скетча, который бы переводил Pro Mini с Atmega328p в режим SLEEP_MODE_PWR_DOWN с минимальным энергопотреблением (понятно, что лишнюю обвязку я с платы уберу) и обеспечивал бы всего две вещи:
— выход из сна через, например, 2*8=16 секунд;
— выход из сна подачей высокого уровня на INT0 или INT1.
Viktor1306, а можно полюбопытствовать чем и как вы измеряете микроамперы? Задача то нетривиальная
Как раз то, что надо, спасибо! Буду пробовать.
По первому вопросу, да, возможно заходило с программатора, возможно в схеме вместо конденсатора был ионистор запаян. Давно это было, достался нам пакет Атмег, штук 2000 или больше, вот мы над ними и издевались.
Мультиметром конечно, а чем их ещё меряют? Не линейкой же Мультиметр дорогой, не китайский за 250р. Я думаю, ему можно верить.
А как, ставлю мультиметр на 2000 мА, подключаю его последовательно с тем где хочу померить ток, и источником питания. Жду минуту, чтоб закончились все переходные процессы. И начинаю на мультиметре плавно уменьшать значение, так дохожу до микроамперов.
Снижение потребления питания Arduino через спящий режим
Рассмотрим методы снижения энергопотребления Arduino с использованием библиотеки LowPower.h и создадим маломощную систему отслеживания влажности и температуры в качестве примера.
Мы также поговорим об аппаратных модификациях и программных ресурсах, доступных для резкого энергопотребления в UNO, NANO и Pro-Mini. Мы уделим особое внимание Arduino UNO и сделаем выводы по энергопотреблению каждой платы. И, конечно, обсудим использование спящего режима для снижения энергопотребления.
Модификации оборудования
Некоторые проекты Arduino предназначены для работы вдали от линий электропередач, в связи с чем мы используем батарею или солнечную энергию, что немного усложняет любой проект.
Если вы запускаете свой проект от источника питания 12 В, то он потребляет более 50 мА тока. Понизив напряжение до 9-вольтовой батареи, вы можете уменьшить потребляемый ток примерно до 33 мА. При этом вы будете часто менять батарейки, что не очень удобно, если вы делаете автономный проект.
Но вы можете внести изменения в оборудование, чтобы уменьшить потребление тока.
Например, учитывая, что светодиод может потреблять до 2 мА, вы можете полностью удалить все светодиоды.
Кроме того, питание подключенных устройств через порт ввода-вывода (I/O, Input/Output) позволяет выключать устройство, когда оно не используется.
В демо-проекте я подключил датчики влажности к портам ввода-вывода для подачи питания и включаю их только тогда, когда мне нужно снимать показания. Это снижает энергопотребление и увеличивает срок службы датчика влажности.
Однако некоторые устройства не могут быть выключены в режиме ожидания. Например, если у вас есть устройство для чтения SD-карт, оно не позволит вам выключить его, а затем снова включить с помощью порта ввода-вывода.
Кроме того, некоторые устройства, такие как часы реального времени (RTC), должны оставаться включенными, и вы должны знать о текущих ограничениях порта ввода-вывода (примерно 40 мА).
В Arduino используется линейный регулятор напряжения, который необходим, но не очень эффективен. Поскольку встроенный регулятор мощности неэффективен, его легче обойти. Линейный регулятор принимает любое дополнительное напряжение и рассеивает его в виде тепла.
Таким образом, при работе вашего Ардуино Уно от батареи 9 В регулятор превращает лишние 4 В в тепло. При этом около 44% энергии расходуется на тепло, и даже больше, если вы используете источник питания 12 В.
Показанное ниже устройство представляет собой понижающий преобразователь DROK DC 4.5-24, который значительно более эффективен, чем линейный регулятор, используемый на UNO.
Схема должна работать с любым понижающим преобразователем, который имеет выход 5 В или 3,3 В, что дает дополнительное преимущество, поскольку вы можете отключить выходную мощность, просто заземлив желтый EN (включить) вывод.
Обратите внимание, что выход идет на штекер 5 В от понижающего преобразователя. Если вы решите запустить Arduino на 3,3 В, используйте также подключение 5 В. Когда вы обходите разъем питания, вы также обходите диод обратной полярности, поэтому убедитесь, что вы правильно сориентировали провода.
Библиотека низкого энергопотребления Ардуино
Мониторы влажности и температуры в первую очередь предназначены для использования вне помещений, поэтому от них требуется повышенная энергоэффективность.
Процессоры, используемые в Arduino, предназначены для использования многих технологий энергосбережения. Но здесь мы будем говорить о библиотеке Ардуино под названием «Low Power» от Rocket Scream Electronics:
Поскольку обычно мы работаем с периодической выборкой, библиотеку LowPower Arduino можно настроить на отключение определенных процессов и даже выключение процессора по мере необходимости для экономии значительного количества энергии.
Ниже приведены результаты добавления библиотеки Low Power Arduino в программу Blink. Они получены от идентичных Arduino Uno, работающих от 12 В с помощью встроенного регулятора и от 12 В с понижающим преобразователем.
Без Low-Power | С Low-Power |
12В с бортовым стабилизатором напряжения = 50 мА | 12В с бортовым стабилизатором напряжения = 45 мА |
Понижающий преобразователь 5 В = 27 мА | Понижающий преобразователь 5 В = 25 мА |
Понижающий преобразователь 3,3 В = 10 мА | Понижающий преобразователь 3,3 В = 8 мА |
Продолжительность сна может быть установлена на 15 мс, 30 мс, 60 мс, 120 мс, 250 мс, 500 мс, 1 секунду, 2 секунды, 4 секунды или 8 секунд. Как показано далее, существуют методы увеличения продолжительности сна намного дольше 8 секунд.
Устройство отслеживания температуры и влажности с низким энергопотреблением
Теперь перейдем к созданию нашего устройства мониторинга температуры и влажности на Ардуино с низким потреблением питания.
Компоненты
Для реализации нашего демо-проекта нам понадобятся следующие компоненты:
Для устройства мы будем использовать часы реального времени, чтобы добавить дату и время ко всем данным, которые мы будем сохранять в EEPROM.
AT24C256 поставляется с предварительно запрограммированным на заводе шестнадцатеричным адресом 0x50.
Схема соединения
EEPROM
Мы будем использовать EEPROM (electrically erasable programmable read-only memory или электрически стираемую программируемую постоянную память) для хранения наших данных.
В качестве альтернативы мы могли бы использовать устройство для чтения SD-карт. Однако для устройства чтения SD-карт требуется около 30 мА, и оно будет потреблять больше энергии, чем весь проект.
EEPROM лучше всего подходит для хранения данных в удаленных местах. Они маленькие, надежные, потребляют меньше 3 мА при записи в них, недорогие, а главное энергонезависимые. Схема адресации позволяет подключать до 8 устройств к шине I2C.
AT24C256 поставляется с предварительно запрограммированным на заводе шестнадцатеричным адресом I2C 0x5 с тремя дополнительными контактами адресации, которые можно изменить, A0, A1 и A2.
С тремя дополнительными двоичными входами (A0, A1, A2) вы можете создать адреса для 8 дополнительных EEPROMS в сети I2C.
Поскольку мы будем использовать только один чип для хранения, мы установим последние 3 бита адреса (A0, A1, A2) на низкий уровень.
Контакты SCL и SDA будут подключаться к A4-SDA и A5-SDA на Arduino Uno, Arduino Nano и Arduino Pro Mini.
На Arduino Pro Mini должны быть добавлены контакты A4 SDA и A5 SCL, а RTC и EEPROM подключаются к шине I2C.
Программа для устройства
Код для записи данных
Операторы #include загружают необходимые библиотеки датчиков DHT, библиотеку LowPower, Wire.h для шины I2C, модуль EEPROM и библиотеку часов реального времени.
DHTPIN подключен к выводу 5; вам нужно раскомментировать строку, которая определяет, какое устройство вы используете (DHT 22) в этом примере.
В функции setup() включен последовательный порт и подтверждена функция часов реального времени. Обратите внимание на строку //rtc.adjust(DateTime(F(DATE), F(TIME))); так как она используется для установки RTC по отношению к часам, которые использует ваш компьютер.
Её нужно один раз раскомментировать, а затем загрузить, чтобы установить часы. После того, как вы сбросили часы, снова вставьте комментарий и перекомпилируйте код. Последние две строки в настройке включают датчик DHT и включают шину I2C.
Использование EEPROM.update сначала делает проверку и записывает, только если данные отличаются от тех, которые, возможно, уже были записаны по этому адресу ранее. Это предотвращает запись одних и тех же данных, т.е. если данные не изменились, то не надо их перезаписывать. Поскольку вы можете писать только ограниченное количество раз, то это способствует долговечности устройства. В ячейки памяти можно записывать примерно 100 000 раз.
После записи в первый адрес «0» адрес увеличивается, и следующая ячейка может быть записана в «1». Обратите внимание, что мы записываем ровно 6 блоков данных для каждой выборки.
Функция LowPower имеет максимальное ограничение в восемь секунд. Мы настроили цикл for для 100-кратного прохождения этапа LowPower, что дало нам задержку чуть более 13 минут. Время можно увеличивать или уменьшать, чтобы учесть любое время выборки, которое вы хотите использовать.
Код для чтения данных
Код для стирания EEPROM
Результаты проекта
Arduino Uno: 3,3 В постоянного тока, 5 В = 17,1 мА в спящем режиме, 26,9 мА в рабочем режиме.
Arduino Nano: 3,3 В, 11,1 мА в спящем режиме, 16,9 мА в режиме работы.
Любой из этих примеров может питаться от литиевой батареи и заряжаться от небольшой солнечной панели.
Режимы сна и энергосбережение
Введение
Рано или поздно, в любом из проектов изобретатель сталкивается с проблемой автономности. Не всегда хочется держать подключенным к розетке устройство, которое большую часть времени работы ничего не делает. Например, для умной теплицы нужно время от времени получать данные о температуре, влажности и включать системы автополива. Но ведь абсолютно не обязательно получать измерения каждую секунду, вполне достаточно измерений раз в несколько минут, потому как погода (температура и влажность) и другие подобные показатели изменяются не быстро. И получается что больше 95% времени плата потребляет электричество впустую.
Режимы энергопотребления
Примеры работы с Arduino UNO
Как писать скетчи проще
Синтаксис описания перевода контроллера в сон и подключения прерываний довольно сложный, и зачастую вызывает появление ошибок и нежелание работать с этими режимами. Очень хорошо, что была написана дополнительная библиотека для ардуино, упрощающая подключение режимов и прерываний. Скачать библиотеку Sleep_n0m1 можно на ресурсе гитхаб или по ссылке ниже:
Пример 1. Самый простой ввод в сон
В данном примере демонстрируется введение контроллера в режима сна PWR_DOWN на заданное количество времени.
Работает скетч следующим образом. В основном цикле выполняются команды (в частности вывод надписей в сериал-монитор). Вы можете добавить свои команды, например, измерение температуры.
Для данного примера нам потребуется только контроллер. Результат работы мы сможем наблюдать в мониторе Serial-порта.
Пример 2. Просыпаться по прерыванию
Загрузите скетч на контроллер:
После того как контроллер уйдёт в сон (информация об этом появится в мониторе Serial-порта), вывести его из сна можно только с помощью внешнего прерывания. Чтобы создать его искусственно, нужно передать в сериал-порт любую информацию, например, передать единицу:
После этого цикл loop запустится заново.
Пример 3. Просыпаться по будильнику часов
Библиотеки
Скетч для загрузки
Arduino сон по таймеру
Ваша корзина пуста!
Зачем нужен watchdog (сторожевой таймер)?
Сторожевые таймеры используются, чтобы исключить пзависания в электронных устройствах. Для этого физический таймер работает параллельно программе и запускает прерывание, которое может перезагрузить микроконтроллер, если он достигает заданного значения. При нормальной работе таймер регулярно сбрасывается на ноль в цикле программы, но если код зависает, циклический сброс таймера не происходит, и watchdog сработает и запустит подпрограмму (например с перезагрузкой), которая может решить проблему.
Использование сторожевого таймера для предотвращения сбоев в Arduino UNO
Например, следующий код перезагрузит Arduino UNO после выполнения секции setup и нахождения в секции loop на протяжении 15 мс (вы увидите мигание светодиода на 13-м пине каждый раз, когда контроллер будет пробегать через setup при каждой автоматической перезагрузке контроллера):
Для избежания перезагрузок Arduino UNO во время нормальной работы вашей программы, нужно постоянно в каждом цикле loop вызывать функцию wdt_reset(); для обнуления сторожевого таймера.
Как использовать watchdog для экономии энергии
Существуют и другие задачи, для которых сторожевой таймер Arduino может быть полезен. В частности, при его помощи микроконтроллеры Arduino, могут переводиться в режимы ожидания с низким энергопотреблением. Управление режимами с низким энергопотреблением изначально осуществляется через битовые регистры, но мы возьмем уже готовые функции, которые облегчат нам работу.
Но для стабильного просыпания удобно использовать именно watchdog. Это можно сделать, например, с помощью следующей программы, в которой было предпринято несколько дополнительных мер для экономии энергии, таких как отключение АЦП.
Здесь можно увидеть объявления библиотек общего назначения для детального управления поведением микроконтроллера. Поскольку требуется более конкретное поведение, становится необходимым начать копать в таблице данных и битовых регистрах, чтобы получить полный контроль над микроконтроллером.
Использование watchdog для предотвращения зависаний и энергосберегающего режима вместе
Мы научились использовать сторожевой таймер, чтобы избежать зависаний кода и перевести Arduino в режим минимальной мощности. Мы также можем использовать обе функции в одной программе, используя немного больше кода в функции ISR (). Это именно то, что делает следующий пример.
Выводы
Теперь вы можете использовать сторожевой таймер Arduino для предотвращения зависаний и экономии энергии. Поскольку детальное назначение сторожевого таймера максимально доступно показано в программе, вы легко сможете адаптировать код под свои нужды. Например, если вам нужно отправить какой-либо контент в Интернет и некоторые операции требуют некоторого времени, вы можете вызывать следующий код перед каждой трудоемкой операцией.
Это нужно для разрешения операции выполняться на протяжении нескольких полных циклов таймера (здесь, 5 * 8 = 40 сек).