Automatic Weather Station (AWS) – Embedded Firmware


Overview

The AWS project is a data logger for climate research: an instrument that weather researchers at the university can rely on for their research, built to replace the very expensive data loggers on the market. The station is built around a custom PCB with an ATmega2560, reads a suite of meteorological sensors, and transmits data over an Iridium satellite modem every 10 minutes.

I develop embedded firmware for the station: low-level sensor drivers, a modular finite state machine, and the low-power sleep mode that makes long-term deployment possible. This work was presented at the 21st Workshop on Antarctic Meteorology and Climate (WAMC, June 2026), supported by the NSF Antarctic Automatic Weather Station program.

View Poster (PDF) →

ATmega2560 Iridium telemetry 32 → 7 mA idle 10-min data cadence Doxygen docs
AWS station hardware
AWS hardware system (deployment-ready enclosure)

How It Works

The station runs on a 10-minute cycle: the board wakes, takes about a minute to measure the sensors and send the data over the Iridium satellite modem, then sleeps for about 8 minutes and 30 seconds. An RTC alarm wakes the board again, ensuring a measurement is sent out every 10 minutes.

Temperature

PRTs

Pressure

215AX Barometer

Humidity

HMP155A

Snow Accumulation

SR50A

Radiation

Radiometer

Wind

RM Young

What I Built

1) Low-Power Sleep Mode (32 mA → 7 mA)

My first real task was figuring out how to put the board to sleep to save energy. The first idea was to use the MCU's external reset pin and let the RTC alarm reset the board, but the RTC holds the reset pin, and a board held in reset can never clear the alarm. Instead, the firmware monitors an interrupt pin to detect when the alarm triggers and wakes the board.

To cut idle power, the firmware turns off the translators that power every sensor and the Iridium satellite modem, and sleeps the MCU using its internal power-management module. Instead of staying on all the time, the board now spends most of each 10-minute cycle asleep.

2) Modular, Sensor-Based State Machine

The state machine was originally organized around the MCU's internal modules (ADC, timers, and so on). I restructured it around the sensors and the Iridium modem instead, so adding a new sensor or new functionality is now a modular, self-contained change.

Finite State Machine diagram
Finite state machine controlling collection / processing / error handling

3) Unified Frequency Sampling (Wind & Barometer)

The wind sensor and barometer needed two different sampling frequencies, but I found a way to use the same sampling method for both: one timer triggers a flag after a measurement window of 2 to 4 seconds, while a second timer, clocked externally by the sensor's output, counts the incoming pulses during that window.

4) Sensor Drivers in C++

Barometer driver snapshot
Snapshot of barometer driver
Firmware testing / debug
Firmware validation and debugging during test runs

Results

Reduced idle-mode power consumption by ~78% (32 mA → 7 mA)

Current Work: Local NAND Flash Storage

I am currently adding local storage on NAND flash so the station keeps an on-board record. During field season, researchers can read the fault flags and other diagnostics directly from the board to check whether something went wrong.