Arduino-LMIC library with low power mode

In this post I try to make my Arduino based TTN Nodes more power efficient.

Try to save energy

An Arduino Pro Mini with 3.3V consumes power. However, many do not know that you can already save a lot of electricity here!

Today I try to drastically reduce power consumption.

How to basically reduce power consumption, can be found under “Arduino Pro Mini 3.3V Low Power” at Google. I have already done everything. So unsolder LED and Regulator.

From 5mA normal you can reduce a lot:

  • 1mA through the LED
  • 0.5mA through the power regulator

Now we still have 3.5mA. This is too much.
Through the LowPower library we can put the Arduino into deep sleep, which is really impressive!
Theoretically we come down to 5uA, so 0.005mA!


Today my new multimeter arrived 🙂
UNI-T UT61E, really nice!

So let me take the first measurement.
First I tried to use the built-in measurement with uAmA. However, it only show me errors and I quickly dodged on the already more accurate shunt method. For this one, take a resistance between battery and consumer.
So that the consumer still gets enough electricity, take as small as possible. If one takes too small, however, the voltage drop is too low and the multimeter gets only fractions of mV, which are then also inaccurate.

I first tried 10 ohms. However, the node was then in a permanent reset.
I then turned four 10 ohm resistors together so that I get to 2.5 ohms, in my case 2.6 ohms. Now it works fine!

If we measure 100mV, we divide it by 2.6 ohms. So 38mA.

Without LowPower-Mode

Without the LowPower library, the result is not so good:

9.88mV / 2.6 Ohm = 3.8mA

With LowPower-Mode

0.1mV / 2.6 Ohm = 0.038mA = 38uA 

We saved 100 times alone with this step:

As you can see in the code, the LowPower function was used with 8s deep sleep. Very easy, very successful!
But are 38uA good? As you can read here, I expected 10uA and thought that would be generous. 

So, what’s the problem? Or do we have a problem at all?


3200mA / 0.01mAh = 320.000h = 36 years!!
That was the original calculation for deep sleep without sending and without self-discharge. Let’s adjust the value:
3200mA / 0.038mAh = 84.210h = 9.6 years!
Before using the LowPower library:
3200mA / 3.8mAh = 35 days!


I would say we have no problem. We learned in the already linked article that 5% self-discharge is a bigger problem.
So all right!
Very satisfied 🙂

LowPower Test Node Code:


