Ultra-Low-Power IoT: Achieving <1µA Sleep Current
A practical guide to designing battery-powered IoT devices that run for years on a single coin cell.
Introduction
Power consumption is arguably the most critical factor in IoT device design. A device that drains its battery in weeks is a maintenance nightmare; one that runs for years is a viable commercial product. Achieving ultra-low power consumption requires understanding the entire system—not just the microcontroller, but every component, sensor, and radio.
This article explores the principles, techniques, and real-world examples of designing ultra-low-power IoT devices. Whether you’re building a soil moisture sensor for agriculture, a temperature logger for cold chain monitoring, or a wearables health tracker, the strategies outlined here will help you maximize battery life.
1. The Consumption Challenge
1.1 Why Power Matters
Battery-powered IoT devices are ubiquitous in real-world deployments. Whether deployed in remote agricultural fields, smart buildings, or industrial facilities, these devices must operate for months or years without battery changes. The cost of battery replacement often exceeds the cost of the device itself—making long battery life a critical business requirement.
1.2 Key Insight: It’s Not Just the MCU
A common mistake is focusing solely on the microcontroller’s power consumption. While important, the MCU is often not the largest power consumer. Consider:
- Sensors may draw significant current during measurement
- Radios can consume 10-100x more than the MCU during transmission
- Voltage regulators can waste power as heat
- Idle peripherals may continue consuming power if not properly managed
Example: A sensor that draws 5mA during a 100ms measurement once per minute is acceptable. But the same sensor drawing 1mA continuously will drain a 2000mAh battery in 83 days—regardless of the MCU’s sleep current.
1.3 The Power Budget Equation
The total energy consumed by a device can be calculated as:
Total Energy = (Idle Current × Idle Time) + (Active Current × Active Time)
For ultra-low-power operation, the goal is to maximize idle time and minimize both idle and active currents. This is achieved through:
- Deep sleep modes with minimal current draw
- Duty cycling—waking up only when needed
- Optimising active time—doing work as quickly as possible
- Powering off peripherals when not in use
2. Components of Power Consumption
2.1 Microcontroller Power
| Controller | Active Current | Sleep Current | Wake-up Time | Best Use Case |
|---|---|---|---|---|
| STM32L0 | ~5 mA @ 32 MHz | <2 µA | ~5 µs | Battery sensors, 2+ years on coin cell |
| STM32L4 | ~8 mA @ 80 MHz | <1 µA | ~3 µs | Battery sensors + moderate processing |
| STM32U5 | ~6 mA @ 160 MHz | <0.9 µA | ~2 µs | Best-in-class low power + performance |
| ESP32 | ~100-150 mA @ 240 MHz | 10-150 µA | ~1-3 ms | Low-power Wi-Fi (deep sleep) |
| ESP8266 | ~70 mA @ 80 MHz | 10-20 µA | ~1-2 ms | Simple Wi-Fi sensors |
| RP2040 | ~20 mA @ 133 MHz | ~100-200 µA | ~1 ms | Cost-sensitive, moderate power |
| nRF52840 | ~6-10 mA @ 64 MHz | <2 µA | ~3 µs | BLE applications, wearables |
Key takeaway: For battery-powered applications, STM32L0/L4/U5 and nRF52 series are the top choices. ESP32 can be acceptable with aggressive deep sleep (e.g., waking every 15 minutes).
2.2 Sensor Power
Sensors vary widely in power consumption. Critical factors:
- Measurement current—current drawn during a reading
- Measurement time—how long the sensor needs to stabilise
- Idle/standby current—current when not measuring
- Power-up time—time to become ready after power-on
| Sensor Type | Measurement Current | Idle Current | Measurement Time |
|---|---|---|---|
| DHT22 (humidity/temp) | 1-2.5 mA | 0.1-1 µA | 1-2 seconds |
| BME280 (temp/humidity/pressure) | 0.3-3.6 µA | <0.1 µA | <10 ms |
| SHT30 (humidity/temp) | 0.5-1.5 µA | <0.2 µA | <10 ms |
| MPU6050 (accelerometer) | 3.9 mA | 10 µA | ~100 µs |
| ADXL345 (accelerometer) | 23-140 µA | 0.1 µA | ~100 µs |
| Max30102 (heart rate/SpO2) | 5-10 mA | <1 µA | 10-30 ms |
| TMP102 (temperature) | 10 µA | 0.5 µA | <100 ms |
Key takeaway: Choose sensors with low idle current and fast measurement times. Modern digital sensors (I²C/SPI) are generally better than analog sensors requiring external ADCs.
2.3 Radio Power
Radios are often the largest power consumer in IoT devices. Transmission current can be 10-100x higher than MCU active current.
| Radio/Protocol | TX Current | RX Current | Sleep Current | Typical Duty Cycle |
|---|---|---|---|---|
| LoRa (SX1276) | 100-120 mA @ 14dBm | 10 mA | 2 µA | <0.1% (1 sec every 15 min) |
| LoRa (SX1276) | 50-60 mA @ 7dBm | 10 mA | 2 µA | <0.1% |
| BLE (nRF52840) | 5-15 mA | 4-10 mA | 2 µA | 1-5% (depending on advertising) |
| Zigbee (CC2530) | 30-40 mA | 20 mA | 0.5 µA | <1% |
| Wi-Fi (ESP32) | 100-200 mA | 80-150 mA | 10-150 µA | 0.1-1% (short bursts) |
| NB-IoT (module) | 200-300 mA | 50-100 mA | 5-10 µA | 0.01-0.1% |
Key takeaway: LoRa, BLE, and Zigbee are orders of magnitude more power-efficient than Wi-Fi for infrequent, small data payloads.
3. The Sensor Problem
3.1 Not All Sensors Support Low Power
This is a critical and often overlooked issue. Many sensors, especially older analog sensors, draw continuous current regardless of whether they are being read. This makes them unsuitable for battery-powered applications.
High-power sensor types to avoid:
- Legacy analog sensors (e.g., LM35 temperature sensor) drawing 50-100 µA continuously
- Some gas sensors (e.g., MQ-2) requiring preheating at 100-200 mA
- Sensors without standby or power-down modes
Low-power alternatives:
- Digital sensors with integrated ADC and shutdown modes (e.g., BME280, SHT30)
- Sensors with configurable sampling rates (e.g., ADXL345 with wake-up mode)
- Sensors that can be completely powered down via a MOSFET
3.2 Powering Down Sensors
A common technique for sensors without low-power modes is to power them through a MOSFET controlled by the MCU. This allows you to completely cut power to the sensor when not in use.
// Example: Powering down a sensor via MOSFET
void read_sensor(void) {
// Enable power to sensor
gpio_set_level(POWER_ENABLE_PIN, 1);
delay_ms(10); // Wait for sensor to stabilise
// Read sensor
uint16_t value = i2c_read_sensor();
// Power down sensor
gpio_set_level(POWER_ENABLE_PIN, 0);
}
Advantages:
- Sensor draws zero current when not measuring
- Works with any sensor, regardless of built-in low-power features
Disadvantages:
- Requires an extra MOSFET and GPIO pin
- Adds wake-up time (usually negligible)
3.3 Sensor Selection Guidelines
When selecting sensors for battery-powered devices:
- Check idle current—should be <1 µA ideally
- Check measurement time—shorter is better (<100 ms)
- **Look for “low power” or “ultra-low power” in the datasheet
- Verify power-down modes—some sensors have no shutdown capability
- Consider self-discharge—some sensors (e.g., gas sensors) have inherent power consumption
4. Real-World Example: STM32 Ultra-Low Power
4.1 STM32L0/L4/U5 Series Overview
The STM32L series is the gold standard for ultra-low-power microcontrollers. Key features include:
- Multiple sleep modes—from Stop to Standby (<2 µA)
- Wake-up from standby via GPIO, RTC, or external events
- Ultra-low-power analog peripherals—LPUART, LPTIM, LPDAC
- Dynamic voltage scaling—adjust core voltage for performance
- Battery backup domain—retains critical data during deep sleep
4.2 Power Modes Comparison
| Mode | Current | Wake-up Source | Wake-up Time | Use Case |
|---|---|---|---|---|
| Run | 100 µA/MHz | N/A | N/A | Active processing |
| Sleep | 50-80 µA/MHz | Any interrupt | 2-3 cycles | Light sleep with fast wake-up |
| Low-power Run | 25 µA/MHz | N/A | N/A | Continuous low-power processing |
| Low-power Sleep | 10-20 µA | Any interrupt | 2-3 cycles | Low-power waiting |
| Stop 0 | ~100 µA | All peripherals | ~2 µs | Fast wake-up, peripherals active |
| Stop 1 | ~1-2 µA | Limited peripherals | ~3 µs | Moderate wake-up, peripherals limited |
| Standby | <2 µA | Reset, RTC, wake-up pins | ~5 µs | Deep sleep, minimal power |
| Shutdown | <0.5 µA | Reset, wake-up pins | ~50 ms | Deepest sleep, no RAM retention |
4.3 Practical STM32 Power Optimisation
Code example: Entering Standby mode with RTC wake-up
// STM32L0/L4 Ultra-low-power setup
void enter_standby(void) {
// Disable unused peripherals
__HAL_RCC_CRC_CLK_DISABLE();
__HAL_RCC_I2C1_CLK_DISABLE();
__HAL_RCC_USART2_CLK_DISABLE();
// Configure RTC for wake-up in 15 minutes
RTC_TimeTypeDef sTime = {0};
RTC_DateTypeDef sDate = {0};
RTC_AlarmTypeDef sAlarm = {0};
sAlarm.AlarmTime.Hours = 0;
sAlarm.AlarmTime.Minutes = 15;
sAlarm.AlarmTime.SubSeconds = 0;
sAlarm.AlarmMask = RTC_ALARMMASK_HOURS;
HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BIN);
// Enter Standby mode
HAL_PWR_EnterSTANDBYMode();
}
4.4 Application Example: Battery-Powered Sensor
A soil moisture sensor using STM32L0 + LoRa module:
- MCU: STM32L053R8
- Sensor: Capacitive soil moisture sensor (ADS1115 + probe)
- Radio: SX1276 LoRa module
- Power: 2x AA batteries (2,000 mAh each)
Operation cycle (every 15 minutes):
- MCU wakes from Standby (0.5 µA) due to RTC alarm
- MCU powers sensor via MOSFET (10 ms)
- MCU reads sensor (100 ms @ 5 mA)
- MCU processes data (1 ms @ 100 µA/MHz)
- MCU powers LoRa module (1 second @ 120 mA)
- MCU transmits data (1 packet, ~50 bytes)
- MCU enters Standby mode
Power consumption calculation:
- Standby: 0.5 µA × 898.8 seconds = 0.45 mAh per cycle
- Active: 100 µA × 0.02 seconds = 0.0006 mAh per cycle
- Sensor: 5 mA × 0.1 seconds = 0.14 mAh per cycle
- Radio: 120 mA × 1 second = 33 mAh per cycle
- Total per cycle: ~33.6 mAh
- Battery life: 4,000 mAh / (33.6 mAh × 96 cycles/day) ≈ 1.2 years
Optimisation for 2+ years:
- Reduce transmission frequency (every 30 minutes)
- Optimise LoRa transmit power (use 10 dBm instead of 14 dBm)
- Use duty cycling for sensor (measure less frequently)
- Choose a sensor with lower active current
5. Strategies for Ultra-Low Power
5.1 Duty Cycling
Duty cycling is the most important technique for ultra-low-power operation. The device spends most of its time in deep sleep, waking only to perform a task and immediately returning to sleep.
Key parameters:
- Sleep duration—longer sleep means lower average power
- Wake-up time—how long it takes to become active
- Active time—how long tasks take to complete
Formula:
Average Power = (Sleep Current × Sleep Time + Active Current × Active Time) / Total Time
Example:
- Sleep current: 1 µA
- Active current: 10 mA
- Sleep time: 14 minutes 59 seconds
- Active time: 1 second
- Average power = (1 µA × 899s + 10mA × 1s) / 900s ≈ 12 µA
5.2 Sleep Mode Selection
Choose the lowest power sleep mode that meets your wake-up requirements:
| Requirement | Recommended Mode |
|---|---|
| Need very fast wake-up (<10 µs) | Stop mode |
| Need RTC wake-up | Standby mode |
| Need preserve SRAM data | Stop or Standby with RAM retention |
| Need preserve GPIO states | Standby or Stop |
| Need external interrupt wake-up | Stop or Standby |
| Need ADC/DAC after wake-up | Stop mode (peripherals retain) |
5.3 Peripheral Power Management
Key principle: Power off anything you don’t need.
- Clock gating—disable clocks to unused peripherals
- Power domain control—some MCUs have separate power domains
- GPIO configuration—set unused pins to analog input to minimise leakage
- Voltage regulator—use low-power regulator modes
Example: STM32 peripheral disable:
// Disable unused clocks
__HAL_RCC_CRC_CLK_DISABLE();
__HAL_RCC_DMA1_CLK_DISABLE();
__HAL_RCC_USART1_CLK_DISABLE();
// Set unused GPIOs to analog input
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_All;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
5.4 Radio Optimisation
Radios are power-hungry. Optimise their usage:
- Reduce transmission power—use the minimum required
- Reduce packet length—send only essential data
- Aggregate data—send multiple readings in one packet
- Use acknowledgements sparingly—they add extra transmissions
- Consider using lower-layer protocols—raw LoRa without LoRaWAN for reduced overhead
6. Real-World Application Examples
6.1 Soil Moisture Sensor (Agriculture)
- MCU: STM32L052R8
- Sensor: Capacitive soil moisture (ADS1115)
- Radio: LoRaWAN (SX1276)
- Power: 2x AA batteries
- Cycle: Wake every 15 minutes, measure, transmit
- Battery life: 2+ years
- Key optimisations: Deep sleep, short radio burst, low sensor current
6.2 Temperature Logger (Cold Chain)
- MCU: STM32L432KC
- Sensor: TMP102 or DS18B20
- Radio: Bluetooth LE (nRF52840) or LoRa
- Power: CR2032 coin cell (220 mAh)
- Cycle: Wake every 5 minutes, measure, store (transmit hourly)
- Battery life: 1+ year on BLE, longer on LoRa
- Key optimisations: Aggressive duty cycling, store-and-forward
6.3 Smart Water Meter
- MCU: STM32L0/L4
- Sensor: Hall effect flow sensor (external trigger)
- Radio: NB-IoT (SIM800/Quectel)
- Power: 1x AA battery (3,000 mAh) or Li-SOCl2 (3,000 mAh)
- Cycle: Wake on flow event, count, transmit daily
- Battery life: 5+ years
- Key optimisations: Event-driven wake-up, infrequent transmission
6.4 Wearable Health Monitor
- MCU: nRF52840 or STM32L4
- Sensor: Max30102 (heart rate/SpO2) + ADXL345 (activity)
- Radio: BLE (built-in on nRF52840)
- Power: 200 mAh LiPo battery
- Cycle: Wake every 1 second (accelerometer), measure HR every 10 minutes
- Battery life: 2-4 weeks
- Key optimisations: Accelerometer uses activity wake-up, HR only when active
7. N3xar’s Approach to Low Power
The N3xar platform is designed to support a wide range of power profiles, from AC-powered industrial devices to ultra-low-power battery sensors.
Supported Device Types:
- AC-powered devices: Gateways, servers, industrial controllers
- Powered nodes: Sensors and actuators with stable power
- Low-power autonomous nodes: Battery-powered sensors with <1 µA sleep current
Key Products:
- Ethernet, wired, Wi-Fi & LoRa devices — flexible connectivity options
- I²C, motion, water, and contact sensors — diverse sensing capabilities
- Electromechanical actuators & valves — controlled actuation
- Stepper/servo motor control boards — precision motion control
Power Management Features:
- Dynamic sampling rates based on power availability
- Adaptive transmission intervals to conserve battery
- Sleep-mode device profiles (<1 µA)
- Real-time power monitoring and alerts
“Our system supports both wired and wireless communication and uses two node types: low-power autonomous nodes for long-term sensor use, and powered nodes for sensors and actuators.”
8. Design Checklist for Ultra-Low-Power IoT
Use this checklist to ensure your design is optimised for low power:
MCU Selection
- Choose MCU with deep sleep current <2 µA
- Verify wake-up time is acceptable for your application
- Check for low-power peripherals (LPUART, LPTIM)
Sensor Selection
- Check idle current (should be <1 µA if possible)
- Verify sensor has power-down mode
- Consider MOSFET to completely power down sensor
- Check measurement time (shorter is better)
Radio Selection
- Choose protocol appropriate for your data rate and range
- Consider transmission power (use minimum required)
- Verify sleep current of radio module
- Check if radio can be powered down completely
Power Supply
- Choose regulator with low quiescent current
- Consider bypassing regulator for sleep mode (direct battery connection)
- Select battery type appropriate for your current profile
Firmware Optimisation
- Implement duty cycling (maximise sleep time)
- Enter deep sleep immediately after tasks
- Disable unused peripherals and clocks
- Use low-power modes for peripherals
- Optimise radio usage (short bursts, aggregating data)
System-Level
- Calculate power budget and battery life
- Test with real-world usage patterns
- Monitor power consumption during development
- Plan for battery replacement or recharging
9. Conclusion
Designing ultra-low-power IoT devices requires a holistic approach that considers every component of the system. Key principles:
- Focus on the entire system—not just the MCU
- Maximise sleep time with aggressive duty cycling
- Choose low-power sensors with fast measurement times
- Optimise radio usage—it’s often the largest power consumer
- Power down peripherals when not in use
- Measure and iterate—power consumption varies in practice
“The best low-power device is one that spends 99.9% of its time in deep sleep, wakes up only when needed, and does its work as quickly as possible before returning to sleep.”
With modern MCUs, sensors, and radios, it is entirely possible to achieve battery life measured in years. The techniques and examples in this article provide a roadmap for achieving that goal.
Further Reading
- Comparing IoT Controllers for Your Project – selecting the right MCU for power-critical applications.
- Overview of Wireless Communication Protocols for IoT – choosing the right radio for your power budget.
- Designing Scalable IoT Systems: A Practical Guide for Integrators – the main article covering all aspects of IoT architecture.
This article is based on practical experience building the N3xar platform, which supports ultra-low-power devices with <1µA sleep current for long-term autonomous operation.