Arduino sleep time

Режимы сна и энергосбережение

Введение

Рано или поздно, в любом из проектов изобретатель сталкивается с проблемой автономности. Не всегда хочется держать подключенным к розетке устройство, которое большую часть времени работы ничего не делает. Например, для умной теплицы нужно время от времени получать данные о температуре, влажности и включать системы автополива. Но ведь абсолютно не обязательно получать измерения каждую секунду, вполне достаточно измерений раз в несколько минут, потому как погода (температура и влажность) и другие подобные показатели изменяются не быстро. И получается что больше 95% времени плата потребляет электричество впустую.

Режимы энергопотребления

Для подобных и аналогичных случаев существуют специальные режимы энергопотребления контроллера, которые позволяют значительно снизить энергопотребление платой во время простоя. Эти режимы называются режимами сна, и их несколько — названия и отличия приведены ниже:

Примеры работы с Arduino UNO

Как писать скетчи проще

Синтаксис описания перевода контроллера в сон и подключения прерываний довольно сложный, и зачастую вызывает появление ошибок и нежелание работать с этими режимами. Очень хорошо, что была написана дополнительная библиотека для ардуино, упрощающая подключение режимов и прерываний. Скачать библиотеку Sleep_n0m1 можно на ресурсе гитхаб или по ссылке ниже:

Пример 1. Самый простой ввод в сон

В данном примере демонстрируется введение контроллера в режима сна PWR_DOWN на заданное количество времени.

Работает скетч следующим образом. В основном цикле выполняются команды (в частности вывод надписей в сериал-монитор). Вы можете добавить свои команды, например, измерение температуры.

Для данного примера нам потребуется только контроллер. Результат работы мы сможем наблюдать в мониторе Serial-порта.

Пример 2. Просыпаться по прерыванию

В данном примере контроллер будет введёт в сон, пока не возникнет внешнее прерывание. Простейший способ вызвать прерывание, это послать любые данные в монитор сериал-порта. Выводы прерывания на контроллере Smart UNO — это цифровые выводы 2 и 4. Поэтому нужно взять один провод папа-папа и соединить цифровые выводы 0 и 2 на контроллере.

Загрузите скетч на контроллер:

После того как контроллер уйдёт в сон (информация об этом появится в мониторе Serial-порта), вывести его из сна можно только с помощью внешнего прерывания. Чтобы создать его искусственно, нужно передать в сериал-порт любую информацию, например, передать единицу:

После этого цикл loop запустится заново.

Пример 3. Просыпаться по будильнику часов

В данном примере формируется минипроект — часы с будильником. Часы показывают время на черырёхразрядном индикаторе. У устройства имеется кнопка — которая переводит контроллер в режим сна до следующей минуты, устанавливая на часах будильник на следующую за текущей минуту. Индикацией установки будильника служит появление на индикаторе надписи «ALAR» — от английского alarm (будильник). Для демонстрации того, что устройство находится в режиме сна, на дисплей выводится информация в виде четырёх тире (- — — -). По пробуждению, дисплей снова отображает время.

Библиотеки

Помимо библиотеки для работы с режимами сна, понадобятся библиотеки для часов и модуля индикатора. Их можно загрузить со страниц в Базе Знаний: Модуль часов PCF8563 и Модуль 4 — разрядного индикатора

Что нужно Кол-во, шт
Контроллер Smart UNO 1
Sensor Shield 1
Модуль часов PCF8563 1
Модуль 4-разрядного индикатора 1
Модуль кнопки 1
Шлейф «мама-мама» х4 1
Шлейф «мама-мама» х3 1
Провода мама-мама 5

Скетч для загрузки

© 2014-2022 УмныеЭлементы — DIY-электроника Arduino, компоненты для робототехники и электронных устройств. «УмныеЭлементы» (SmartElements) является зарегистрированным товарным знаком. Любое воспроизведение товарного знака допускается только с согласия правообладателя.

Источник

Спящие режимы в Arduino и как их использовать для экономии энергии

