Build a LoRa Sensor Node That Runs Six Months on AA Cells

DIY Electronics
Date:October 21, 2026
Topic:
Build a LoRa Sensor Node That Runs Six Months on AA Cells
⏱ 2 min read

Most LoRa tutorials promise months of battery life then deliver weeks. The gap isn't the radio—it's the MCU sleeping habits, regulator quiescent current, and sensor duty cycles nobody measures.

Hardware That Actually Sips

Start with an ESP32-C3 (RISC-V, 5 µA deep sleep) or a bare ATmega328P (0.1 µA power-down). Pair either with an SX1262 module—2.1 µA sleep, 4.2 mA RX. Ditch the LDO; use a TPS62840 buck (300 nA Iq) to step 3–3.6 V down to 1.8 V for the MCU and radio. Two AA lithium cells (3000 mAh, flat discharge) become a 6-month+ reservoir.

c
// ESP32-C3 deep sleep, 1.8 V domain
rtc_gpio_hold_en(GPIO_NUM_2); // keep SX1262 CS high
esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_OFF);
esp_deep_sleep(300 * 1000000ULL); // 5 min cycle
💡
TipMeasure sleep current with a µCurrent Gold or Nordic PPK2 before soldering anything permanent. A single leaky pull-up can cost you 50µA—three months of runtime.

Sensor Duty Cycle Math

A BME280 reads in 1.8 ms at 1 mA. One sample per 5-minute cycle adds 0.6 µA average. An SCD41 CO2 sensor needs 18 mA for 5 s every 30 s—that’s 3 mA average, killing your budget in three weeks. Pick sensors with single-shot modes and sub-millisecond wake times.

SensorAvg Current (5-min cycle)Runtime Impact
BME280 (T/P/H)0.6 µANegligible
SCD41 (CO2)3000 µAFatal
SHT45 (T/H)0.2 µAIdeal
DS18B20 (1-Wire)1.5 µAAcceptable

Firmware Discipline

Structure every cycle: wake → sensor read → LoRa TX → radio sleep → MCU deep sleep. No Wi-Fi, no Bluetooth, no serial prints. Use the ESP32-C3’s ULP co-processor to toggle the sensor power MOSFET while the main core stays off. On ATmega, use the watchdog timer for wakeups—no RTC needed.

c
// ATmega328P watchdog sleep, 8 s max per cycle
#include <avr/sleep.h>
#include <avr/wdt.h>

ISR(WDT_vect) { wdt_disable(); }

void sleep_5min() {
  for (uint8_t i = 0; i < 38; i++) { // 38 × 8 s ≈ 5 min
    wdt_enable(WDTO_8S);
    WDTCSR |= _BV(WDIE);
    set_sleep_mode(SLEEP_MODE_PWR_DOWN);
    sleep_mode();
  }
}
⚠️
WarningLoRaWAN duty-cycle limits (1% in EU868) mean you can’t transmit every 5 minutes on SF12. Either shorten payloads, increase spreading factor only when needed, or accept longer intervals.

Antenna & Enclosure Reality Check

A quarter-wave wire (86 mm at 868 MHz) taped to the PCB edge works. A helical coil saves space but drops 3–4 dB. Keep metal—batteries, screws, the buck inductor—at least 10 mm from the antenna. Conformal coat the board; condensation kills marginal link budgets faster than low voltage.

"

"The best low-power design is the one you never have to touch after deployment."

— Philipp Bolliger, Things Network Zurich

Validation Checklist Before Deploy

Log sleep current for 24 h. Verify LoRa ACK rate >95% at max range. Confirm battery voltage stays above 2.5 V (buck dropout) for the full temperature range. Label each node with deploy date and expected battery swap.


✦

Grab the KiCad files, platformio.ini, and a 3D-printable case from the repo. Flash, seal, mount—then check your dashboard in six months.

Share𝕏 Twitterin LinkedInin Whatsapp