Skip to the content
PCBKitNew board
4 layers46 × 46 mmU anemometer, the printed circuit board in 3D

U anemometer

PandoroML/LOAF14

LOAF (Local Observations and Atmospheric Forecasting) is an open source hyperlocal weather forecasting combining gridded forecasts with local station observations using machine learning and open-source hardware.

Size
46 × 46 mm
Copper layers
4
Thickness
1.6 mm
Parts
144
Nets
131
Pads
474
Tracks, vias
1,277, 201
Pours
6
Routed
Yes
KiCad
KiCad 9.0 (file 20241229)
Created
19 Dec 2025
Updated
30 Oct 2026

Overview

U anemometer is an open-source printed circuit board by PandoroML, from the PandoroML/LOAF repository on GitHub, published under the MIT licence. It is a 4-layer board of 46 × 46 mm with 144 parts on 131 nets, routed with 1,277 tracks and 201 vias.

It is built around the STM32L476RGT6, LMV358B-VR and BMI270, with the TMUX4052PWRQ1, XC6206P332MR and 1.25T-14AW among its other parts. Its parts include 46 capacitors, 41 resistors, 21 diodes, 8 ICs and 2 transistors. It belongs with the sensors and measurement boards and the STM32 boards of this library.

Main components

12

README

README.md

LOAF (Local Observations and Atmospheric Forecasting)

Open source hyperlocal weather forecasting combining machine learning forecast models with local station observations.

  • Do you want to improve the weather forecasts at a specific place?
  • Do you have access to local sensors or are intersted in building them?
  • Are you interested in understanding the full process and not relying on big tech companies hiding proprietary algorithms to do so?

If you answered yes to all of the above, then LOAF is for you.

Part of Pandoro — Bread Board Foundry's open science ML tools for climate and environmental research.

This is definitely a work in progress, so stay tuned!

Planned Architecture

text
┌─────────────────┐      ┌─────────────────────────────────────┐      ┌─────────────────┐
│  DIY Sensors    │ ──── │          Raspberry Pi               │ ──── │ Home Assistant  │
│  (Anemometer,   │      │  • Data storage                     │      │                 │
│   Temperature,  │      │  • ML forecast processing           │      │  Weather entity │
│   etc.)         │      │  • Local prediction generation      │      │  integrations   │
└─────────────────┘      └─────────────────────────────────────┘      └─────────────────┘

Data Flow:

  1. Sensors → Raspberry Pi: Local sensors connect to the Pi via a common sensors library, logging observations to local storage
  2. Forecast Processing: The Pi runs the trained ML model, combining local sensor data with regional forecasts (HRRR/GFS) to generate hyperlocal predictions
  3. Home Assistant Integration: Predictions are exposed as Home Assistant entities, allowing integration with automations, dashboards, and alerts

Latest Cool Picture

The first of the ultrasonic transducers have arrived!

IMG_9646

Current priorities:

  • Set up HRRR/MADIS data pipeline
  • Train regional model and validate against local observations
  • Deploy the model to local hardware (raspberry pi)
  • Create Home Assistant widget for local wind predictions

Why LOAF?

Standard weather forecasts operate on 3km grids. That resolution can't capture the wind patterns at your specific site—whether it's a backyard wind turbine, a fire-prone hillside, or a remote research station.

Recent ML research shows that fusing gridded forecasts with local sensor data via transformers can reduce prediction error by up to 80%. Commercial services like Tomorrow.io offer this, but they're proprietary and subscription-based. The academic code exists, but there's no easy way to go from "I have a Raspberry Pi" to "I have an improved local forecast."

LOAF bridges that gap: open source hardware, open source models, no vendor lock-in. Build a sensor, train a model for your region, run inference locally.

About

LOAF generates hyperlocal weather forecasts for locations without nearby weather stations by combining:

  • Regional forecast models (NOAA GFS, HRRR, ERA5)
  • Sparse local weather station observations
  • Multi-modal transformer architecture for spatial-temporal fusion

Built on research from MIT Earth Intelligence Lab:

Hardware

LOAF uses open source hardware with no vendor lock-in:

  • Sensor: DIY ultrasonic anemometer
  • Logger: Raspberry Pi with RS-485/SDI-12 interface and 3D printed enclosure for predictions
  • Power: Solar panel + battery for remote deployment

Use Cases

  • Off-grid environmental monitoring sites
  • Research locations without dedicated weather infrastructure
  • Applications requiring forecast transparency and hardware specifications for reproducibility

Features

  • Corrects systematic biases in large-scale forecast models for local conditions
  • Hardware-transparent infrastructure for reproducible research
  • Clear documentation for researchers without ML engineering backgrounds
  • Combines numerical weather predictions with station measurements

Related Projects

Documentation

See the full documentation here: https://pandoroml.github.io/LOAF/

