39

For solar & battery powered projects, decreasing power consumption is a necessity.

I know a little bit about using a timer and interrupt to put the microcontroller into sleep when it isn't doing anything.

I have also read that you can disable some peripherals to further save power.

Here is a page explaining these: Power Saving Techniques

My question:

  • What other techniques are there to save power?
  • Are there any libraries that make using these AVR features easier?
32

Note: I wanted to point out that, even though my answer was accepted, the reader (you) should really read Anindo's answer first if you really want to save energy with any Arduino board. Once you address those items in your design, then you should read my answer and worry about how to set the MCU into low power mode.

Having said that, there are several techniques to make an Arduino save power. I'll list a few and then point you to a page that explains them all in more detail.

  1. While the controller isn't doing anything important (between one read of a sensor and the next, for example), you can put the controller into one of the sleep modes below, with the command set_sleep_mode (SLEEP_MODE_PWR_DOWN). Next to each mode is the approximate power consumption of each mode.

    • SLEEP_MODE_IDLE: 15 mA
    • SLEEP_MODE_ADC: 6.5 mA
    • SLEEP_MODE_PWR_SAVE: 1.62 mA
    • SLEEP_MODE_EXT_STANDBY: 1.62 mA
    • SLEEP_MODE_STANDBY : 0.84 mA
    • SLEEP_MODE_PWR_DOWN : 0.36 mA
  2. Disable brown-out detection (the circuitry that turns off the controller when low voltage is detected).

  3. Turn off ADC (analog to digita conversion)

  4. Use the internal clock

Then, when you put the controller to sleep, you need to use one or more mechanisms below to wake up the controller and do something with it:

  • Wake up with a signal

  • Wake up with a timer

This is a summary I made from -

That article applies mostly to ATmega328P, but the technique applies to other Arduino compatible controllers as well. As TheDoctor said well, you will need to check the datashet to make sure your controller suports any of those techniques and how to do it more precisely.

  • 2
    Thank you for referencing my page www.gammon.com.au/power. Employing all techniques mentioned on it should enable you to consume around 100 nA (0.1 µA). Other techniques which can have a big impact are to run at a lower frequency, and a lower voltage. Plus what Anindo Ghosh said about not using voltage regulators. I made a Temperature and humidity sensor - battery powered which employs a lot of these techniques, which is still going strong, after a couple of years on batteries. – Nick Gammon Jul 3 '15 at 1:27
  • @NickGammon - To be fair, I think your excellent article deserved a better reference, so I edited my answer to that extent. Thank you for the great article - very clear and complete! And welcome to Arduino.SE. It's good to have you here. – Ricardo Jul 3 '15 at 12:33
24

Realistically, the biggest power waster on an Arduino board is the linear voltage regulator on it.

  1. As long as the microcontroller on the board, the LEDs, or any other peripherals, draw current, the linear regulator wastes power equal to difference between supply and board voltage x current drawn.

    So, a first fix would be to disconnect the power indicator LED on the board, and not use any of the other LEDs as far as possible. Second, supply the board with as low a voltage as possible that is just sufficient to power the on-board regulator.

  2. On the original designs, the voltage regulators used do not boast low quiescent current. This means even with nothing drawing power within the board, the regulator itself wastes a fair bit of power all the time it is on.

    An easy fix is to replace the on-board regulator with an LDO (low drop-out linear regulator) rated for extremely low quiescent current. Parametric searches on various vendor sites will yield likely substitutes.

  3. Even with the above steps, the Arduino board does not provide a mechanism to set the LDO into low-power mode, if the LDO chosen supports this. Power efficient designs typically use a "sleep mode" pin on voltage regulators to save a fair bit of energy - not an option here.

Even with all possible power saving modes and tricks applied at the microcontroller level, the Arduino simply is not designed to be an ultra-low-power device out of the box. Having experimented with several non-trivial applications, I have found that the best that is realistically achievable is some 10% to 30% power saving depending on application, since the voltage regulator and the LEDs are going to consume the rest anyway.

  • 2
    supply the board with as low a voltage as possible that is just sufficient to power the on-board regulator Or supply 5V through a hacked USB cable. – Anonymous Penguin Mar 20 '14 at 15:44
13

You could read through the 200-page datasheet, and then mess with some confusing bit shifts and registers, but I recommend this library: http://playground.arduino.cc/Code/Enerlib

Also, if you're using an Uno or any one with a usb-to-serial chip, you could disable that or remove it.

  • 3
    You should read through the data-sheet no matter what you're doing. – Connor Wolf Feb 19 '14 at 7:04
9

Once your project is working and you need to deploy to "production" environment, you can opt to replace the Arduino with a bare meta ATMega328 or any of the ATTiny family chips. This will get rid of all the power eaters on the Arduino board you don't need. I found:

  • Arduino board of 9V block battery - 56 mA
  • ATTiny85 bare on 8 MHz without sleep modes etc - 10 mA
  • ATTiny85 bare on 8 MHz in sleep mode - 0.03 mA

Some more information

Program an ATtiny with Arduino

ATTiny files for Arduino IDE

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.