

Lorawan sensor node v2
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
12ESP32-S3-WROOM-1-N8
SMD,25.5x18mm-40℃~+85℃ -98.2dBm 2.4GHz 20.5dBm 355mA 3V~3.6V 95mA Bluetooth5.0 ESP32-S3 Chip On-board PCB Antenna UART、SPI、I2C、I2S、USB SMD,25.5x18mm WiFi Modules ROHSEspressif SystemsWiFi ModulesEWM108-GN05
SMD,10.5x9.7mm-162dBm -40℃~+85℃ 1.8V~3.6V 28s 47.8mA@3.3V GPS、BDS、QZSS、Galileo、GLONASS Hot start acceleration、Dual-band / multi-band positioning、RTC backup power UART SMD,10.5x9.7mm GNSS Modules ROHSChengdu Ebyte Elec TechGNSS ModulesMEM2085-00-115-00-A
-1.15mm MicroSD Card (TF Card) Push-Pull - SD Card / Memory Card Connector ROHSGlobal Connector Technology (GCT)SD Card / Memory Card ConnectorBQ25186DLHR
WSON-10-40℃~+125℃ 1 15nA 1A 2V 3.6V~18V 4.65V Charging IC I2C Lithium Battery、LiFePO4 Battery Support Support WSON-10 Battery Management ROHSTexas InstrumentsBattery ManagementTPL5110QDDCRQ1
TSOT-23-6TSOT-23-6 Application Specific Clock/Timing ROHSTexas InstrumentsTimers / CountersCUHS20S30,H3F
SMD1 Independent 10A 2A 30V 410mV@2A 500uA@30V SMD Schottky Diodes ROHSToshibaSchottky DiodesAIMC-0402-82NJ-T
0402150mA 2.4Ω 600MHz 82nH 8@100MHz ±5% 0402 Inductors (SMD) ROHSAbraconInductors (SMD)IRLML9301TRPBF
SOT-23-55℃~+150℃ 1 P-Channel 1.3W 2.4V 3.6A 30V 388pF 4.8nC@4.5V 64mΩ@10V SOT-23 MOSFETs ROHSInfineon TechnologiesMOSFETsNCD0805G1
0805-30℃~+85℃ 130° 2.5V~3.6V 20mA 400mcd 520nm 525nm~537.5nm 72mW Discrete Diode Green 0805 LED Indication - Discrete ROHSFoshan NationStar OptoelectronicsLED Indication - DiscreteNCD0805R1
LED0805-30℃~+85℃ 1.6V~2.6V 130° 195mcd 25mA 615nm~630nm 630nm 65mW Discrete Diode Red 0805 LED Indication - Discrete ROHSFoshan NationStar OptoelectronicsLED Indication - DiscretePMEG2010ER,115-JSM
SOD-123FL-55℃~+150℃ 1 Independent 100uA@20V 1A 20V 22.5A、30A、60A 550mV@1A SOD-123FL Schottky Diodes ROHSJSMSEMISchottky DiodesSMF05C.TCT
SOT-363-6(SC-70)-55℃~+125℃ 100W 12.5V 130pF 5V 5uA 6V 8A@8/20us IEC 61000-4-2、IEC 61000-4-4 TVS Unidirectional SOT-363-6(SC-70) ESD and Surge Protection (TVS/ESD) ROHSSEMTECHESD And Surge Protection (TVS/ESD)
README
README.mdLoRa-Sensor-Node-v2
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
| Component | Pin | Function |
|---|---|---|
| Power Control | ||
| I2C Enable | GPIO 38 | I2C bus power control |
| LoRa Enable | GPIO 6 | LoRa module power |
| GPS Enable | GPIO 7 | GPS module power |
| Status LEDs | ||
| Red LED | GPIO 48 | Error/fault indication |
| Green LED | GPIO 47 | System status |
| I2C Bus | ||
| SDA | GPIO 10 | I2C data line |
| SCL | GPIO 9 | I2C clock line |
| SD Card (SPI) | ||
| MOSI | GPIO 11 | SPI data out |
| SCK | GPIO 12 | SPI clock |
| MISO | GPIO 13 | SPI data in |
| CS | GPIO 8 | Chip select |
| LoRa UART | ||
| RX | GPIO 4 | LoRa module RX |
| TX | GPIO 5 | LoRa module TX |
| GPS UART | ||
| RX | GPIO 21 | GPS module RX |
| TX | GPIO 14 | GPS module TX |
⚙️ Configuration
All configuration is centralized in config.h using constexpr constants:
Timing Parameters
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 retryPower Management
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
constexpr LoraCredentials kLoraCredentials{
"xxxxxxxxxxxxxxxx", // Device EUI
"0000000000000000", // Application EUI
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", // Application Key
};GPS Power Configuration
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
- System Wake: ESP32 wakes from deep sleep, powers peripheral rails
- GPS Cold Start: Waits for GPS module to acquire satellite fix
- LoRaWAN Join: Performs OTAA join once GPS is ready (or timeout expires)
- Data Collection: Gathers GPS coordinates and battery telemetry
- Transmission: Sends telemetry via LoRaWAN uplink
- Logging: Records data to SD card with timestamps
- Sleep Preparation: Powers down GPS with Allystar sleep commands
- Deep Sleep: ESP32 enters deep sleep for configured interval
📊 Serial Output
The firmware provides tagged serial output at 115200 baud:
[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
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
- GPS Not Acquiring Fix: Ensure clear sky view, check antenna connection
- LoRa Join Fails: Verify credentials and gateway availability
- SD Card Errors: Check card formatting (FAT32) and connections
- 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
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
Parts
84| Qty | Value | Footprint | References |
|---|---|---|---|
| 4 | 10k | Resistor_SMD:R_0603_1608Metric | R1, R2, R4, R16 |
| 4 | MountingHole | MountingHole:MountingHole_3.2mm_M3 | H1, H2, H3, H4 |
| 3 | 100R | Resistor_SMD:R_0603_1608Metric | R3, R5, R8 |
| 3 | 10uF | Capacitor_SMD:C_0402_1005Metric_Pad0.74x0.62mm_HandSolder | C8, C12, C17 |
| 3 | IO | Connector_JST:JST_PH_S4B-PH-SM4-TB_1x04-1MP_P2.00mm_Horizontal | K1, K3, K4 |
| 3 | TPS22919DCKR | SamacSys_Parts:SOT65P210X110-6N | IC5, IC6, IC7 |
| 2 | 0.1uF | Capacitor_SMD:C_0805_2012Metric_Pad1.18x1.45mm_HandSolder | C2, C3 |
| 2 | 1k | Resistor_SMD:R_0805_2012Metric_Pad1.20x1.40mm_HandSolder | R6, R7 |
| 2 | 1uF | Capacitor_SMD:C_0402_1005Metric_Pad0.74x0.62mm_HandSolder | C10, C11 |
| 2 | 4.7k | Resistor_SMD:R_0603_1608Metric | R13, R14 |
| 2 | 4.7uF | Capacitor_SMD:C_0402_1005Metric_Pad0.74x0.62mm_HandSolder | C12, C18 |
| 2 | CUHS20S30,H3F | SamacSys_Parts:CUHS20S40H3F | D2, D3 |
| 2 | LOGO | footprints:elektorlabs-20x6.1mm | G***, G*** |
| 1 | 0.1uF | Capacitor_SMD:C_0402_1005Metric_Pad0.74x0.62mm_HandSolder | C13 |
| 1 | 0.1uF | Capacitor_SMD:C_0603_1608Metric | C5 |
| 1 | 100nF | Capacitor_SMD:C_0402_1005Metric_Pad0.74x0.62mm_HandSolder | C14 |
| 1 | 100nF | Capacitor_SMD:C_0603_1608Metric | C1 |
| 1 | 10k | Resistor_SMD:R_0402_1005Metric | R15 |
| 1 | 10nF | Capacitor_SMD:C_0402_1005Metric_Pad0.74x0.62mm_HandSolder | C4 |
| 1 | 1uH | SamacSys_Parts:1285ASH1R0MP2 | L1 |
| 1 | 22uF | SamacSys_Parts:CAPAE530X550N | C6 |
| 1 | 22uF | Capacitor_SMD:C_0603_1608Metric | C9 |
| 1 | 24R | Resistor_SMD:R_0402_1005Metric | R10 |
| 1 | 3-1478978-1 | SamacSys_Parts:314789781 | AE1 |
| 1 | 3V3 -> 3SEN | Jumper:SolderJumper-2_P1.3mm_Open_RoundedPad1.0x1.5mm | JP5 |
| 1 | 3V3 -> 3SEN1 | Jumper:SolderJumper-2_P1.3mm_Open_RoundedPad1.0x1.5mm | JP4 |
| 1 | 3V3 -> 3SEN2 | Jumper:SolderJumper-2_P1.3mm_Open_RoundedPad1.0x1.5mm | JP3 |
| 1 | 47uF | Capacitor_SMD:C_0805_2012Metric | C7 |
| 1 | 511k | Resistor_SMD:R_0402_1005Metric | R11 |
| 1 | 56pF | Capacitor_SMD:C_0603_1608Metric_Pad1.08x0.95mm_HandSolder | C15 |
| 1 | 57k | Resistor_SMD:R_0402_1005Metric | R9 |
| 1 | 91k | Resistor_SMD:R_0402_1005Metric | R12 |
| 1 | AIMC-0402-82NJ-T | SamacSys_Parts:INDC1005X65N | L2 |
| 1 | BOOT | SamacSys_Parts:SKRKAEE020 | SW1 |
| 1 | BQ25186DLHR | SamacSys_Parts:SON40P220X200X80-11N | IC4 |
| 1 | Battery | Connector_JST:JST_PH_S2B-PH-K_1x02_P2.00mm_Horizontal | K9 |
| 1 | Conn_ARM_SWD_TagConnect_TC2030 | Connector:Tag-Connect_TC2030-IDC-NL_2x03_P1.27mm_Vertical | K11 |
| 1 | EN | SamacSys_Parts:SKRKAEE020 | SW2 |
| 1 | ESP32-S3-WROOM-1 | RF_Module:ESP32-S3-WROOM-1 | MOD1 |
| 1 | EWM108-GN05 | EWM108-GN05:PCBComponent_1 | MOD3 |
| 1 | FM0V104ZF | SamacSys_Parts:FM0V104ZF | C16 |
| 1 | GPS UART | Connector_JST:JST_PH_S4B-PH-SM4-TB_1x04-1MP_P2.00mm_Horizontal | K12 |
| 1 | IRLML9301TRPBF | SamacSys_Parts:SOT95P237X112-3N | T1 |
| 1 | LORA UART | Connector_JST:JST_PH_S4B-PH-SM4-TB_1x04-1MP_P2.00mm_Horizontal | K10 |
| 1 | MEM2085-00-115-00-A | SamacSys_Parts:MEM20850011500A | K6 |
| 1 | NCD0805G1 | LED_SMD:LED_0805_2012Metric_Pad1.15x1.40mm_HandSolder | LED1 |
| 1 | NCD0805R1 | LED_SMD:LED_0805_2012Metric_Pad1.15x1.40mm_HandSolder | LED2 |
| 1 | PMEG2010ER,115 | SamacSys_Parts:PMEG2010ER115 | D4 |
| 1 | PROG | Connector_PinHeader_2.54mm:PinHeader_2x03_P2.54mm_Vertical | K2 |
| 1 | PWR SEL | Connector_PinHeader_2.54mm:PinHeader_1x03_P2.54mm_Vertical | JP1 |
| 1 | Qwiic | Connector_JST:JST_SH_SM04B-SRSS-TB_1x04-1MP_P1.00mm_Horizontal | K5 |
| 1 | SMF05C.TCT | SamacSys_Parts:SOT65P210X110-6N | D1 |
| 1 | Solar Panel | Connector_JST:JST_PH_S2B-PH-K_1x02_P2.00mm_Horizontal | K7 |
| 1 | TIMER SEL | Connector_PinHeader_2.54mm:PinHeader_1x03_P2.54mm_Vertical | JP2 |
| 1 | TPL5110QDDCRQ1 | SamacSys_Parts:SOT95P280X110-6N | IC1 |
| 1 | TPS22917DBV (L) | Package_TO_SOT_SMD:SOT-23-6 | IC2 |
| 1 | TPS631000DRLR | SamacSys_Parts:SOTFL50P160X60-8N | IC3 |
| 1 | UJ20-C-H-C-3-SMT-TR | External Library:CUI_UJ20-C-H-C-3-SMT-TR | K8 |
| 1 | WAKE UP | SamacSys_Parts:SKRKAEE020 | SW3 |
| 1 | ~ | RF_Module:RAK3172 | MOD2 |
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 mm

- 2 layers79.5 × 79.5 mm

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 layers53.2 × 98.4 mm

- 2 layers70 × 20 mm

PicoBerry V1.0
mfolejewski/PicoBerry
PicoBerry - small CM4 carrier board with full 40-pin GPIO header
36 parts63 - 2 layers80 × 55 mm

Im01
amuzdgp3-prog/im-01-pulse-device
Отдельный модуль к системе обслуживания аппаратов 2.apixspb.ru. Устройство слушает импульсные выходы монетоприёмника и купюроприёмника, копит показания в FRAM и дважды в сутки передаёт их на сервер по LTE Cat.1.
108 parts - 6 layers98.9 × 81.4 mm

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 mm

- 2 layers70 × 40 mm

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