Development Plans

How to Run

The pipeline is: download data → train a model → serve forecasts over REST. Commands below assume you're in the repo root and have installed the package (pip install -e ".[dev]"). They use config/arlington.yaml (DCA, IAD, BWI, HEF, MRB stations); swap in config/seattle.yaml for the PNW region instead.

Quickest path: one command

loaf-pipeline chains download → train → serve for you:

bash
loaf-pipeline --config software/config/arlington.yaml \
    --start-date 2024-10-01 --end-date 2024-12-31 --year 2024 --port 5000

It blocks on the running server at the end, so leave it running and query it from another terminal (see step 4 below). Useful flags for resuming a partial run:

  • --skip-download — reuse whatever's already in data/
  • --skip-train --checkpoint <path> — skip straight to serving an existing checkpoint
  • --no-serve — stop after training, print the checkpoint path, and exit
  • --use-hrrr / --use-era5 — also download and fuse gridded forecasts (see step 1)

Run loaf-pipeline --help for the full flag list (it's the union of the three commands below).

Run loaf-report-summary --runs-dir runs after any batch of training runs to summarize results all modeling attempts in /runs.

Or, step by step

Useful if you want to inspect data between steps, retrain from already-downloaded data, or swap in a different checkpoint without retraining.

1. Download station observations (IEM/ASOS — no registration required):

bash
loaf-download-iem --config software/config/arlington.yaml \
    --start-date 2024-10-01 --end-date 2024-12-31

This is the minimum needed to train. Optionally fuse gridded forecasts too — HRRR needs no auth (AWS S3), ERA5 needs a free CDS API key in ~/.cdsapirc:

bash
loaf-download-hrrr --config software/config/arlington.yaml \
    --start-date 2024-10-01 --end-date 2024-12-31
loaf-download-era5 --config software/config/arlington.yaml \
    --start-year 2024 --end-year 2024

All three write into data/ in the current directory by default.

2. Train a model (MPNN or ViT backbone):

bash
loaf-train --config software/config/arlington.yaml --year 2024
# add --model-type vit, --epochs N, --use-hrrr, or --use-era5 as needed

Writes best.pt / last.pt checkpoints and a train_log.csv to runs/arlington_<timestamp>/.

3. Serve forecasts over REST:

bash
loaf-serve --checkpoint runs/arlington_<timestamp>/best.pt --port 5000

4. Query it (e.g. Reagan National Airport, Arlington VA):

bash
curl "http://localhost:5000/api/forecast?lat=38.8512&lon=-77.0402"
curl http://localhost:5000/api/forecast/all   # every station in the graph
curl http://localhost:5000/health

Each response includes multi-horizon u/v wind predictions plus derived wind_speed and wind_direction, ready to wire into a Home Assistant REST sensor.

License

MIT

Citation

If you find this project useful for your research or applications, please kindly cite using this BibTeX::

bibtex
@software{Johnson_LOAF_Local_Observations_2026,
author = {Johnson, Keenan and Kim, Susie},
month = jan,
title = {{LOAF (Local Observations and Atmospheric Forecasting)}},
url = {https://github.com/PandoroML/LOAF},
year = {2026}
}

Contact


Built by Bread Board Foundry

Cool Picture Archive

The first pcb went to fab for our ultrasonic anemometer build inspired by QingStation. The first version is very similiar to the Ultrasonic Anemometer in QingStation, but it simplified by removing parts we don't need for now and updated to included parts that are easily purchaseable, as some parts in Qing have gone end of life.

a6b5123db6724e5dabc65f7b7b04693a_T

Parts

144
QtyValueFootprintReferences
161N4148WS T4ProDoc_1-PCB_PCB_2021-01-26_22-01-27_2026-01-16:SOD-323_L1.8-W1.3-LS2.5-RDD4, D5, D6, D7, D8, D9, D10, D11, D12, D13, D14, D15, D16, D17, D18, D19
1510KProDoc_1-PCB_PCB_2021-01-26_22-01-27_2026-01-16:R0402R2, R13, R14, R17, R18, R19, R20, R22, R23, R27, R28, R29, R37, R38, R41
12100nFProDoc_1-PCB_PCB_2021-01-26_22-01-27_2026-01-16:C0402C8, C17, C18, C19, C21, C26, C33, C35, C40, C46, C51, C52
10100KProDoc_1-PCB_PCB_2021-01-26_22-01-27_2026-01-16:R0402R3, R8, R9, R11, R15, R25, R30, R34, R35, R39
102.2uFProDoc_1-PCB_PCB_2021-01-26_22-01-27_2026-01-16:C0603C25, C27, C28, C29, C30, C37, C38, C41, C42, C43
94.7KProDoc_1-PCB_PCB_2021-01-26_22-01-27_2026-01-16:R0402R12, R16, R21, R26, R31, R32, R33, R36, R40
54.7uFProDoc_1-PCB_PCB_2021-01-26_22-01-27_2026-01-16:C0603C4, C14, C16, C36, VBAT1
41.25T-1-4AProDoc_1-PCB_PCB_2021-01-26_22-01-27_2026-01-16:CONN-TH_1.25T-1-4ACAN1, I2C1, UART1, UART2
41.25T-2P-DPProDoc_1-PCB_PCB_2021-01-26_22-01-27_2026-01-16:CONN-TH_2P-P1.25_1.25T-2P-DPEAST1, NORTH1, SOUTH1, WEST1
410pFProDoc_1-PCB_PCB_2021-01-26_22-01-27_2026-01-16:C0402C3, C5, C6, C7
41uFProDoc_1-PCB_PCB_2021-01-26_22-01-27_2026-01-16:C0603C24, C32, C34, C44
41uFProDoc_1-PCB_PCB_2021-01-26_22-01-27_2026-01-16:C0402C1, C2, C13, C22
310nFProDoc_1-PCB_PCB_2021-01-26_22-01-27_2026-01-16:C0402C9, C15, C23
333ProDoc_1-PCB_PCB_2021-01-26_22-01-27_2026-01-16:R0402R4, R5, R24
21KProDoc_1-PCB_PCB_2021-01-26_22-01-27_2026-01-16:R0603R6, R7
24padProDoc_1-PCB_PCB_2021-01-26_22-01-27_2026-01-16:PAD 4SWD1, UART3
2B3U-1000PProDoc_1-PCB_PCB_2021-01-26_22-01-27_2026-01-16:KEY-SMD_B3U-1000PMRST1, SW1
2MAX3222EIPWRProDoc_1-PCB_PCB_2021-01-26_22-01-27_2026-01-16:TSSOP-20_L6.5-W4.4-P0.65-LS6.4-BLU4, U6
2SI2301CDS-T1-GE3ProDoc_1-PCB_PCB_2021-01-26_22-01-27_2026-01-16:SOT-23-3_L3.0-W1.7-P0.95-LS2.9-BRQ1, Q2
1ProDoc_1-PCB_PCB_2021-01-26_22-01-27_2026-01-16:Pad_e1544
1ProDoc_1-PCB_PCB_2021-01-26_22-01-27_2026-01-16:Pad_e1542
1ProDoc_1-PCB_PCB_2021-01-26_22-01-27_2026-01-16:Pad_e1543
1ProDoc_1-PCB_PCB_2021-01-26_22-01-27_2026-01-16:Pad_e1541
10ProDoc_1-PCB_PCB_2021-01-26_22-01-27_2026-01-16:R0402R10
11.25T-8A_C722648ProDoc_1-PCB_PCB_2021-01-26_22-01-27_2026-01-16:CONN-TH_1.25T-8ASPI1
1100nFProDoc_1-PCB_PCB_2021-01-26_22-01-27_2026-01-16:C0603C31
1100uFProDoc_1-PCB_PCB_2021-01-26_22-01-27_2026-01-16:CAP-SMD_L3.5-W2.8C12
1120ProDoc_1-PCB_PCB_2021-01-26_22-01-27_2026-01-16:R0603R1
122pFProDoc_1-PCB_PCB_2021-01-26_22-01-27_2026-01-16:C0402C39
12328702-8ProDoc_1-PCB_PCB_2021-01-26_22-01-27_2026-01-16:23287028DEBUG1
125MProDoc_1-PCB_PCB_2021-01-26_22-01-27_2026-01-16:OSC-SMD_4P-L3.2-W2.5-BLX2
132.768KHzProDoc_1-PCB_PCB_2021-01-26_22-01-27_2026-01-16:OSC-SMD_L2.0-W1.2X1
14.7uFProDoc_1-PCB_PCB_2021-01-26_22-01-27_2026-01-16:C0402C45
147346-0001ProDoc_1-PCB_PCB_2021-01-26_22-01-27_2026-01-16:MICRO-USB-SMD_47346-0001USB1
1B2B-XH-A-GUProDoc_1-PCB_PCB_2021-01-26_22-01-27_2026-01-16:CONN-TH_B2B-XH-A-GUBAT1
1B5819W_C8598ProDoc_1-PCB_PCB_2021-01-26_22-01-27_2026-01-16:SOD-123_L2.8-W1.8-LS3.7-RDD3
1BMI270ProDoc_1-PCB_PCB_2021-01-26_22-01-27_2026-01-16:LGA-14_L3.0-W2.5-P0.50-BLU9
1KT-0603RProDoc_1-PCB_PCB_2021-01-26_22-01-27_2026-01-16:LED0603-R-RDLED2
1LMV358B-VRProDoc_1-PCB_PCB_2021-01-26_22-01-27_2026-01-16:MSOP-8_L3.0-W3.0-P0.65-LS5.0-BLU7
1NUP1105LT1GProDoc_1-PCB_PCB_2021-01-26_22-01-27_2026-01-16:SOT-23-3_L2.9-W1.3-P1.90-LS2.4-BRD1
1SDCARD MOLEX 1040310811ProDoc_1-PCB_PCB_2021-01-26_22-01-27_2026-01-16:1040310811SD1
1SN65220DBVRProDoc_1-PCB_PCB_2021-01-26_22-01-27_2026-01-16:SOT-23-6_L2.9-W1.6-P0.95-LS2.8-BRD2
1STM32L476RGT6ProDoc_1-PCB_PCB_2021-01-26_22-01-27_2026-01-16:LQFP-64_L10.0-W10.0-P0.50-LS12.0-BLU2
1TCAN330GDCNRProDoc_1-PCB_PCB_2021-01-26_22-01-27_2026-01-16:SOT-23-8_L3.0-W1.7-P0.65-LS2.8-BLU1
1TMUX4052PWRProDoc_1-PCB_PCB_2021-01-26_22-01-27_2026-01-16:TSSOP-16_L5.0-W4.4-P0.65-LS6.4-BLU5
1XC6206P332MRProDoc_1-PCB_PCB_2021-01-26_22-01-27_2026-01-16:SOT-23-3_L2.9-W1.6-P1.90-LS2.8-BRU3
1XL-1608UBC-06AProDoc_1-PCB_PCB_2021-01-26_22-01-27_2026-01-16:LED0603-R-RDLED1

The 141 most common of 144 parts.

Questions

How big is the U anemometer PCB?

It measures 46 × 46 mm and has 4 copper layers, 1.6 mm thick.

What parts does the U anemometer use?

144 parts, built around the STM32L476RGT6, LMV358B-VR, BMI270 and TMUX4052PWRQ1. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.

Where can I download the U anemometer KiCad files?

From the PandoroML/LOAF repository on GitHub, at the commit this page was made from: the board is hardware/anemometers/ultrasonic/pcb/u_anemometer.kicad_pcb and its schematic hardware/anemometers/ultrasonic/pcb/1_mcu.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the U anemometer design in my own project?

Its repository publishes it under the MIT licence: you may reuse it on that licence's terms (keep the author's notice, and for a copyleft licence share your changes alike).

Similar boards

  • 4 layers160 × 100 mmSmu main, the printed circuit board in 3D

    Smu main

    PaulBichl/vibepcb-smu

    VibePCB example: 4-quadrant SMU (+-30 V / +-1 A, USB-C PD, Ethernet) designed with an LLM

    244 parts1
  • 2 layers205 × 190 mmControl 1v2, the printed circuit board in 3D

    Control 1v2

    PubInv/high-amp-controller-board

    A PCB assembly for controlling up to 60 amps of power for electolysis of electroplating

    350 partsAGPL-3.0
  • 2 layers110 × 125 mmChaincom test, the printed circuit board in 3D

    Chaincom test

    ToonVanEyck/OpenFlap

    The OpenFlap project aims to create a open source, affordable split-flap display for the makers and tinkerers of the world.

    182 parts98
  • 4 layers135 × 84 mmStepper with TMC2209 controller board V1, the printed circuit board in 3D

    Stepper with TMC2209 controller board V1

    JasonHEngineering/DIY-Robot-Arm-V3

    1) Along with using with TMC2209 motor drivers, I have removed R8, R15, R16, R17, R18, R19 because the R value was accidentally too high. I have shorted R8, R16, R17, and left open R15, R18, R19.

    95 parts2
  • 4 layers88.9 × 96.5 mmErs s32-board, the printed circuit board in 3D

    Ers s32-board

    schrodlm/nxp_hal

    In this assignment the target platform changes from the STM32F407 to the NXP S32K118, an Arm Cortex‑M0+ microcontroller from the S32K1xx automotive family.

    138 parts
  • 2 layers80 × 50 mmLED Indicators, the printed circuit board in 3D

    LED Indicators

    aaronsilinskas/aura-prototype

    A monorepo to prototype Aura Game Engine core features.

    34 parts1MIT
  • 4 layers51.4 × 60.6 mmGb rp2040 cart, the printed circuit board in 3D

    Gb rp2040 cart

    deltabeard/DBGC

    A Game Boy cartridge using the Raspberry Pi RP2040 with RTC and MBC support.

    67 parts57
  • 4 layers150 × 120 mmTester, the printed circuit board in 3D

    Tester

    eurovibes/rack-ser-adapter

    rack-ser-adapter is provided under the terms of the CERN-OHL-S license version 2 as provided in the LICENSES/CERN-OHL-S-2.0 file.

    144 parts1CERN-OHL-S-2.0