Projects IoT

Aether — Solar Weather Station

An ESP32-S3 weather station with BME688 and wind/rain sensors, LoRa uplink, and a solar + LiFePO4 power budget sized to survive monsoon season.

Active since Jul 2025 #esp32#lora#solar-power#sensors
38 µA
Deep-sleep current
5 min
Reporting interval
1.8 km
LoRa link distance
21
Days of battery reserve

Aether exists because every consumer weather station I looked at either needed mains power, a proprietary hub, or both. I wanted a node I could bolt to a roof, forget about for a year, and query from anywhere — which turned this into a power-budgeting project wearing a weather station costume.

Architecture

An ESP32-S3 wakes every five minutes, samples a BME688 over I2C, reads pulse counts from a hall-effect anemometer and a tipping-bucket rain gauge (accumulated by the ULP coprocessor while the main cores sleep), and fires one LoRa packet at SF9 to a gateway 1.8 km away. The gateway is a Pi Zero 2 W that bridges packets into MQTT; Grafana renders the dashboard. Total awake time per cycle is about 1.4 seconds, most of it LoRa airtime.

The µA math

The whole design hangs on the sleep current. A 6 Ah LiFePO4 cell and a 2 W panel sound generous until you do the arithmetic for three weeks of overcast monsoon sky. My budget: 38 µA sleeping, ~90 mA average for 1.4 s awake, 288 wakes a day — roughly 11 mAh/day, giving 21+ days of reserve with zero solar input. LiFePO4 over Li-ion because it tolerates the 45 °C enclosure temperatures and 2000+ shallow cycles without complaint.

The problem: 2.1 mA that shouldn’t exist

The first board slept at 2.1 mA — 55x over budget. The culprits, found one by one with a µCurrent meter: the LoRa module’s SPI lines back-powering the radio through its protection diodes, and a “low-power” LDO with 400 µA quiescent draw. The fix was explicit pin teardown before sleep and a swap to a TPS7A02:

void prepareSleep() {
  radio.sleep();                       // SX1276 register sleep: ~1 µA
  for (auto pin : {SCK, MISO, MOSI, RADIO_CS})
    rtc_gpio_isolate((gpio_num_t)pin); // stop back-powering via SPI
  esp_deep_sleep_start();
}

Lesson learned: datasheet sleep currents describe the chip, not your board. The station has now logged 90 days without a gap, including a two-week stretch where the panel produced almost nothing.

Development timeline

  1. 2025-07

    Breadboard prototype

    BME688 and LoRa radio talking on a bench supply.

  2. 2025-09

    Power budget rework

    Cut sleep current from 2.1 mA to 38 µA after hunting down leaky rails.

  3. 2025-12

    Outdoor deployment

    Weatherproof enclosure on the roof, panel angled for winter sun.

  4. 2026-03

    Dashboard live

    Grafana dashboard with 90 days of uninterrupted data.