Потребляемая мощность является одним из ключевых аспектов функционирования непрерывно функционирующих устройств. Для решения этой проблемы практически все современные микроконтроллеры имеют спящий режим, что позволяет разработчикам проектировать различные электронные гаджеты с оптимальным потреблением энергии. Спящий режим переводит устройство в режим энергосбережения при помощи выключения неиспользуемых модулей.

В данной статье мы рассмотрим спящие режимы платы Arduino и продемонстрируем уменьшение потребления энергии в них с помощью амперметра. В англоязычной литературе для спящих режимов Arduino (Arduino Sleep mode) используют также термины Arduino Power Save mode (режим энергосбережения) и Arduino Standby Mode (режим ожидания).

Спящие режимы в Arduino

Спящие режимы позволяют пользователю остановить или выключить неиспользуемые модули, что может значительно уменьшить потребление энергии. Платы Arduino Uno, Arduino Nano и Pro-mini построены на основе микроконтроллера ATmega328P, который имеет в своем составе специальный детектор для мониторинга питающего напряжения во время спящего режима.

Всего в микроконтроллере ATmega328P есть шесть спящих режимов, показанных в следующей таблице.

Для задействования любого из этих спящих режимов нам необходимо установить бит спящего режима (sleep bit) в регистре управления спящим режимом (Sleep Mode Control Register — SMCR.SE). Доступны такие спящие режимы как Idle, ADC noise reduction, Power-Down, Power-Save, Standby и External Standby. Далее рассмотрим их более подробно.

Вывести плату Arduino из спящего режима могут внутренние или внешние прерывания, а также нажатие на кнопку сброса (Reset).

Idle Mode (холостой режим)

Для перевода платы Arduino в данный режим необходимо в ее биты SM[2,0] записать ‘000’. В этом режиме останавливает свою работу CPU (центральный процессор), однако интерфейсы SPI, TWI, USART, сторожевой таймер (Watchdog), счетчики (таймеры) и аналоговый компаратор продолжают работать. Режим Idle, в основном, останавливает CLKCPU и CLKFLASH. Плату Arduino можно вывести из этого режима с помощью внешнего или внутреннего прерывания.

Команда для Arduino на перевод ее в режим Idle выглядит следующим образом:

Источник

Tutorial:A guide to putting your Arduino to sleep

Please put some money in the tip jar by clicking on the donate button to support me so I can continue creating contend like this. P.S. please donate more than $1 as PayPal takes minimum $0.30 per transaction

Sometimes we are in a situation that requires us to put an Arduino in a place where plugging it in to the power grid is not an option. This happens often when we try to log information in a remote site, or only need to have your Arduino active at a specific interval/action.

In these cases putting your Arduino to sleep is the perfect thing to do. Their attention is only required for a short amount of time e.g. log data in a specific interval, or put out an alert when a predetermined event happens. In this tutorial we are going to experiment with putting your Arduino to sleep and see how to turn your Arduino back on.

This tutorial familiarizes you with the concept and has a small exercise to see what it takes to put an Arduino to sleep. In the next couple of blog posts (in 2 weeks or so) I will show post a couple a projects that will show you how to wake your Arduino using a sensor, or a Real Time Clock module (RTC).

MATERIALS NEEDED IN THIS TUTORIAL

What board to use?

In this tutorial we will be using the Arduino Uno just because it is an easier board to prototype on. In a real live project I would use an Arduino Pro Mini for this. The Arduino Uno and the Arduino Pro Mini have very similar characteristics, the Arduino pro mini has a lot less hardware to power (e.g. the USB portion, extra leds, and some other stuff) thus using a lot less power. This is the reason why the Arduino Pro mini is a better choice.

To give an example a Uno uses between 30-40 mA when awake and about 19 mA when asleep. The Pro Mini uses 25mA when awake and 0.57 mA when asleep. As every mA matters when hooking it up to a battery you can see that there is no contest and the Arduino Pro Mini is the winner.

