Operating an Arduino for a Year from Batteries

The Arduino platform is a great product for producing a custom data collection system or controller.  Programming is easy via a high-level language and a simple USB connection to the Arduino board.  Incredible popularity has brought plenty of publicly available code and many add-on boards for interfacing sensors, storage, and wireless communications.  However, most of my projects involve collecting data for multiple months, and access to mains power is often problematic.  Battery-powered data collection is essential, but the Arduino quickly exhausts a battery when attempting to collect data for more than a few days.  This article describes a technique for extending the battery life of an Arduino for many months.

The Arduino Uno board draws about 42 mA assuming no power draw from sensors or other components needed in your system.  With a minimum supply voltage of 7 volts, the power consumption of the board is therefore 0.29 Watts.  Sleep Mode is possible, but the onboard voltage regulator still has a quiescent current draw of 10 mA even when the processor is asleep.  Assuming your task allows for sleeping most all of the time (like most of my data collection tasks), power consumption would be lowered to about 0.07 Watts utilizing sleep mode.  An Alkaline AA battery has about 2.5 Watt-hours of energy; using three of these would give a battery pack containing 7.5 Watt-hours of energy.  Ignoring voltage conversion losses, 7.5 Watt-hours of energy only powers the mostly-sleeping Arduino for 107 hours, a little over 4 days.

As the Sleep Mode article referenced above suggests, you can use the Atmega chip from the Arduino board on a custom board and use a much more efficient voltage regulator or possibly no regulator at all.  This approach combined with using Sleep mode could dramatically lower the power consumption of the system.  However, you then lose access to the numerous accessory shields available for the Arduino, and many of the ease-of-use advantages of the Arduino are lost.  For a data collection project I’m currently working on, I’ve chosen a different approach.  I am building a small power controller board that will only periodically apply power to the Arduino board, and then after the Arduino is done reading a sensor and wirelessly sending its data, the Arduino will signal completion of its tasks to the power controller and the controller will cut power to the Arduino.  All Arduino power consumption will be eliminated at that point until the next power-on cycle.  The power controller board itself will obviously use some energy, but using sleep mode for that microcontroller and powering the power controller circuit directly from the battery without a regulator will lower its power consumption during periods when the Arduino is not on to an average of about 11 microWatts.  A basic block diagram of the system is shown below.

Low Power Arduino Block Diagram

Basic Diagram of the Low Power Arduino System

If the one of the goals is maintaining the ease-of-use advantage of the Arduino, having to build a separate, custom power controller circuit seems to defeat that goal.  However, the power controller circuit can be used without re-design for a wide variety of Arduino projects.  The only power controller parameter that varies between projects is the length of time between each successive power up of the Arduino.

There are clearly some limitations with this approach.  If your application requires the Arduino to set outputs for control purposes, these outputs will be lost each time the Arduino is powered down.  So, this power-saving approach is really meant for data acquisition applications, not control applications.  Also, if you need to retain data or settings between each power-on cycle of the Arduino, you will need to use the EEPROM memory in the Arduino, as that memory is unaffected by loss of Arduino power.

So, what kind of battery life can be achieved with this strategy?  To answer this question, you need to know how long the Arduino will be powered up and how long it will be totally off.  For my current project, I need to read a sensor and wirelessly transmit the results every 10 minutes.  Each time the power controller circuit applies power to the Arduino, the Arduino has to boot up, read the sensor and then send the result via an Xbee radio.  I have measured the boot-up time for the Arduino Uno, which equals about 72 milliseconds.  (This is substantially faster than the earlier Arduino Duemilanove, which took a full 1.45 seconds to boot up.  Clearly if you intend to use this power-saving approach, you would want to use the fast-booting Uno model.)  Reading the sensor for my project will take about 10 milliseconds.  Until I measure more carefully the Xbee boot-up and transmit time, I will conservatively assume that the Xbee process pushes the power-on duration up to a full one second.

As well as knowing the Arduino duty cycle, you also need to know power consumption of the Arduino and accessories when it is On.  In my project, I will apply power to the Arduino through the 5V pin, so that I can avoid some of the voltage regulator losses on the Arduino board.  Adding in the sensor and Xbee power consumption, I estimate an average current draw of 70 mA during the period while the Arduino is powered up.  So, power consumption during the power-on time is 0.07 A x 5 V = 0.35 Watt.  But, the circuitry is only powered up for 1 second out of the 10 minute repeat interval, so the average power draw is 1 sec / 600 sec  x  0.35 W = 0.000583 W or 0.583 mW.  My custom power controller board produces the 5 volts necessary for the Arduino board through use of an 85% efficient boost switching power converter.  So, the 0.583 mW average power draw of the Arduino takes 0.583 mW / 0.85 = 0.686 mW from the battery on average.  Adding in the 11 microWatt draw of the custom power controller board gives a total power consumption of 0.697 mW.  With a 3 x AA Alkaline battery pack having 7.5 Watt-hours of energy, my project should see a 7,500 mW-hrs / 0.697 mW = 10,800 hour battery life, or about 15 months, a substantial improvement over the 4 day battery life achievable through the standard Arduino setup.

