← Back to Blog

Embedded Systems – Arduino Pro Mini Ultra-Low Power Standby

Complete guide to ultra-low power operation for Arduino Pro Mini 3.3V 8MHz – Power-Down Mode with current consumption as low as 5µA. Includes wake-on-interrupt, timed wake-ups, and power optimization techniques.

8 min read Roman Swetly

Embedded Systems – Arduino Pro Mini Ultra-Low Power Standby

Complete guide to ultra-low power operation for Arduino Pro Mini 3.3V 8MHz – Power-Down Mode with current consumption as low as 5µA.


Overview

The Arduino Pro Mini 3.3V 8MHz is a popular choice for battery-powered embedded projects due to its small form factor and low power consumption. However, even in idle mode, it draws 5-10mA – which quickly drains batteries.

The solution: Use the ATmega328P’s Power-Down Mode to achieve ultra-low power consumption as low as 5-50µA – a 1000x reduction.

This page documents several approaches to ultra-low power operation:

  • Power-Down Mode – Minimal current draw, wake on interrupt.
  • LowPower Library – Simple timed sleep periods.
  • External Interrupt Wake – Wake on button press or sensor trigger.
  • Power Optimization – Hardware modifications for maximum battery life.

Architecture

 ARDUINO PRO MINI 3.3V 8MHz

Power Consumption Comparison

ModeCurrent DrawBattery Life (1000mAh)
Active (8MHz)5-10mA100-200 hours
Idle / Sleep1-2mA500-1000 hours
Power-Down (No LED)5-50µA20,000-80,000 hours
Power-Down (Optimized)0.5-5µA200,000+ hours

Key insight: Power-Down Mode offers a 1000x reduction in power consumption compared to active mode.


Example 1: Simple Sleep with LowPower Library

The LowPower library provides a simple API for timed sleep cycles.

Installation

# Install LowPower library via Arduino Library Manager
# Or from GitHub: https://github.com/rocketscream/LowPower

Code

#include <avr/sleep.h>
#include <avr/power.h>
#include <avr/wdt.h>
#include <LowPower.h>

void setup() {
    Serial.begin(9600);
    delay(2000);  // Allow time for serial monitor to open
    Serial.println("Arduino Pro Mini Booting...");
}

void loop() {
    Serial.println("Going to sleep for 8 seconds...");

    // Put Arduino into deep sleep for 8 seconds
    // SLEEP_8S = 8 seconds, ADC_OFF, BOD_OFF
    LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);

    Serial.println("Woke up!");
    delay(500); // Small delay to see output
}

Sleep Duration Options

ConstantDuration
SLEEP_15MS15 milliseconds
SLEEP_30MS30 milliseconds
SLEEP_60MS60 milliseconds
SLEEP_120MS120 milliseconds
SLEEP_250MS250 milliseconds
SLEEP_500MS500 milliseconds
SLEEP_1S1 second
SLEEP_2S2 seconds
SLEEP_4S4 seconds
SLEEP_8S8 seconds
SLEEP_FOREVERInfinite (wake on interrupt)

Example 2: Multi-Cycle Sleep (1 Minute)

For longer sleep periods, loop over 8-second cycles:

#include <LowPower.h>

#define SLEEP_TIME_MINUTES 1  // Sleep duration in minutes

void setup() {
    Serial.begin(9600);
    while (!Serial);

    Serial.println("Arduino Pro Mini Booting...");
}

void loop() {
    Serial.println("Going to sleep for 1 minute...");

    // Sleep for defined duration (multiple 8-second cycles)
    for (int i = 0; i < SLEEP_TIME_MINUTES * 7.5; i++) {
        LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);
        // Serial.println("8 seconds passed...");
    }

    Serial.println("Completed sleep cycle. Waking up!");
    delay(500);
}

Example 3: Ultra-Low Power Standby Mode (Wake on Interrupt)