Note: As a beginner Maker the Arduino Pro Mini might be a bit intimidating, but there is no reason for it. Yes you need to solder the headers onto the board, and you need a FTDI cable to upload your sketch, but other than that there are no major differences.

Sleep mode

When you look at the documentation of the ATmega328p (click this link for a copy of this document) processor used for both Arduino Uno and the Arduino Pro mini you notice there are many different sleep modes available. But in a real world scenario there is really only one mode that is useful; The Power down mode (SLEEP_MODE_PWR_DOWN).

When you put your Arduino to sleep it turns off all unnecessary components, reducing the power consumption of the MCU (Microcontroller Unit). In this mode the only way you can wake it up is the use of an external influence (e.g. we give it a nudge to wake up). We will examine how to do this a bit later in this tutorial.

Interrupts

Before we go into the code to put an Arduino to sleep we need to understand the interrupt concept. The best way to describe it is ; You are working on something you really need to concentrate on. You wear headphones blasting your music loud to drown out your surrowndings . You are so concentrated on this that the outside world is lost to you. The only way to get your attention is by giving you a nudge. After you receive this nudge you pay attention to what the interruption is about, and after dealing with it you put the music back on and continue with your task.

Note: I am not going to go to deep into what interrupts are good for, but if you want to learn more about this concept check out my tutorial (Using Interrupts to improve the functionality of your project) on this topic

Most true Arduino’s have a couple of pins that do just that. The Uno and the Pro Mini have 2 pins (d2 and d3) that have the capability to interrupt what the Arduino is doing. With this we can nudge the Arduino back to a waking state.

Putting your Arduino To Sleep

Let’s look at the code for this section

Image_1 click to enlarge

Image 1 contains the code snippet that loads the library that contains everything we need to put your Arduino to sleep, We also declare the variable interruptPin for digital pin 2. We will later use this for making pin 2 an input pin. Next we will look at the Setup() function.

Image_2 Click To Enlarge

Image 2 has the code for the Setup() function. It is all straight forward. We declare digital pin 13 as an output pin (LED_BUILTIN is a build in variable for digital pin 13 where an onboard led is connected to). We are using the LED as an indecator for when the Arduino is asleep (when LED is on Arduino is awake, when off the Arduino is asleep).

On line 18 we set digital pin 2 as an input pin. You notice we use INPUT_PULLUP instead of INPUT. By doing this we use the build-in pull-up resistor to prevent the pin from flopping between HIGH and LOW when nothing is attached to it (same thing you would do with a button).

Next we are going to the main loop() function;

On line 23 we put in a delay of 5 seconds before we call the Going_To_Sleep() function on line 24. This is just so you can see that the onboard LED is on to show your Arduino is awake, and the moment we call this the Going_To_Sleep() function the LED goes off to indecate the Arduino is asleep.

Next lets look at the Going_To_Sleep() function itself;

Image_4 Click To Enlagre

On line 28 we call the sleep_enable() function which is part of the avr/sleep.h library. It enables us to put the Arduino to sleep, without calling it we can’t put the Arduino to sleep. On line 29 we attach an interrupt to pin 2 as I explained in the Interrupt section.

attachInterrupt (interrupt, ISR, mode);

As you notice we use a 0 to indicate that we are using pin 2. This is because the Arduino Uno/Pro Mini have 2 interrupts. Interrupt 0 is connected to digital pin 2, and Interrupt 1 is connected to digital pin 2. The ISR is the function name that is called when the interrupt is called. In our case it is called wakeUp. The mode is what needs to happen to the digital pin to call the interrupt. In our case the pin needs to be pulled LOW (to GND).

On line 30 we set the set of sleep mode we want. In our case it goes and shuts down everything it can. On line 31 we turn off the LED, and on line 32 we wait a second to give the board the time to turn the led off. Next we actually put the Arduino to sleep with the sleep_cpu() function.

The code halts here until the interrupt is called. After waking up the Arduino will first execute the code in the wakeUp() function and then will continue with line 34 printing the wakeup message on the serial monitor, and on line 35 turning the LED back on.

Источник

Adblock
detector