In this Later Post, I discuss the design of the Power Controller circuit.  Hopefully, I will also be able to report on actual use of the product in future posts.

NOTE:  A commercial product is now available from Adafruit that performs this power controller task.  See the Adafruit TPL5110 Low Power Timer Breakout product.

13 Responses to “Operating an Arduino for a Year from Batteries”

  1. riju Says:

    thanks for your post…iam currently doing a project where my barebone arduino would wake up once every week..transmit data..iam using RF modules.. 433Hz…measure the wear and tear of the a grinding mil. and then go back to sleep…do u know any way…where i can wake my barebone arduino say once a week???

    • Alan Says:

      In my other article that gives more details on the design of the power controller, “Design of the Extended Battery Life Power Controller for the Arduino”, there is the microcontroller source code for the controller. If you want to use this approach to determining when your arduino wakes up, all you need to do is set the “interval” variable in that code to a value of about 134,000 and change the data type of the variable to “int32” so it can hold this large value. That value will cause the power controller to apply power to the Arduino about once per week.

      • riju Says:

        can u pls post the link of your other article…and regarding source code..hwo did u come up the value 134,000..actually iam stil new to avr coding..it wil get better with time..can u pls post the backbone..or schematic of the code..so dat i can get an idea…thank you

  2. riju Says:

    ok i just scanned through your code..i wil hve a look at it closely..wanted to ask couple of queries..another guy is handling the coding section..iam just indirectly helping him with ideas..bascially in my prject there are 4 electrical wires..connected to lifter bar..where arduino would also be connected…those 4 wires lenght has been measured….and whenever dere will be any wear in the lifter bar..wires would be cut..and dat change in voltage would be measured..so those 4 wires would be connected to ADC pins..along with voltage source ground, and ofcoures pins for transmitter as well.. 90percent of the code is done..except the sleep mode..pwer saving is yet to be done..so what changes iwould i have to make on arduino code..if i add your power controller circuit…

  3. Testicus Says:

    your Xbee uses 3.3 volts, and your Arduino can also run on 3.3, however, at half it’s processor speed. which usually doesn’t make much of a difference to us “slow” humans anyway. an interesting idea and i like seeing it here, it validates my own insanity, thanks!

  4. Experiment 004 | subspacer.org Says:

    […] idea to [later] build power system – to reduce power consumption not unlike one suggested here and […]

  5. Chris Says:

    Remember that many batteries, especially rechargables, go flat all by themselves. You need to use “LSD” (low-self-discharge) batteries, like Eneloops, if you want power for 2+ months.

  6. Info sobre cómo darle autonomía a nuestro Arduino | arduino for fan Says:

    […] Operating an Arduino for a year from batteries (inglés) Este tipo nos cuenta su experiencia de cómo mantener un sistema arduino funcionando durante un año. […]

  7. myproject Says:

    Nice, I am working on samething for a project, when the device is idle for 5 minutes, it will signal the transistor latch circuit ad arduino power will be cut.

  8. BillSmith (@melanchton1) Says:

    Very interesting. I think though you might have made an assumption error (minimal, doesnt make much difference)
    7.5 Watthr for yr 3 alkaline batteries seems a bit high.
    Your 686mW comes down to about roughly 120mA.
    AA batteries have an average capacity of 1800mAh when discharged at 100mA or 1600 at 200mA discharge

    lets say that for 120mA1650 mAh
    So 3 cells have an energie of 4.5 * 1650mAh =7.45 Wh
    so far so good 🙂
    However, you will not be able to get all that energie out of your cells as your Arduino really needs a minimum of I think 1.8V.
    So in reality you only have 4.5-1.8=2.7 Volt range available. At 1.8 Volt there is still (theoretically) 2.97 Whr left. So you have 7.45-2.97=4.48 Whr available = 6427 hrs= 9months.

    Still, definitely more than 4 days ;-), but you need to remember to change the batteries in the fall, rather than the spring 🙂

    • Alan Says:

      Thanks for your comments, Bill. But, I don’t agree with latter part of your analysis. The 3 AA batteries are in series and feeding the input of a boost converter. The TI boost converters referred to in my article will work down to an input voltage of 2.3 V or less in some cases. At that input voltage, they still provide 5 V output to the Arduino. If the input voltage has fallen to 2.3 V due to battery discharge, each battery will be operating at a voltage of about 2.3 V / 3 = 0.77 V. When you discharge an AA battery from a starting voltage of about 1.6 V down to a ending voltage of 0.77 V, you have extracted virtually all of the energy out of the battery. I think a lot of load testing of AA batteries is done down to an ending voltage of 1.0 V, so operating down to 0.77 V gets all this energy and a bit more.

  9. judi banteng online Says:

    Good information. Lucky me I came across your website by chance (stumbleupon). I’ve book marked it for later!

  10. Carl-Erik Says:

    Just wanted to note that this still brings value 11 years later, so thanks for keeping it online!

    My off-grid mountain cabin in Norway has quite similar challenges to Alaska, I would presume, so interesting reading your blog, even if in a read-only state these days 😄

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

%d bloggers like this: