Skip to the content
2 layers59.8 × 109.3 mmLoraWeatherstation, the printed circuit board in 3D

A simple stand-alone self-sufficient weather station using LoRa for data transmission

Size
59.8 × 109.3 mm
Copper layers
2
Thickness
1.6 mm
Parts
50
Nets
40
Pads
135
Tracks, vias
158, 9
Pours
3
Routed
Yes
KiCad
KiCad 8.0 (file 20240108)
Created
4 Sep 2024
Updated
12 Oct 2025

Overview

LoraWeatherstation is an open-source printed circuit board by 3komma3volt, from the 3komma3volt/LoRaWeatherStation_Hardware repository on GitHub, published under the MIT licence. It is a 2-layer board of 59.8 × 109.3 mm with 50 parts on 40 nets, routed with 158 tracks and 9 vias.

It is built around the SP3485EN-Y, ZMM3V3-M and AO3401A, with the PSM712 among its other parts. Its parts include 17 resistors, 11 connectors, 5 capacitors, 3 ICs and 3 diodes. It belongs with the radio and wireless and home automation and IoT boards of this library.

Main components

4

README

readme.md

LoRa Weather Station

The project was born for testing LoRa devices an has grown to a small weather station ecosystem. Since August 2002, there are 6 station outside running without any maintenance.

Station

Features

  • Completely 3D printed main body
  • Modular with optional extension
  • Simple PCB which can be hand assembled
  • Stations can be equipped with sensors as needed, they don't have to be the same kind
  • Using TheThingsStack for receiving data
  • Storage and analysis of data using a PHP framework (other repository)

Housing

Rendering

The main housing consists of:

  • Main housing
  • Front door
  • Sensor cover or light sensor mount
  • 2x side dust filter fixture
  • Front door dust filter fixture

On the sides and in the front door, there is the possibility to mount some 3mm fleece filters to prevent dust going into the housing and keep bugs out. A disadvantage is, that the inside gets a bit hotter if exposed to the sun. The best mounting position of the station is 2m from the ground facing north and protected from sun exposure (The solar cell will get enough light to charge the battery). A 80x55mm 7V solar cell is used to charge the battery. The solar cell is glued to the main body using silicone glue. This works great to keep rain out, On the bottom is a intended breaking point to mount 12mm screw connectors for external sensors e.g. rain sensor or wind direction sensor. On the left side is a hole for mounting a SMA connector for the LoRa antenna. The housing can be mounted on a wall using a hook or screw.

PCB

The PCB is kept simple, so it can be assembled by hand. It has to be screwed into the main body using M3x8 (or similar length, there is plenty of space for longer screws)

PCB

It is possible to use it just as carrier board, in this case, no component needs to be assembled. For easier installation, XH connectors are used to connect sensors, battery, solar cell etc. The CubeCell AB01 board is the brain of the weather station. It has a battery connector on its bottom side. For easier replacement of board or battery, this connector is connected with the PCB which again connects to the battery. A BME280 board is connected using a standard header, so it can be replaced easily.

Wiring

Two holes on the lower side of the PCB are for mounting a lithium battery using zip ties. A standard 1000mA 3.7V LIPO battery works great and never ran out even on cold and dark winter weeks.

Wind Direction Sensor

Winddir

The wind direction sensor uses 8 reed contacts, a I2C port expander, a bearing (608ZZ) and a paddle to read the wind direction.

Winddir2

Only the expander and some few components need to be assembled.

WindAssemly

The reed contacts are pushed through the sensor main body, On the upper side, a short wire has to be soldered to the reed contact and threaded through the second hole. The sensor and wire are then soldered to the sensor PCB. A ⌀6x3mm magnet is glued into the sensor pin.

Wind Speed Sensor

WindSpeedAndDir

The wind speed sensor using the same style bearing and manget like the direction sensor. It only consists of one reed contact. This sensor is an early alpha state, because the baring is to difficult to move and won't turn on low wind speeds. Maybe switching to a off-the-shelf product for this use case.

Rain sensor

The 3D printed version of a rain sensor was not reliable enough. A cheap off the shelf sensor which is sold as spare part for weather stations works well.

Light sensor

A VEML7700 can be mounted on the side of the main body. For this print the mount and install the sensor within the mount. Fill up the space with transparent silicone. It will get watertight and works well.

Firmware

The firmware is made using PlatformIO and the Heltec development platform. Simply open with VSCode and edit the platform.ini You can change following build flags:

  • ENABLE_RAINSENSOR=0 ; enables the rain drip sensor
  • ENABLE_BRIGHTNESSENSOR=1 ; enables the brightness sensor
  • ENABLE_WINDDIRSENSOR=0 ; enables the wind direction sensor
  • ENABLE_WINDSPEEDSENSOR=0 ; enables the winds speed sensor
  • DEBUG_UART=0 ; enables UART data sending for debug purposes

Enable the functionalities as wanted.

Wind speed and direction are BETA!

As brightness sensor the VEML7700 is used. The BH1750 was also tested, but the results with this sensor were not really great. It was not really possible to get the cheap housing with the light dome watertight and several sensors died after a few days. If you want to use the BH1750, some changes in the code are necessary since this parts were removed.

Then hook up with TheThingsStack. There add a new device and get the neccessary data for OTAA transmission. Insert the information in the src/ttnparams.h file.

You probably will need a payload formatter for each individual weather station, since not all stations must have the same functionallity.

Here is a example formatter:

text
function Decoder(bytes, port) {
var temperature = (bytes[0] << 8 | bytes[1]);
var humidity = (bytes[2] << 8 | bytes[3]);
var pressure = ((bytes[4]) << 24) + ((bytes[5]) <<  16) + ((bytes[6]) << 8) + ((bytes[7]));
var battery = (bytes[8] << 8) | bytes[9];
var unused = (bytes[10] << 8) | bytes[11]; // formally used for battery percent calculation
var brightness = (bytes[12] << 8) | bytes[13];
var rain = bytes[14];

var lux = brightness * 2.1504; // Datasheet: Gain 1/8, 25ms integration time
lux = Math.round(6.0135e-13 * Math.pow(lux, 4) - 9.3924e-9 * Math.pow(lux, 3) + 8.1488e-5 * Math.pow(lux, 2) + 1.0023 * lux);

var sensorSqure = 10.9 * 4.9; // for round rain sensors: sensorSqure = Math.PI * pow(sensorRadius, 2);
var tipsPer100ml = 100 / 1.5;
var mlPerTip = 100 / $tipsPer100ml;
var rainAmount = $mlPerTip / $sensorSqure;

return {
  temperature: temperature / 100,
  humidity: humidity,
  pressure: pressure / 100,
  battery: battery / 1000,
  brightness: lux,
  rain: rainAmount
  }
}

If a station doesnt have a specific feature, just remove it from the return. The value has to be null to indicate, that the sensor is not available.

Example formatter for the most basic station just with a BME280:

text
function Decoder(bytes, port) {
var temperature = (bytes[0] << 8 | bytes[1]);
var humidity = (bytes[2] << 8 | bytes[3]);
var pressure = ((bytes[4]) << 24) + ((bytes[5]) <<  16) + ((bytes[6]) << 8) + ((bytes[7]));
var battery = (bytes[8] << 8) | bytes[9];
var unused = (bytes[10] << 8) | bytes[11]; // formally used for battery percent calculation

return {
  temperature: temperature / 100,
  humidity: humidity,
  pressure: pressure / 100,
  battery: battery / 1000,
  }
}

Parts

50
QtyValueFootprintReferences
6Conn_01x02_PinConnector_JST:JST_XH_B2B-XH-A_1x02_P2.50mm_VerticalJ1, J2, J3, J6, J7, J11
6MountingHoleMountingHole:MountingHole_3.2mm_M3H1, H2, H3, H4, H5, H6
410Resistor_SMD:R_0603_1608MetricR4, R5, R11, R14
3100kResistor_SMD:R_0603_1608MetricR2, R3, R16
310nCapacitor_SMD:C_0603_1608MetricC2, C3, C4
3MountingHoleMountingHole:MountingHole_2.7mmH7, H8, H9
20Resistor_SMD:R_0603_1608MetricR13, R15
20RResistor_SMD:R_0603_1608MetricR6, R7
2100nCapacitor_SMD:C_0603_1608MetricC1, C5
2470Resistor_SMD:R_0603_1608MetricR1, R10
24k7Resistor_SMD:R_0603_1608MetricR8, R9
2Conn_01x04_PinConnector_JST:JST_XH_B4B-XH-A_1x04_P2.50mm_VerticalJ5, J8
2ZMM3V3-MDiode_SMD:D_MiniMELFD1, D2
1120Resistor_SMD:R_0603_1608MetricR12
147kResistor_SMD:R_0603_1608MetricR17
1ADS1110Package_TO_SOT_SMD:SOT-23-6U4
1AO3401APackage_TO_SOT_SMD:SOT-23Q1
1Conn_01x03_PinConnector_JST:JST_XH_B3B-XH-A_1x03_P2.50mm_VerticalJ9
1Conn_01x04Connector_JST:JST_XH_B4B-XH-A_1x04_P2.50mm_VerticalJ12
1Conn_01x06_PinConnector_PinSocket_2.54mm:PinSocket_1x06_P2.54mm_VerticalJ4
1PSM712Package_TO_SOT_SMD:SOT-23D3
1SP3485ENPackage_SO:SOIC-8_3.9x4.9mm_P1.27mmU3
1TestPointTestPoint:TestPoint_Pad_D1.5mmTP1
1~Heltec:CubeCellAB01U1

More from 3komma3volt/LoRaWeatherStation_Hardware

1
  • 2 layersWinddirsensor, the printed circuit board in 3D

    Winddirsensor

    3komma3volt/LoRaWeatherStation_Hardware

    A simple stand-alone self-sufficient weather station using LoRa for data transmission

    38 parts2MIT

Similar boards

  • 2 layers65 × 45 mmBetaBoard, the printed circuit board in 3D

    BetaBoard

    timbk/BetaBoard

    A simple and low cost particle detector for teaching

    132 parts85BSD-2-Clause
  • 4 layers100.5 × 87.7 mmLichtstab, the printed circuit board in 3D

    Lichtstab

    kilimnik/lichtstab

    151 parts
  • 2 layers125 × 145 mmMPPT, the printed circuit board in 3D

    MPPT

    lhr-solar/Power-Generation-Sunscatter

    The current maintainer of this project is Matthew Yu as of 07/16/2023. His email is matthewjkyu@gmail.com.

    134 parts
  • 4 layers106 × 63.5 mmBrineomatic, the printed circuit board in 3D

    Brineomatic

    hoeken/brineomatic

    Open Source Watermaker Controller.

    323 parts47LGPL-2.1
  • 2 layers60 × 63 mmBldc sic, the printed circuit board in 3D

    Bldc sic

    klaus-liebler/esp32-bldc-controller

    118 partsMIT
  • 2 layers90 × 48.9 mmEsp32 octal wled, the printed circuit board in 3D

    Esp32 octal wled

    klaus-liebler/esp32_octal_wled

    79 partsMIT
  • 2 layers84.5 × 54.6 mmMain board v2, the printed circuit board in 3D

    Main board v2

    felixzero/escrocs

    Repository for the ESCROCS team for the french robotics cup 2020!

    75 parts7GPL-3.0
  • 2 layers76.2 × 50.8 mmMcustm32f402, the printed circuit board in 3D

    Mcustm32f402

    STM32World/hardware

    STM32World Development Modules

    37 parts6

Questions

How big is the LoraWeatherstation PCB?

It measures 59.8 × 109.3 mm and has 2 copper layers, 1.6 mm thick.

What parts does the LoraWeatherstation use?

50 parts, built around the SP3485EN-Y, ZMM3V3-M, AO3401A and PSM712. 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 LoraWeatherstation KiCad files?

From the 3komma3volt/LoRaWeatherStation_Hardware repository on GitHub, at the commit this page was made from: the board is Schematics/Weatherstation/loraWeatherstation.kicad_pcb and its schematic Schematics/Weatherstation/loraWeatherstation.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the LoraWeatherstation 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).