Powering cellular IoT for months in the wild

Powering cellular IoT for months in the wild

For a LTE M1 connected IoT project that is meant to operate in the wild for months at a time, we’re designing a set of rechargeable power packs that will provide the electrons we need in an easily swapped out form factor. In the meantime, we needed some way to test the modules and profile their behaviour under realistic conditions.


The proof of concept modules we built around Particle Boron modules. These are a nice combination of the platform we’d settled on (basically a Nordic nRF52840 and a U-blox SARA LTE Cat M1 EGPRS module) that offer BLE 5 and LTE functionality while keeping to relatively low power requirements

Prototype Modules

Along with the Boron, the boards host a number of peripherals like GPS and accelerometer. Though the systems consume little while sleeping most components (~1mA) and could go on like this for a few months on a single cell LiPo, when they’re running at full steam (LTE radio, GPS etc active) they can make it into the 200mA range, with peak currents > 400mA.

In most cases, we’ll want to wake at least every hour to report back to the AWS server. Additionally, enviromental and motion conditions along with whether we’ve been able to acquire location fixes, determine how long we sleep and whether we leave the GPS running during sleep (about 25mA required in those cases). So we’ll need quite a few mAh if we hope to last for many months.


A nice interim solution was found while awaiting the LiPo battery packs: the energizer L91 “Ultimate Lithium” AA batteries.

These are not rechargeable, so we don’t want to use them in production systems, but their specs looked pretty amazing. Of particular interest:

  • the high milliamp-hours capacity, irrespective of discharge drain current
  • the null-effect of temperature (rated for -40 to 60 degrees C)
  • the relatively steady and high voltage

If these batteries live up to their hype, then they should do quite well in IoT applications.

Testing Approach

In order to get an idea how things will look without having to wait for months to get results, we can accelerate things a bit by reducing the sleep time/increasing the wake frequency.

There is a limit to how much we can do this, though… waking every 9 seconds, instead of every 3600, and expecting the results to be a 400x speed-up of real life won’t work. In part because we’re ignoring the cost of those long sleep times but more importantly because batteries are chemistry-bounded devices and usually won’t react the same to continuous versus sporadic draw. Also, I wanted to leverage the March/April weather around here and see the effect of low temperature and temperature variations, which would be at least partially masked by a continuously operating device.

A 4x speed-up, waking every 15 minutes to do sensing, get a fix, connect over LTE and post data through MQTT, seemed like a decent middle ground.

As for keeping track of battery capacity, a coulomb counter would be the best and most precise method but it either requires a bit more power to keep track of or a more complex system where it is switched on prior to actually waking the device. Simple battery voltage measurements were deemed good enough at this stage.

The only downside of this approach is how very steep and abrupt the discharge profile is for the L91 batteries: according to the specs they’re basically steady until they very suddenly die, so the voltage monitoring approach won’t give us much of a heads-up in terms of knowing when the batteries are about to expire.

However, that same discharge profile also means that we get to use up almost all the stored capacity before we can no longer function. That means that, if we were to collect data and only post once a day, we might well be able to count on one of these packs for well beyond 6 months.


As a baseline, here’s a graph of the battery voltage at each connection for module that was running on a single cell, 1200mAh, LiPo battery.

Discharge curve, single LiPo

Waking up every hour, the device would manage to last a little over 3 weeks–not too bad. The device managed to transmit over 5 Meg of data through the LTE M1 connection and even managed to connect with the battery down to about 3.1V but you can see that as we edged down below 3.4V things started quickly degrading as the demanding connection ate away at the remaining capacity.

The L91 AA batteries were arranged with 2 parallel sets (to increase our mAh) of 3 AA in series (to reach > 4.5V). Though the resulting ~5V of fresh batteries is beyond the recommended input voltage for the Boron, it is within the PMIC’s specs and well tolerated.

L91 Battery Pack

With this temporary battery pack in place, the module was placed in the back yard to start feeling the chill and collect some data. After almost two weeks (realtime, equivalent of almost 2 months @ hourly wake-ups), the battery pack is holding quite steady.

This graph includes both the voltage level around time of transmission, as well as an indication of whether we had a GPS lock/fix determination or not (in green, below).

Voltage and GPS locks for L91 pack

There are a few interesting features of the data collected so far. Initially, the battery pack provided over 5V but with a little usage and a drop in temperature, this quickly settled down to between 4.5 and 4.7V.

You can see a whole series of “vampire teeth” in the first few hundred samples, and then a few more further along and you’ll notice these correlate with GPS acquisition failures.

The modules have an algorithm to deal with loss of GPS fix. This algo tries to be smart about power usage but, the first time a fix is lost it will keep the GPS on while the rest of the system sleeps (for a shorter period), in the hopes of getting fresh ephemeris data/acquire a lock the next time around.

Pretty much every time this happened, the voltage level on the next sample was lower and a fix was acquired on that run–leading to these vampire teeth. This makes sense, looking at that discharge profile for the L91s above, as the sleep draw when GPS is held on is in the tens of mA, rather then (sub)single digit, so the voltage is reacting to this increased usage.

In order to keep this from happening, the modules were remotely updated–around the 120, and then 250, marks–to increase the fix acquisition timeout, leading to better acquisition and less overall current usage (and hence, less vampire teeth).

You can also see these periodic spiky upswings, every ~100 samples. These are warm/sunny days, affecting the battery chemistry and resulting voltage.

Notice the missing spike around the 900 mark? This is what the modules looked like on that day:

I actually let them get fully covered in snow that day, and only cleared out the tops the next day to let them warm up again.

So you can pretty much tell what the weather is like based on the variations in the battery pack voltage.


Though the Earth sheds a tear every time I buy a disposable battery, in a pinch like this, or for devices with very long sleep times and only occasional wakes, these L91 batteries seem to live up to their specs and go beyond my expectations.

The combination of:

  • super long shelf life;
  • drain- and temperature-independent capacity; and
  • steady voltage under discharge

means they’re quite well suited to IoT that stays dormant for long periods and then has sudden bursts of high current use.

Had I known how well they would perform, I would have started with a single 3-series AA pack in the hopes of being able to profile it’s death. As it stands, I’ll try to leave the module running until it peters out and post an update but it looks like I may have to bring it in before that happens.