Learning Goals 5 min
Combine sleep modes (L04-37) and battery selection (L04-38) into the classic IoT field-device pattern: wake, sample, transmit, sleep. The complete blueprint for any battery-powered sensor that needs to last months or years. By the end of this lesson you will:
- Implement the wake / sample / transmit / sleep cycle on a Pro Mini + sensor + radio.
- Power down all peripherals between cycles (sensor + radio + chip) for true µA average draw.
- Estimate runtime from measured current samples and pick the right wake interval for your use case.
Warm-Up 10 min
Hardware: Pro Mini 3.3 V (or any low-power AVR), DHT22 (or similar), nRF24 / RFM69 / LoRa radio, battery + monitor.
The pattern
while forever: wake from sleep power on the sensor (MOSFET switch) read sensor (~20 ms) power off sensor power on the radio publish (~50 ms) power off radio sleep for the configured interval
Each cycle takes ~100 ms of active time. Sleep takes 15 min – 1 hour depending on application. Active time is 0.005–0.01% of the cycle. Average current drops from ~30 mA to ~50 µA.
New Concept · The wake/sample/transmit cycle 25 min
Switching peripherals via MOSFET
Many sensors draw 1–5 mA even when idle. Cutting their power in sleep saves a lot. Use a P-channel MOSFET on the high side: GPIO HIGH = peripheral off; LOW = on.
Wiring:
- Battery + → P-MOSFET source.
- MOSFET drain → sensor VCC.
- MOSFET gate → 10 kΩ pull-up to battery + + Arduino GPIO.
The structured loop
#include <LowPower.h>
const int SENSOR_POWER = 5; // MOSFET gate (LOW = on)
const int RADIO_POWER = 6;
const int WAKES_PER_SAMPLE = 7; // 7 × 8 s ≈ 56 s; or 450 × 8 s ≈ 1 hour
int batteryThreshold = 3300; // mV
void sleepInterval() {
for (int i = 0; i < WAKES_PER_SAMPLE; i++) {
LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);
}
}
void wakeAndDoWork() {
// 1. Sensor on
digitalWrite(SENSOR_POWER, LOW);
delay(50); // sensor wake-up time
// 2. Sample
float temp = readTemperatureSensor();
// 3. Sensor off
digitalWrite(SENSOR_POWER, HIGH);
// 4. Battery check
int vbat = readBatteryVoltage_mV();
if (vbat < batteryThreshold) {
// refuse to transmit if battery is low
return;
}
// 5. Radio on
digitalWrite(RADIO_POWER, LOW);
delay(20); // radio warm-up
radio.begin();
radio.send(makePacket(temp, vbat));
radio.end();
digitalWrite(RADIO_POWER, HIGH);
}
void setup() {
pinMode(SENSOR_POWER, OUTPUT);
pinMode(RADIO_POWER, OUTPUT);
digitalWrite(SENSOR_POWER, HIGH);
digitalWrite(RADIO_POWER, HIGH);
}
void loop() {
wakeAndDoWork();
sleepInterval();
}Pre-wake checks
Sometimes you want to do nothing if conditions aren't right. Common pre-wake gates:
- VBAT too low → skip transmit, only beep low-batt warning.
- Sensor reading hasn't changed significantly → skip transmit (saves more battery, fewer packets to the gateway).
- Time of day (e.g. 9 PM – 7 AM "sleep mode" — only one reading per hour).
Reducing transmit cost
The radio is usually the biggest energy sink. Strategies:
- Higher SF on LoRa = longer per-packet time but longer range. Pick based on coverage.
- Compress payloads. Send a 4-byte struct, not a 30-byte JSON.
- Send only on change. Cache last sent value; transmit when delta exceeds threshold.
- Aggregate. Sample 12 times an hour, send hourly with 12 values.
Worked Example · Build a 2-year temperature logger 25 min
Bill of materials
- Pro Mini 3.3 V (~3 mA active, ~3 µA deep sleep).
- DHT22 (~1 mA active, draws ~0 µA off).
- RFM69CW LoRa-like radio (~30 mA tx peak, ~0.1 µA off).
- P-MOSFET (SI2333DDS or similar).
- 3 × AA NiMH (3.6 V, 2500 mAh).
Math
- Active per cycle: 100 ms × ~30 mA ≈ 0.8 µAh.
- Sleep per cycle: ~3 µA × 15 minutes = 0.75 µAh.
- Per cycle total: 1.5 µAh.
- Cycles per year: 365 × 24 × 4 = 35040.
- Per year: 35040 × 1.5 µAh = 53 mAh.
2500 mAh / 53 mAh per year = 47 years. Battery shelf life will limit you to ~10 years long before capacity is consumed.
Real-world results
Reality is messier: leak currents, parasitic loads, charge inefficiency on the boost regulator. Field deployments of this pattern typically last 2–5 years on AA cells. That's still phenomenal — battery becomes the device's effective lifetime.
Verify in practice
- Measure µA in sleep.
- Measure mA during active cycle + duration.
- Compute weighted average.
- Divide battery mAh by average → years of life.
Try It Yourself 15 min
Goal: Build a wake-every-30-seconds blinker that flashes for 50 ms then sleeps. Measure average µA.
Goal: Wake-and-publish over LoRa every hour. Build with Pro Mini + RFM95. Measure runtime on 2 × AA over a week. Extrapolate to years.
Goal: Send-only-on-change. Cache the last published temperature. Send a new packet only when the difference exceeds 0.5 °C. Reduces packets by ~10× during stable weather.
Mini-Challenge · Estimate one of your project's runtime 10 min
- Pick a battery project.
- Measure active mA + duration per cycle.
- Measure sleep mA + duration per cycle.
- Compute weighted average.
- Divide battery mAh by average → years.
- Compare to the naive "always running" estimate.
Recap 5 min
Low-power sensor node = wake-sample-transmit-sleep with peripherals MOSFET-switched. Average current in µA, runtime in years. The pattern of every commercial battery-powered IoT device. Tomorrow we add solar and the device runs forever.
- Wake/sample/transmit/sleep cycle
- The four phases of a low-power node. Active 0.01–1% of the time; sleep the rest.
- Peripheral power gating
- Using a MOSFET to cut power to sensors / radios when not in use.
- P-channel MOSFET (high-side switch)
- Switches VCC to a peripheral. Gate held HIGH = off; LOW = on. Cheap, low loss.
- Sensor wake-up time
- How long after power-on before a sensor gives valid readings. DHT22 ~50 ms; BMP280 ~10 ms.
- Send-on-change
- Transmit only when the value differs significantly from the last sent value. Reduces radio time.
- Field-device pattern
- The industry-standard low-power node template. Sleep most of the time; do work briefly; sleep again.
Homework 5 min
- Sketch out the cycle for one of your projects on paper.
- Estimate runtime with naive (always on) vs proper sleep cycle.
- Read ahead to ARD-L04-40 (Solar-Powered Field Sensor).