25 thoughts on “Arduino-LMIC library with low power mode”

  1. Luciano Picchioni

    Hi Mario, great article!
    How did you connect the battery to the Arduino Pro mini 3.3v?
    The battery, full charge, has 4.6V, removing the regulator
    do you risk damaging the RFM95 module?

    1. I hava a LDO (MCP1700-330) between BAT out of Protection Circuit and Arduino, so i have perfect 3.3V. This LDO has only 1 uA Current instead of the Original Converter from the Arduino RAW Pin!
      Nice day!

  2. Luciano Picchioni

    Thanks for the reply
    but I still have a doubt …
    also in your article “My first own TTN node with self designed PCB”,
    in the components list there is “MCP1700-330 LDO (1.6uA, 250mAh max, 2.3-6V input)”, but in the “Affiliate links” it does not appear

    sorry, but I do not know the component well
    looking on the internet, I find the component in the TO-92-3 format
    use the component individually, have you bought a small card that contains it?

    do you have a reference link?

  3. Hello.
    Thank a lot for that great tuto. It’s exactely what I need as I work with Arduino-lmci and a Feather MO Adaloger
    Howerver,I sadly can not make it working.
    When I compile my code, I got the following error:
    ‘class LowPowerClass’ has no member named ‘powerDown’

    I double checked your example and I can not where is my error.
    No object need to be ceated for LowPower?

    I also read the following:
    ####Notes: External interrupt during standby on ATSAMD21G18A requires a patch to the Arduino SAMD Core in order for it to work.

    This is not really clear for me as you have not specify it. Did you imported via the Board Manager and did nothing else??

    Many thank

  4. Hi Mario,
    Thank’s for the great work!
    Hi have a doubt!
    I tried to run the code on an Arduino Uno but the consumption remains high: 20mA in PowerDown and 40mA in transmission.
    The only thing that I changed is the pin mapping:
    // Pin mapping
    const lmic_pinmap lmic_pins = {
    .nss = 4,
    .rxtx = LMIC_UNUSED_PIN,
    .rst = 1,
    .dio = {2, 3}, // DIO0, DIO1 and DIO2 connected
    In your opinion, what can these high consumption depend on?
    Hello and thank you again.

    1. Hello,
      I think you did everything right.
      Unfortunately the Arduino Uno is not very energy saving.
      It consumes 50mA on average.
      Your 20mA are relatively good.

      Take an Arduino Pro Mini 3.3V


  5. Compared with the original code by 2015 Thomas Telkamp and Matthijs Kooijman, you seem to use different KEY names, why is that?
    You use:
    static const PROGMEM u1_t NWKSKEY[16], is this lsb static const u1_t DEVEUI[8] + static const u1_t APPEUI[8]?
    Doing so my ProMini + RFM95 did not seem to function. In the original code there was an indicator LED to see when the joining process was going on. That would seem usefull.

  6. I don’t see any attempts to lower the power of the LoRa circuitry. Is it powered down enough anyhow between transmissions?

    Isn’t there a risk EV_TXCOMPLETE never occurs, and the Arduino therefore never enters power save?

    1. Hello,

      the radio chip doesn’t consume as much when it’s not transmitting or receiving.
      You can also put the chip into sleep mode.
      After that the RFM95 would have to consume only 0.7uA. (0.2uA for the radio chip, 0.5uA for the rest on the HopeRF).

      The case “EV_TXCOMPLETE” is completed.
      It is regularly triggered. They wait for a reception. If this is not the case, it should send (do_send) and then sleep. Then EV_TXCOMPLETE is ready and starts again.


      1. Dear Mario

        Your wrote:
        You can also put the chip into sleep mode.

        For the next do_send, do we need to reinitialize the RFM95 module? or we just need to lunch the do_send function as if we would not have ran LMIC_shutdown()

  7. Hi, whats the lowest power it consumes when in RX mode? I read that you can set a receiver in a Duty-Cycle Receive Mode so it doenst constantly needs a lot of power: sleep -> wake up when rx signal -> sleep again etc

    I need it for a battery powered receiver

    1. Power calculation
      From 4.2V to 3.5V mean about 85% capacity.
      At 900mAh that means 765mAh.
      At 6 weeks, about 42 days, it is about 1,000 hours.
      Li-ion has about 5% self-discharge per month.
      That leaves about 700mAh.
      So we come to about 0.7mA consumption.
      Calculated at that time were 0.04mA for Deep Sleep. So stay 0.66mA for pure transmission.
      Sent every 10 minutes, so 144 times a day.
      At 42 days, that’s 6,336 times.
      This required 660mAh.
      Means 0.1mAh per send.

      Read here:

  8. Hi Mario,

    thanks for the great article! However I have one question: In your low-power example you commented out the rescheduling of your send job with (os_setTimedCallback(…)) and triggered it manually.

    Did you get errors with this in the long run or does it send stable?


    1. With some nodes i had problems on long run time. But whether that has something to do with it, I hardly think so.
      If necessary, you build a software reset after x days…

    1. Sure,

      function Decoder(bytes, port) {
      var t = (bytes[0] & 0x80 ? 0xFFFF<<16 : 0) | bytes[0]<<8 | bytes[1]; var h = bytes[2]<<8 | bytes[3]; var b = bytes[4]<<8 | bytes[5]; return { temperature: t / 100, humidity: h / 100, battery: b / 100 } }

Leave a Comment

Your email address will not be published. Required fields are marked *

%d bloggers like this: