Skip to the content
PCBKitNew board
4 layers80.6 × 60.6 mmLorawan sensor node v2, the printed circuit board in 3D

Solar Powered LoRaWAN Sensor Node V2

Size
80.6 × 60.6 mm
Copper layers
4
Thickness
1.6 mm
Parts
84
Nets
127
Pads
376
Tracks, vias
705, 365
Pours
9
Routed
Yes
KiCad
KiCad 9.0 (file 20241229)
Created
27 Oct 2025
Updated
28 Jan 2026

Overview

Lorawan sensor node v2 is an open-source printed circuit board by ElektorLabs, from the ElektorLabs/lorawan-sensor-node-v2 repository on GitHub, published under the GPL-3.0 licence. It is a 4-layer board of 80.6 × 60.6 mm with 84 parts on 127 nets, routed with 705 tracks and 365 vias.

It is built around the ESP32-S3-WROOM-1-N8, EWM108-GN05 and MEM2085-00-115-00-A, with the BQ25186DLHR, TPL5110QDDCRQ1 and CUHS20S30,H3F among its other parts. Its parts include 19 capacitors, 16 resistors, 15 switches, 7 ICs and 6 diodes. It belongs with the radio and wireless and home automation and IoT boards and the ESP32 boards of this library.

Main components

12

README

README.md

LoRa-Sensor-Node-v2

ESP32-S3 License

A comprehensive ESP32-S3 based sensor node that validates GPS positioning, LoRaWAN connectivity, SD card logging, battery charging, and deep-sleep power management without requiring the Arduino IDE.

🚀 Features

  • Multi-Peripheral Validation: Powers and tests GPS, LoRa modem, SD logger, and battery charger
  • Smart Power Management: Configurable deep-sleep cycles with peripheral power control
  • LoRaWAN Integration: OTAA join with synthetic telemetry transmission
  • GPS Cold Start Handling: Waits for valid GPS fix before LoRaWAN operations
  • Battery Management: BQ25186 charger monitoring and configuration
  • Comprehensive Logging: Tagged UART output and SD card data logging
  • Status Indicators: LED patterns for system health monitoring

🔧 Hardware Components

Core Platform

  • MCU: ESP32-S3 Development Module
  • GPS Module: Ebyte EWM108-GN05 (Allystar-compatible GNSS receiver)
  • LoRa Module: Ebyte LoRaWAN module with AT command interface
  • Battery Charger: BQ25186 Li-Ion battery management IC
  • Storage: MicroSD card for data logging

Pin Configuration

ComponentPinFunction
Power Control
I2C EnableGPIO 38I2C bus power control
LoRa EnableGPIO 6LoRa module power
GPS EnableGPIO 7GPS module power
Status LEDs
Red LEDGPIO 48Error/fault indication
Green LEDGPIO 47System status
I2C Bus
SDAGPIO 10I2C data line
SCLGPIO 9I2C clock line
SD Card (SPI)
MOSIGPIO 11SPI data out
SCKGPIO 12SPI clock
MISOGPIO 13SPI data in
CSGPIO 8Chip select
LoRa UART
RXGPIO 4LoRa module RX
TXGPIO 5LoRa module TX
GPS UART
RXGPIO 21GPS module RX
TXGPIO 14GPS module TX

⚙️ Configuration

All configuration is centralized in config.h using constexpr constants:

Timing Parameters

cpp
constexpr unsigned long kGpsColdStartMs = 60000;        // GPS cold start window
constexpr unsigned long kGpsLockTimeoutMs = 180000;     // GPS fix timeout
constexpr unsigned long kSensorAcquisitionMs = 15000;   // Sensor reading time
constexpr uint64_t kDeepSleepIntervalUs = 60ULL * 1000000ULL; // Sleep interval
constexpr unsigned long kLoraJoinRetryMs = 15000;       // LoRa join retry

Power Management

cpp
constexpr bool kEnableDeepSleep = true;     // Enable ESP32 deep sleep
constexpr bool kEnableStatusLeds = true;    // Enable LED indicators
constexpr float kChargeTargetCurrentMa = 520.0f;   // Battery charge current (5-1000 mA)
constexpr float kInputCurrentLimitMa = 665.0f;     // Input current limit (50-665 mA)

LoRaWAN Credentials

cpp
constexpr LoraCredentials kLoraCredentials{
    "xxxxxxxxxxxxxxxx",                    // Device EUI
    "0000000000000000",                    // Application EUI
    "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",   // Application Key
};

GPS Power Configuration

cpp
constexpr AllystarGpsPowerConfig kGpsPowerConfig{
    true,    // Enable GPS sleep/wake commands
    90000,   // Sleep duration (90 seconds)
    0x01,    // Sleep action (deep sleep)
    0x11,    // Wake mode (start command)
};

🔄 Operation Flow

  1. System Wake: ESP32 wakes from deep sleep, powers peripheral rails
  2. GPS Cold Start: Waits for GPS module to acquire satellite fix
  3. LoRaWAN Join: Performs OTAA join once GPS is ready (or timeout expires)
  4. Data Collection: Gathers GPS coordinates and battery telemetry
  5. Transmission: Sends telemetry via LoRaWAN uplink
  6. Logging: Records data to SD card with timestamps
  7. Sleep Preparation: Powers down GPS with Allystar sleep commands
  8. Deep Sleep: ESP32 enters deep sleep for configured interval

📊 Serial Output

The firmware provides tagged serial output at 115200 baud:

text
[Pwr ] Wake reason: Timer
[GPS ] Powering GPS module...
[LoRa] Powering LoRa module...
[GPS ] NMEA: $GNGGA,123456.00,4012.34567,N,07412.34567,W,1,08,1.2,45.6,M,33.2,M,,*5A
[LoRa] AT+JOIN
[LoRa] Event: join confirmed
[LoRa] Sending telemetry: 4012.34567,-07412.34567,45.6,4.12,85
[Chg ] Battery: 4.12V, Charge: 85%, Temp: 25°C
[Pwr ] Entering deep sleep for 60 seconds

📁 File Structure

text
LoRa-SenseNode-v2/
├── LoRa-SenseNode-v2.ino    # Main firmware file
├── config.h                 # Configuration constants
├── Bq25186.h               # Battery charger interface
├── EbyteGpsParser.h        # GPS NMEA parser
├── LoraAtHelpers.h         # LoRaWAN AT command helpers
├── SdCardLogger.h          # SD card logging utilities
├── TaggedStream.h          # Serial output tagging
├── ProcessFlow.md          # Detailed process documentation
├── FirmwareOverview.md     # Architecture overview
└── docs/                   # Additional documentation

🔍 Troubleshooting

LED Status Indicators

  • 2 Red Blinks: GPS fault or timeout
  • 3 Red Blinks: LoRa communication fault
  • Green Solid: System operating normally
  • LEDs Off: Status LEDs disabled in config

Common Issues

  1. GPS Not Acquiring Fix: Ensure clear sky view, check antenna connection
  2. LoRa Join Fails: Verify credentials and gateway availability
  3. SD Card Errors: Check card formatting (FAT32) and connections
  4. Power Issues: Verify battery connection and charger configuration

Debug Mode

Set kEnableDebugSerial = true and kShowRawGps = true in config.h for verbose output.

🛠️ Development

Adding New Features

  • Hardware tests: Create new sketches in src/tests/<SketchName>/
  • Experiments: Use src/claude-test/ for exploratory code
  • Helper functions: Add to existing headers or create new ones as needed

Testing Without Deep Sleep

Set kEnableDeepSleep = false in config.h to run continuous loops for bench testing.

📄 License

This project is licensed under the GNU License - see the LICENSE file for details.

🤝 Contributing

  1. Fork the repository
  2. Create a feature branch (git checkout -b feature/amazing-feature)
  3. Commit your changes (git commit -m 'Add amazing feature')
  4. Push to the branch (git push origin feature/amazing-feature)
  5. Open a Pull Request

Parts

84
QtyValueFootprintReferences
410kResistor_SMD:R_0603_1608MetricR1, R2, R4, R16
4MountingHoleMountingHole:MountingHole_3.2mm_M3H1, H2, H3, H4
3100RResistor_SMD:R_0603_1608MetricR3, R5, R8
310uFCapacitor_SMD:C_0402_1005Metric_Pad0.74x0.62mm_HandSolderC8, C12, C17
3IOConnector_JST:JST_PH_S4B-PH-SM4-TB_1x04-1MP_P2.00mm_HorizontalK1, K3, K4
3TPS22919DCKRSamacSys_Parts:SOT65P210X110-6NIC5, IC6, IC7
20.1uFCapacitor_SMD:C_0805_2012Metric_Pad1.18x1.45mm_HandSolderC2, C3
21kResistor_SMD:R_0805_2012Metric_Pad1.20x1.40mm_HandSolderR6, R7
21uFCapacitor_SMD:C_0402_1005Metric_Pad0.74x0.62mm_HandSolderC10, C11
24.7kResistor_SMD:R_0603_1608MetricR13, R14
24.7uFCapacitor_SMD:C_0402_1005Metric_Pad0.74x0.62mm_HandSolderC12, C18
2CUHS20S30,H3FSamacSys_Parts:CUHS20S40H3FD2, D3
2LOGOfootprints:elektorlabs-20x6.1mmG***, G***
10.1uFCapacitor_SMD:C_0402_1005Metric_Pad0.74x0.62mm_HandSolderC13
10.1uFCapacitor_SMD:C_0603_1608MetricC5
1100nFCapacitor_SMD:C_0402_1005Metric_Pad0.74x0.62mm_HandSolderC14
1100nFCapacitor_SMD:C_0603_1608MetricC1
110kResistor_SMD:R_0402_1005MetricR15
110nFCapacitor_SMD:C_0402_1005Metric_Pad0.74x0.62mm_HandSolderC4
11uHSamacSys_Parts:1285ASH1R0MP2L1
122uFSamacSys_Parts:CAPAE530X550NC6
122uFCapacitor_SMD:C_0603_1608MetricC9
124RResistor_SMD:R_0402_1005MetricR10
13-1478978-1SamacSys_Parts:314789781AE1
13V3 -> 3SENJumper:SolderJumper-2_P1.3mm_Open_RoundedPad1.0x1.5mmJP5
13V3 -> 3SEN1Jumper:SolderJumper-2_P1.3mm_Open_RoundedPad1.0x1.5mmJP4
13V3 -> 3SEN2Jumper:SolderJumper-2_P1.3mm_Open_RoundedPad1.0x1.5mmJP3
147uFCapacitor_SMD:C_0805_2012MetricC7
1511kResistor_SMD:R_0402_1005MetricR11
156pFCapacitor_SMD:C_0603_1608Metric_Pad1.08x0.95mm_HandSolderC15
157kResistor_SMD:R_0402_1005MetricR9
191kResistor_SMD:R_0402_1005MetricR12
1AIMC-0402-82NJ-TSamacSys_Parts:INDC1005X65NL2
1BOOTSamacSys_Parts:SKRKAEE020SW1
1BQ25186DLHRSamacSys_Parts:SON40P220X200X80-11NIC4
1BatteryConnector_JST:JST_PH_S2B-PH-K_1x02_P2.00mm_HorizontalK9
1Conn_ARM_SWD_TagConnect_TC2030Connector:Tag-Connect_TC2030-IDC-NL_2x03_P1.27mm_VerticalK11
1ENSamacSys_Parts:SKRKAEE020SW2
1ESP32-S3-WROOM-1RF_Module:ESP32-S3-WROOM-1MOD1
1EWM108-GN05EWM108-GN05:PCBComponent_1MOD3
1FM0V104ZFSamacSys_Parts:FM0V104ZFC16
1GPS UARTConnector_JST:JST_PH_S4B-PH-SM4-TB_1x04-1MP_P2.00mm_HorizontalK12
1IRLML9301TRPBFSamacSys_Parts:SOT95P237X112-3NT1
1LORA UARTConnector_JST:JST_PH_S4B-PH-SM4-TB_1x04-1MP_P2.00mm_HorizontalK10
1MEM2085-00-115-00-ASamacSys_Parts:MEM20850011500AK6
1NCD0805G1LED_SMD:LED_0805_2012Metric_Pad1.15x1.40mm_HandSolderLED1
1NCD0805R1LED_SMD:LED_0805_2012Metric_Pad1.15x1.40mm_HandSolderLED2
1PMEG2010ER,115SamacSys_Parts:PMEG2010ER115D4
1PROGConnector_PinHeader_2.54mm:PinHeader_2x03_P2.54mm_VerticalK2
1PWR SELConnector_PinHeader_2.54mm:PinHeader_1x03_P2.54mm_VerticalJP1
1QwiicConnector_JST:JST_SH_SM04B-SRSS-TB_1x04-1MP_P1.00mm_HorizontalK5
1SMF05C.TCTSamacSys_Parts:SOT65P210X110-6ND1
1Solar PanelConnector_JST:JST_PH_S2B-PH-K_1x02_P2.00mm_HorizontalK7
1TIMER SELConnector_PinHeader_2.54mm:PinHeader_1x03_P2.54mm_VerticalJP2
1TPL5110QDDCRQ1SamacSys_Parts:SOT95P280X110-6NIC1
1TPS22917DBV (L)Package_TO_SOT_SMD:SOT-23-6IC2
1TPS631000DRLRSamacSys_Parts:SOTFL50P160X60-8NIC3
1UJ20-C-H-C-3-SMT-TRExternal Library:CUI_UJ20-C-H-C-3-SMT-TRK8
1WAKE UPSamacSys_Parts:SKRKAEE020SW3
1~RF_Module:RAK3172MOD2

The 81 most common of 84 parts.

Questions

How big is the Lorawan sensor node v2 PCB?

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

What parts does the Lorawan sensor node v2 use?

84 parts, built around the ESP32-S3-WROOM-1-N8, EWM108-GN05, MEM2085-00-115-00-A and BQ25186DLHR. 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 Lorawan sensor node v2 KiCad files?

From the ElektorLabs/lorawan-sensor-node-v2 repository on GitHub, at the commit this page was made from: the board is hardware/lorawan_sensor_node-v2/lorawan_sensor_node-v2.kicad_pcb and its schematic hardware/lorawan_sensor_node-v2/Power.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the Lorawan sensor node v2 design in my own project?

Its repository publishes it under the GPL-3.0 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

  • 2 layers68.4 × 51.1 mmPb Monitor v2, the printed circuit board in 3D

    Pb Monitor v2

    ElektorLabs/Pb-Monitor-v2

    PbMonitor v2.0

    79 parts1GPL-3.0
  • 2 layers79.5 × 79.5 mmEsp32-energymeter V2, the printed circuit board in 3D

    Esp32-energymeter V2

    ElektorLabs/esp32-energymeter

    The Elektor ESP32 Energy Meter project, featuring schematics, PCB designs, and ESPHome integration for advanced energy monitoring

    116 parts48MIT
  • 2 layers70 × 20 mmPicoBerry V1.0, the printed circuit board in 3D

    PicoBerry V1.0

    mfolejewski/PicoBerry

    PicoBerry - small CM4 carrier board with full 40-pin GPIO header

    36 parts63
  • 2 layers80 × 55 mmIm01, the printed circuit board in 3D

    Im01

    amuzdgp3-prog/im-01-pulse-device

    Отдельный модуль к системе обслуживания аппаратов 2.apixspb.ru. Устройство слушает импульсные выходы монетоприёмника и купюроприёмника, копит показания в FRAM и дважды в сутки передаёт их на сервер по LTE Cat.1.

    108 parts
  • 6 layers98.9 × 81.4 mmEthernetSwitch, the printed circuit board in 3D

    EthernetSwitch

    SamuelCicuitStudio/LAN9645-STM32-Managed-Ethernet-Switch

    Managed Ethernet switch platform built around the LAN9645 and STM32H743, featuring copper and SerDes ports, SPI management, RMII, LwIP, and a USB diagnostic CLI.

    231 parts
  • 2 layers70.6 × 70.6 mmProject PCB, the printed circuit board in 3D

    Project PCB

    hhh2004/DTAP2025_Team7_PCB

    51 parts
  • 2 layers70 × 40 mmMoreE u blox E PEAS, the printed circuit board in 3D

    MoreE u blox E PEAS

    ldab/Node-RED-Energy-Harvesting-dashboard

    Node-RED Energy Harvesting dashboard example, weather forecast, temperature and humidty measurement. MQTT, ESP32, u-blox NINA-W10, HTU21D, IBM Cloud, CloudMQTT

    43 parts11MIT