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.
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.
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++
- Implemented low-level C++ drivers to communicate with the environmental sensors.
- Handled data acquisition, calibration, and error conditions.
- Used timers + ISR-based techniques for frequency-driven sensors.
- Documented the firmware with Doxygen.
Results
- The AWS operated independently in Antarctica for a full year.
- Reduced active runtime from ~10 minutes to ~1 minute 30 seconds per cycle.
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.