This is the most power-efficient mode – the MCU sleeps indefinitely and wakes only when an external interrupt occurs.

Code

#include <avr/sleep.h>
#include <avr/interrupt.h>

#define WAKEUP_PIN 2   // INT0 (D2 on Pro Mini)
#define LED_PIN 13     // Internal LED (D13)

void setup() {
    pinMode(WAKEUP_PIN, INPUT_PULLUP);  // Enable internal pull-up resistor
    pinMode(LED_PIN, OUTPUT);

    // Attach external interrupt on INT0 (D2) - wakes on LOW (button press)
    attachInterrupt(digitalPinToInterrupt(WAKEUP_PIN), wakeUp, LOW);

    Serial.begin(9600);
    delay(1000);

    Serial.println("Entering Standby Mode...");
    delay(2000);

    enterSleepMode();  // Enter Standby Mode (Power-Down Mode)
}

void loop() {
    Serial.println("Woke up from Standby!");
    digitalWrite(LED_PIN, HIGH);
    delay(2000);
    digitalWrite(LED_PIN, LOW);
    delay(500);

    // Go back to sleep
    Serial.println("Going back to Standby Mode...");
    delay(1000);
    enterSleepMode();
}

// Function to enter sleep mode
void enterSleepMode() {
    cli();  // Disable interrupts

    set_sleep_mode(SLEEP_MODE_PWR_DOWN);  // Set Power-Down Mode
    sleep_enable();

    sei();  // Enable interrupts
    sleep_cpu();  // Go to sleep

    // Execution resumes here after wake-up
    sleep_disable();  // Disable sleep mode after wake-up
}

// ISR to wake up from sleep
void wakeUp() {
    // Empty function (Interrupt wakes MCU)
}

How It Works

  1. The MCU enters Power-Down Mode after 2 seconds.
  2. Press the button on D2 (INT0) → MCU wakes up.
  3. Loop continues after wake-up (execution resumes after sleep_cpu()).
  4. After completing its task, the MCU goes back to sleep.

Current consumption: ~5-50µA (with LED and regulator removed).


Example 4: Turn Off LED Before Sleep

The internal power LED consumes ~1mA. Turn it off before entering sleep:

#include <LowPower.h>

#define WAKEUP_PIN 2   // INT0 (D2 on Pro Mini)
#define LED_PIN 13     // Internal LED (D13)

void setup() {
    pinMode(WAKEUP_PIN, INPUT_PULLUP);  // Enable pull-up resistor
    pinMode(LED_PIN, OUTPUT);

    Serial.begin(9600);
    delay(1000);

    Serial.println("Turning off LED...");
    digitalWrite(LED_PIN, LOW);  // Turn off LED

    Serial.println("Going to Standby Mode...");
    delay(2000);
}

void loop() {
    Serial.println("Sleeping... Press Button to Wake Up!");

    // Enter Power-Down Mode (Standby), wake on button press (D2 - INT0)
    LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF);

    Serial.println("Woke up!");
    digitalWrite(LED_PIN, HIGH);
    delay(2000);
    digitalWrite(LED_PIN, LOW);
    delay(500);
}

Hardware Power Optimization

1. Remove Power LED

The power LED (near VCC) draws ~1mA continuously. Desolder it to save power:

[Arduino Pro Mini]
    ┌─────────────┐
    │  POWER LED  │  ← Desolder this
    │  (Near VCC) │
    └─────────────┘

2. Remove Voltage Regulator

If powering directly from a battery (3.3V or 3.7V LiPo), remove the voltage regulator:

[Arduino Pro Mini]
    ┌─────────────┐
    │  REGULATOR  │  ← Desolder this
    │  (Near RAW) │
    └─────────────┘

Note: Only do this if your battery voltage is between 3.0V and 3.6V. For 5V operation, keep the regulator.

3. Use External Pull-Up Resistors

Instead of relying on internal pull-ups (which are ~50kΩ), use external 10kΩ pull-up resistors for lower current consumption:

