How to estimate and improve battery life in low-power IoT devices: a current budget table, a worked example, the hidden leakers in sleep mode, shortening radio and GPS active time, and how to measure bursts correctly.
A datasheet line that says "2 µA in deep sleep" tells you very little about how long a product will run on its battery. What matters is the average current over a whole cycle: a long stretch at a tiny current, plus a short burst at a current thousands of times larger. Add those up honestly and the burst usually dominates. Teams that spend weeks shaving a microamp from the sleep state, while the radio stays on a second too long, are optimising the wrong end.
The cure is a current budget: a table, written before the hardware is frozen, that lists every state the device passes through, how much current it draws and for how long. It costs an afternoon and it settles most arguments.
List every state in one cycle, in order: deep sleep, wake and boot, sensor power-up and read, radio start and connect, transmit, wait for acknowledgement, post-processing, back to sleep. For each, write the current and the time. Then compute the charge per cycle (current times time) and add the states up.
An illustrative example, with made-up but plausible numbers. A device reports once a minute. It sleeps at 5 µA, and wakes for 100 ms at an average of 20 mA to read a sensor, connect and send a short message.
A 1000 mAh battery would last about 26,000 hours, nearly three years, before you derate it. Derating matters: usable capacity falls at low temperature and at high pulse currents, the battery self-discharges, and the device stops working above the cut-off voltage, not at zero. Planning on 60 to 70 percent of the nominal capacity is a reasonable start, which here gives about two years.
The useful lesson is in the split. Sleep is only about 13 percent of the charge in this example. Halving the active time halves most of the average; halving the sleep current saves less than seven percent. The budget tells you where to work.
When the sleep current is higher than the microcontroller's datasheet figure, it is almost always the rest of the board. Check these in order:
Because the burst dominates, this is where the large gains are.
Wake on an event or a timer, never by polling. An accurate 32 kHz crystal keeps the timing honest at the cost of a little current; an internal oscillator is cheaper but drifts, and drift in a wake schedule becomes missed network windows. Keep the watchdog and the real-time clock running on the lowest-power clock they allow, and check what the watchdog does across sleep, since some configurations stop it and some do not.
Then put the measured values back into the budget and compare the prediction with a real run for a few days. A budget you never reconcile with measurements is only a guess with a table around it.
A battery has internal resistance, and a pulse of tens of milliamps makes its voltage sag, sometimes enough to reset the device. Small primary cells in particular have limited pulse capability, so a bulk capacitor near the load or a different cell chemistry may be needed. Check the voltage at the device during the burst, not at rest.
Our Apollo2 low-power IoT terminal follows this pattern: the microcontroller spends nearly all its time in deep sleep with real-time-clock wake-up, and the GPRS and GPS parts are powered only when a report is due. If you are designing a battery-powered product and want the budget, the hardware and the firmware to be made to agree, see our IoT product development service and our guide to low-power wireless hardware design.
Contact us for customized solutions and quotes