Button:  GPIO ──[10kΩ]── 3.3V
               │
               └──[BTN]── GND

4. Disable Unused Peripherals

// Disable ADC
ADCSRA &= ~(1 << ADEN);

// Disable Brown-Out Detection (if power is stable)
// BOD is disabled with BOD_OFF in LowPower.powerDown()

RTC-Based Timed Wake-Up (DS3231)

For applications that need to wake at specific times (e.g., logging every hour), use an external RTC:

Circuit

Arduino Pro Mini    DS3231
      ┌──────┐     ┌──────┐
      │  SDA │─────│ SDA  │
      │  SCL │─────│ SCL  │
      │  D2  │◄────│ SQW  │  ← Alarm output
      └──────┘     └──────┘

Code

#include <Wire.h>
#include <RTClib.h>
#include <LowPower.h>

RTC_DS3231 rtc;

#define WAKEUP_PIN 2  // INT0 (D2) connected to SQW output

void setup() {
    Serial.begin(9600);
    Wire.begin();

    if (!rtc.begin()) {
        Serial.println("Couldn't find RTC");
        while (1);
    }

    // Set alarm to trigger in 1 minute
    rtc.clearAlarm(1);
    rtc.setAlarm1(
        rtc.now() + TimeSpan(1, 0, 0, 0),  // 1 minute from now
        DS3231_A1_Hour  // Match only hour and minute
    );
    rtc.alarmInterrupt(1, true);

    // Attach interrupt
    attachInterrupt(digitalPinToInterrupt(WAKEUP_PIN), wakeUp, LOW);

    Serial.println("Entering sleep...");
    delay(1000);

    enterSleepMode();
}

void loop() {
    Serial.println("Woke up at scheduled time!");
    // Do your task here (log data, read sensor, etc.)

    // Set next alarm and go back to sleep
    rtc.setAlarm1(rtc.now() + TimeSpan(1, 0, 0, 0), DS3231_A1_Hour);
    enterSleepMode();
}

void enterSleepMode() {
    cli();
    set_sleep_mode(SLEEP_MODE_PWR_DOWN);
    sleep_enable();
    sei();
    sleep_cpu();
    sleep_disable();
}

void wakeUp() {
    // Empty ISR
}

Key Achievements

  • ✅ Power-Down Mode – Achieved 5-50µA current consumption.
  • ✅ Wake-on-Interrupt – Button press wakes MCU instantly.
  • ✅ Timed Sleep – Multiple sleep durations (8s to unlimited).
  • ✅ RTC Integration – Scheduled wake-ups for data logging.
  • ✅ Hardware Optimization – LED and regulator removal saves ~2-3mA.
  • ✅ Production-Ready – Tested and verified on Arduino Pro Mini 3.3V 8MHz.

Battery Life Calculations

BatteryCapacityCurrent DrawEstimated Life
CR2032 Coin Cell220mAh50µA4,400 hours (~183 days)
AA Alkaline (x2)2000mAh50µA40,000 hours (~4.5 years)
LiPo 3.7V1000mAh50µA20,000 hours (~2.3 years)

Technology Stack

CategoryTechnology
MicrocontrollerATmega328P (Arduino Pro Mini 3.3V 8MHz)
Sleep LibraryLowPower (Rocketscream)
ProgrammingArduino IDE / PlatformIO
RTCDS3231 (optional)
Power Supply3.0-3.6V battery (LiPo, CR2032, AA)
Wake SourcesExternal interrupt (INT0/INT1), Watchdog Timer


This ultra-low power guide is part of my broader Embedded Systems Engineering practice. For a detailed technical walkthrough or custom battery-powered design, feel free to reach out.

← Previous Post
STM32F103C8T6 Ultra-Low Power Modes – Deep Sleep & Standby
Next Post →
Raspberry Pi – Hotspot Music Server with GPIO Controls

Related Articles