Initial commit: Heltec Wireless Tracker documentation site

Astro/Starlight documentation covering hardware specs, pinout,
schematics, GNSS protocol, LoRa frequencies, and getting started
guides. Includes extracted datasheet images and Docker deployment.
This commit is contained in:
Ryan Malloy 2026-02-21 18:39:46 -07:00
commit e3642cbc4e
105 changed files with 14247 additions and 0 deletions

7
.gitignore vendored Normal file
View File

@ -0,0 +1,7 @@
# OS
.DS_Store
Thumbs.db
# Environment overrides
.env.local
.env.*.local

Binary file not shown.

After

Width:  |  Height:  |  Size: 503 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 503 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 503 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 503 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 503 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 503 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 149 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 503 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 503 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 225 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 503 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 503 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 503 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 503 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 503 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 503 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 503 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 503 KiB

View File

@ -0,0 +1,384 @@
# Document Metadata
**Format:** PDF 1.7
**Author:** Aaron Lee
**Creator:** WPS 文字
**Creation Date:** D:20241224151548+08'00'
**Mod Date:** D:20241224151548+08'00'
---
## Page 1
https://heltec.org
Documents
Rev 1.1
P 1/17
May 2023
Heltec Automation © Limited standard files
Wireless Tracker V1.1
Wi-Fi/LoRa/BLE/GNSS(L5)
Development Kit
![Image 1 from page 1](../images/wireless-tracker-datasheet_page_1_img_1.png)
![Image 2 from page 1](../images/wireless-tracker-datasheet_page_1_img_2.png)
## Page 2
https://heltec.org
Documents
Rev 1.1
P 2/17
May 2023
Heltec Automation © Limited standard files
Document version
Version
Time
Description
Remark
V1.0
2023-05-16
Documents creating
Richard
V1.1
2023-05-21
Document structure update
Richard
V1.1.1
2024-10-10
Update the GNSS module parameter description
Richard
Copyright Notice
All contents in the files are protected by copyright law, and all copyrights are
reserved by Chengdu Heltec Automation Technology Co., Ltd. (hereinafter referred to
as Heltec). Without written permission, all commercial use of the files from Heltec
are forbidden, such as copy, distribute, reproduce the files, etc., but non-commercial
purpose, downloaded or printed by individual are welcome.
Disclaimer
Chengdu Heltec Automation Technology Co., Ltd. reserves the right to change,
modify or improve the document and product described herein. Its contents are
subject to change without notice. These instructions are intended for you use.
## Page 3
https://heltec.org
Documents
Rev 1.1
P 3/17
May 2023
Heltec Automation © Limited standard files
Content
Wireless Tracker...................................................................................................................................1
Document version.................................................................................................................................2
Copyright Notice................................................................................................................................... 2
Disclaimer............................................................................................................................................. 2
Content..................................................................................................................................................3
1. Description........................................................................................................................................ 4
1.1 Overview.................................................................................................................................... 4
1.2 Product features.........................................................................................................................5
2. Pin Definition.....................................................................................................................................6
2.1 Pin assignment...........................................................................................................................6
2.2 Pin description............................................................................................................................7
3. Specifications.................................................................................................................................. 10
3.1 General specifications..............................................................................................................10
3.2 Power supply............................................................................................................................11
3.3 Power output............................................................................................................................11
3.4 Power characteristics...............................................................................................................12
3.5 LoRa RF characteristics............................................................................................................ 12
3.6 GNSS Characteristics................................................................................................................14
4. Typical hardware connections........................................................................ 错误!未定义书签。
4.1 Physical dimensions................................................................................................................. 16
5. Resource..........................................................................................................................................16
5.1 Relevant Resource....................................................................................................................16
5.2 Contact Information.................................................................................................................16
## Page 4
https://heltec.org
Documents
Rev 1.1
P 4/17
May 2023
Heltec Automation © Limited standard files
# 1. Description
## 1.1 Overview
Wireless Tracker is a development kit based on ESP32-S3FN8. It integrates both SX1262 and
UC6580 to provide fast GNSS solution for IoT. Collaborate with the sample programs and
development tools we provide, you can track any object and then upload that data wirelessly
by Wi-Fi, Bluetooth, LoRa.
Wireless Tracker supports L1 + L5 and supports GPS, GLONASS, BDS, Galileo, NAVIC, QZSS
multi-system joint positioning. It is perfectly compatible with Arduino, can be widely used in
development such as bicycle sharing services, tracking pets or livestock, locating vehicles,
tracking children, etc.
Wireless Tracker are available in two product variants:
### Table 1.1: Product model list
| No. | Model | Description |
|-----|-------|-------------|
| 1 | Wireless Tracker-LF | 470~510MHz working LoRa frequency, used for China mainland (CN470) LPW band. |
| 2 | Wireless Tracker-HF | For EU868, IN865, US915, AU915, AS923, KR920 and other LPW networks with operating frequencies between 863~928MHz. |
## Page 5
https://heltec.org
Documents
Rev 1.1
P 5/17
May 2023
Heltec Automation © Limited standard files
## 1.2 Product features
- ESP32-S3FN8+SX1262+UC6580 Chipset, supports Wi-Fi, LoRa, Bluetooth, GNSS.
- Low power design of dual-frequency multi-system based on 22nm technology.
- Supports L1 + L5, supports GPS, GLONASS, BDS, Galileo, NAVIC, QZSS multi-system joint positioning.¹
- Type-C USB interface with a complete voltage regulator, ESD protection, short circuit protection, RF shielding, and other protection measures.
- Onboard SH1.25-2 battery interface, integrated lithium battery management system (charge and discharge management, overcharge protection, battery power detection, USB / battery power automatic switching).
- Onboard Wi-Fi, Bluetooth dedicated 2.4GHz metal spring antenna, reserved IPEX (U.FL) interface for LoRa and GNSS use.
- Onboard 0.96-inch 80(H) x 160(V) RGB TFT-LCD display, which can be used to display debugging information, battery power, and other information.
- Support the Arduino development environment.
¹ See the GNSS module manual for details on supported projects: UFirebird_Standard Positioning Products Protocol Specification
## Page 6
https://heltec.org
Documents
Rev 1.1
P 6/17
May 2023
Heltec Automation © Limited standard files
# 2. Pin Definition
## 2.1 Pin assignment
![Pin Assignment](../images/wireless-tracker-datasheet_page_6_img_1.png)
## Page 7
https://heltec.org
Documents
Rev 1.1
P 7/17
May 2023
Heltec Automation © Limited standard files
## 2.2 Pin description
### Header J2
Table 2-2-1: Pin description
| No. | Name | Type | Function |
|-----|------|------|----------|
| 1 | 5V | P | 5V Power Supply |
| 2 | GND | P | Ground |
| 3 | 3V3 | P | Output 3.3V |
| 4 | GND | P | Ground |
| 5 | 3V3 | P | Output 3.3V |
| 6 | GND | P | Ground |
| 7 | Vext | P | Output 3.3V, power supply for built-in TFT and GNSS |
| 8 | GND | P | Ground |
| 1 | RST | P | RST_SW |
| 2 | 0 | I/O | GPIO0, USER_SW |
| 3 | 1 | I/O | GPIO1, Vbat_Read², Touch1, ADC1_CH0 |
| 4 | 2 | I/O | GPIO2, ADC Ctrl, Touch1, ADC1_CH0 |
| 5 | 3 | I/O | GPIO3, Vext Ctrl, Touch1, ADC1_CH0 |
| 6 | 19 | I/O | GPIO19, USB_D-, CLK_OUT2, ADC2_CH8, U1RTS |
| 7 | 20 | I | GPIO20, USB_D+, CLK_OUT1, ADC2_CH9, U1CTS |
| 8 | 21 | I/O | GPIO21, TFT_LED_K |
| 9 | 26 | I/O | GPIO26, SPICS1 |
| 10 | 48 | I/O | GPIO48, D_SEL |
| 11 | 47 | I/O | GPIO47, Boot_Mode |
| 12 | 33 | I/O | GPIO33, SPIIO4, FSPIHD, SUBSPIHD, GNSS_TX |
| 13 | 34 | I/O | GPIO34, SPI05, FSPICS0, SUBSPICS0, GNSS_RX |
| 14 | 35 | I/O | GPIO35, SPI06, FSPID, SUBSPID, GNSS_RST |
| 15 | 36 | I/O | GPIO36, SPI07, FSPICLK, SUBSPICLK, GNSS_PPS |
| 16 | 37 | I/O | GPIO37, SPIDQS, FSPIQ, SUBSPIQ |
² VBAT=Vbat_Read*4.9
### Header J3
Table 2-2-2: Pin description
| No. | Name | Type | Function |
|-----|------|------|----------|
| 1 | 18 | I/O | GPIO18, U1RXD, ADC2_CH7, CLK_OUT3, LED Write Ctrl |
| 2 | 17 | I/O | GPIO17, U1TXD, ADC2_CH6 |
| 3 | 16 | I/O | GPIO16, U0CTS, ADC2_CH5, XTAL_32K_N |
| 4 | 15 | I/O | GPIO15, U0RTS, ADC2_CH4, XTAL_32K_P |
| 5 | 7 | I/O | GPIO7, ADC1_CH6, TOUCH7 |
| 6 | 6 | I/O | GPIO6, ADC1_CH5, TOUCH6 |
| 7 | 5 | I/O | GPIO5, ADC1_CH4, TOUCH5 |
| 8 | 4 | I/O | GPIO4, ADC1_CH3, TOUCH4 |
| 1 | 46 | I/O | GPIO46 |
| 2 | 45 | I/O | GPIO45 |
| 4 | 44 | I/O | GPIO44, U0RXD |
| 5 | 43 | I/O | GPIO43, U0TXD |
| 6 | 14 | I/O | GPIO14, ADC2_CH3, TOUCH14, FSPIDQS, SUBSPIWP, FSPIWP, LoRa_DIO1 |
| 7 | 13 | I/O | GPIO13, ADC2_CH2, TOUCH13, FSPIIO7, SUBSPIQ, FSPIQ, LoRa_Busy |
| 8 | 12 | I/O | GPIO12, ADC2_CH1, TOUCH12, FSPIIO6, SUBSPICLK, FSPICLK, LoRa_RST |
| 9 | 11 | I/O | GPIO11, ADC2_CH0, TOUCH11, FSPIIO5, SUBSPID, FSPID, LoRa_MISO |
| 10 | 10 | I/O | GPIO10, ADC1_CH9, TOUCH10, FSPIIO4, SUBSPICS0, FSPICS0, LoRa_MOSI |
| 11 | 9 | I/O | GPIO9, ADC1_CH8, TOUCH9, SUBSPIHD, FSPIHD, LoRa_SCK |
| 12 | 8 | I/O | GPIO8, ADC1_CH7, TOUCH8, SUBSPICS1, LoRa_NSS |
| 13 | 42 | I/O | GPIO42, MTMS, TFT_SDIN |
| 14 | 41 | I/O | GPIO41, MTDI, TFT_SCLK |
| 15 | 40 | I/O | GPIO40, MTMS, TFT_RS |
| 16 | 39 | I/O | GPIO39, MTMS, TFT_RES |
| 18 | 38 | I/O | GPIO38, FSPIWP, SUBSPIWP, TFT_CS |
## Page 10
https://heltec.org
Documents
Rev 1.1
P 10/17
May 2023
Heltec Automation © Limited standard files
# 3. Specifications
## 3.1 General specifications
### Table 3-1: General specifications
| Parameters | Description |
|------------|-------------|
| Master Chip | ESP32-S3FN8 (Xtensa®32-bit lx7 dual core processor) |
| LoRa Chipset | SX1262 |
| GNSS Chipset | UC6580 |
| Frequency | 470~510MHz, 863~928MHz |
| Max TX Power | 21 ± 1dBm |
| Receiving sensitivity | -135dBm |
| Wi-Fi | 802.11 b/g/n |
| Bluetooth | Bluetooth LE: Bluetooth 5, Bluetooth mesh |
| Interface | Type-C USB; 2*1.25 lithium battery interface; LoRa ANT(IPEX); GNSS ANT(IPEX) |
| Battery | 3.7V lithium battery power supply and charging |
| Operating temperature | -20 ~ 70℃ |
| Dimensions | 65.48mm* 28.06mm* 13.52mm |
## Page 11
## 3.2 Power supply
Except when USB or 5V Pin is connected separately, lithium battery can be connected to charge it.
In other cases, only a single power supply can be connected.
### Table 3-2: Power supply
| Power supply mode | Minimum | Typical | Maximum | Unit |
|-------------------|---------|---------|---------|------|
| Type-C USB(≥500mA) | 4.7 | 5 | 6 | V |
| Lithium battery(≥250mA) | 3.3 | 3.7 | 4.2 | V |
| 5V pin(≥500mA) | 4.7 | 5 | 6 | V |
| 3V3 pin(≥150mA) | 2.7 | 3.3 | 3.5 | V |
## 3.3 Power output
### Table 3-3: Power output
| Output Pin | electric current | Unit |
|------------|------------------|------|
| 3.3V Pin | 500 | mA |
| 5V Pin (USB Powered only) | 500 | mA |
| Vext Pin | 350 | mA |
## Page 12
## 3.4 Power characteristics
### Table 3-4: Power characteristics
| Mode | USB power | VBAT/battery powered | Unit |
|------|-----------|---------------------|------|
| Wi-Fi Scan | 100 | 74 | mA |
| Wi-Fi AP | 150 | 111 | mA |
| BT | 102 | 75 | mA |
| GNSS | 120 | 89 | mA |
| TX 14dbm | 200 | 148 | mA |
| TX 17dbm | 220 | 163 | mA |
| TX 22dbm | 240 | 178 | mA |
| RX (TX disabled; RX enabled) | 80 | 59 | mA |
| sleep | 2mA | 15μA | |
## 3.5 LoRa RF characteristics
### 3.5.1 Transmit power
Table3-5-1: Transmit power
| Operating frequency band | Maximum power value/[dBm] |
|--------------------------|---------------------------|
| 470~510 | 21 ± 1 |
| 867~870 | 21 ± 1 |
| 902~928 | 21 ± 1 |
### 3.5.2 Receiving sensitivity
The following table gives typically sensitivity level of the Wireless Tracker-(L/H).
Table3-5-2: Receiving sensitivity
| Signal Bandwidth/[KHz] | Spreading Factor | Sensitivity/[dBm] |
|------------------------|------------------|-------------------|
| 125 | SF12 | -135 |
| 125 | SF10 | -130 |
| 125 | SF7 | -124 |
### 3.5.3 Operation Frequencies
Wireless Tracker supports LoRaWAN frequency channels and models corresponding table.
Table3-5-3: Operation Frequencies
| Region | Frequency (MHz) | Model |
|--------|-----------------|-------|
| EU433 | 433.175~434.665 | Wireless Tracker-LF |
| CN470 | 470~510 | Wireless Tracker-LF |
| IN868 | 865~867 | Wireless Tracker-HF |
| EU868 | 863~870 | Wireless Tracker-HF |
| US915 | 902~928 | Wireless Tracker-HF |
| AU915 | 915~928 | Wireless Tracker-HF |
| KR920 | 920~923 | Wireless Tracker-HF |
| AS923 | 920~925 | Wireless Tracker-HF |
## Page 14
## 3.6 GNSS Characteristics
### 3.6.1 Basic information
Table3-6-1: Basic information
| Parameter | Value |
|-----------|-------|
| Channel | 96 |
| Update frequency | Max 10 Hz |
| Data format | NMEA-0183, Unicore, RTCM 3.x |
| Frequency point | BDS: B2a, GPS: L1+L5, GLONASS: G1, Galileo: E1+E5a, QZSS: L1+L5, SBAS: L1, NAVIC: L5*(Specific firmware) |
### 3.6.2 Accuracy and TTFF
Table3-6-2: Accuracy and TTFF
| Parameter | Value |
|-----------|-------|
| Horizontal position accuracy(RMS) | 1.5m |
| Vertical position accuracy(RMS) | 2.5m |
| Time accuracy(RMS) | 5ns |
| Speed accuracy | 0.02m/s³ |
| Cold boot | 26s |
| Warm boot | 2s |
| Recapture | 1s |
³ -33 mps linear uniform motion scene under the simulator
### 3.6.3 Sensitivity (Unit: dBm)
Table3-6-3: Sensitivity
| Sensitivity | GNSS | BDS | GPS | GAL | GLONASS |
|-------------|------|-----|-----|-----|---------|
| Cold boot | -148 | -146 | -148 | -144 | -144 |
| Warm boot | -156 | -155 | -155 | -154 | -148 |
| Trace | -165 | -163 | -165 | -163 | -158 |
| Recapture | -156 | -154 | -156 | -154 | -152 |
## Page 16
# 4. Physical dimensions
![Physical Dimensions](../images/wireless-tracker-datasheet_page_16_img_1.png)
# 5. Resource
## 5.1 Relevant Resource
- Heltec ESP (ESP32 & ESP8266) framework (Already included Heltec ESP32 LoRaWAN library)
- Heltec LoRaWAN test server based on SnapEmu
- User Manual Document
## 5.2 Contact Information
Heltec Automation Technology Co., Ltd
Chengdu, Sichuan, China
Email: support@heltec.cn
Phone: +86-028-62374838
https://heltec.org

View File

@ -0,0 +1,294 @@
# Monitor Heart Rate on SnapEmu with Wireless Tracker
## Overview
This project enables real-time heart rate monitoring using a wireless tracker connected to a heart rate sensor. Data transmits via LoRaWAN protocol to the SnapEmu platform for visualization and analysis.
## Hardware Components Required
| Component | Purpose |
|-----------|---------|
| Heltec Wireless Tracker | Main controller + LoRa TX |
| HT-M7603 Indoor LoRa Gateway | LoRaWAN network gateway |
| MAX30102 Heart Rate Sensor | Pulse oximetry sensor |
| DuPont Wires | Connections |
## Hardware Configuration
### Pin Connections
The MAX30102 sensor connects to the Heltec Wireless Tracker using I2C:
| MAX30102 Pin | Wireless Tracker Pin | Description |
|--------------|---------------------|-------------|
| VCC | 3V3 | Power (3.3V) |
| GND | GND | Ground |
| SDA | GPIO45 | I2C Data |
| SCL | GPIO46 | I2C Clock |
> **Note:** GPIO45 and GPIO46 are recommended as they don't have conflicting built-in functions.
## Software Setup
### Step 1: Configure HT-M7603 Gateway
Configure your LoRa gateway connection to SnapEmu platform:
- Follow [official Heltec documentation](https://docs.heltec.cn/en/gateway/ht-m7603/connect_to_snapemu.html)
### Step 2: Register Tracker Node
Register your wireless tracker device on SnapEmu:
- Follow [node device connection guidelines](https://snapemudoc.readthedocs.io/en/latest/Node%20Devices%20Connection/register_on_snapemu.html)
### Step 3: Install Libraries
Required Arduino libraries:
- `Wire.h` (built-in)
- `MAX30102_PulseOximeter.h`
- `LoRaWan_APP.h` (Heltec library)
### Step 4: Sensor Test Code
First, test the sensor standalone:
```cpp
#include <Wire.h>
#include "MAX30102_PulseOximeter.h"
#define REPORTING_PERIOD_MS 1000
PulseOximeter pox;
uint32_t tsLastReport = 0;
void onBeatDetected() {
Serial.println("Beat detected!");
}
void setup() {
Serial.begin(115200);
Wire.begin(45, 46); // SDA=GPIO45, SCL=GPIO46
Serial.print("Initializing MAX30102..");
delay(3000);
if (!pox.begin()) {
Serial.println("FAILED");
for(;;);
} else {
Serial.println("SUCCESS");
}
pox.setIRLedCurrent(MAX30102_LED_CURR_7_6MA);
pox.setOnBeatDetectedCallback(onBeatDetected);
}
void loop() {
pox.update();
if (millis() - tsLastReport > REPORTING_PERIOD_MS) {
float heartRate = pox.getHeartRate();
float spo2 = pox.getSpO2();
if (heartRate > 0) {
Serial.print("Heart rate: ");
Serial.print(heartRate);
Serial.print(" bpm / ");
} else {
Serial.print("Heart rate: N/A / ");
}
if (spo2 > 0) {
Serial.print("SpO2: ");
Serial.print(spo2);
Serial.println(" %");
} else {
Serial.println("SpO2: N/A");
}
tsLastReport = millis();
}
}
```
### Step 5: Full LoRaWAN Code
Complete code with LoRaWAN transmission:
```cpp
#include <Wire.h>
#include "MAX30102_PulseOximeter.h"
#include "LoRaWan_APP.h"
#define REPORTING_PERIOD_MS 1000
// OTAA Parameters - Replace with your values from SnapEmu
uint8_t devEui[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA8 };
uint8_t appEui[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
uint8_t appKey[] = { 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 };
// LoRaWAN Configuration
uint16_t userChannelsMask[6] = { 0x00FF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 };
LoRaMacRegion_t loraWanRegion = ACTIVE_REGION;
DeviceClass_t loraWanClass = CLASS_A;
uint32_t appTxDutyCycle = 15000; // 15 second transmit interval
bool overTheAirActivation = true;
bool loraWanAdr = true;
bool isTxConfirmed = true;
uint8_t appPort = 2;
uint8_t confirmedNbTrials = 4;
PulseOximeter pox;
uint32_t tsLastReport = 0;
static void prepareTxFrame(uint8_t port) {
pox.update();
float heartRate = pox.getHeartRate();
float spo2 = pox.getSpO2();
unsigned char *puc;
appDataSize = 0;
// Packet header
appData[appDataSize++] = 0x04;
appData[appDataSize++] = 0x00;
appData[appDataSize++] = 0x0A;
appData[appDataSize++] = 0x02;
// Heart rate (4 bytes float)
puc = (unsigned char *)(&heartRate);
appData[appDataSize++] = puc[0];
appData[appDataSize++] = puc[1];
appData[appDataSize++] = puc[2];
appData[appDataSize++] = puc[3];
// Separator
appData[appDataSize++] = 0x12;
// SpO2 (4 bytes float)
puc = (unsigned char *)(&spo2);
appData[appDataSize++] = puc[0];
appData[appDataSize++] = puc[1];
appData[appDataSize++] = puc[2];
appData[appDataSize++] = puc[3];
Serial.print("TX: HR=");
Serial.print(heartRate);
Serial.print(" SpO2=");
Serial.println(spo2);
}
void onBeatDetected() {
Serial.println("♥ Beat!");
}
void setup() {
Serial.begin(115200);
Wire.begin(45, 46);
Mcu.begin(HELTEC_BOARD, SLOW_CLK_TPYE);
Serial.print("Initializing MAX30102..");
delay(3000);
if (!pox.begin()) {
Serial.println("FAILED");
for(;;);
}
Serial.println("SUCCESS");
pox.setIRLedCurrent(MAX30102_LED_CURR_27_1MA);
pox.setOnBeatDetectedCallback(onBeatDetected);
LoRaWAN.init(loraWanClass, loraWanRegion);
LoRaWAN.setDefaultDR(3);
}
void loop() {
pox.update();
// Local display
if (millis() - tsLastReport > REPORTING_PERIOD_MS) {
float heartRate = pox.getHeartRate();
float spo2 = pox.getSpO2();
Serial.print("HR: ");
Serial.print(heartRate > 0 ? String(heartRate) : "N/A");
Serial.print(" bpm | SpO2: ");
Serial.print(spo2 > 0 ? String(spo2) : "N/A");
Serial.println("%");
tsLastReport = millis();
}
// LoRaWAN state machine
switch (deviceState) {
case DEVICE_STATE_INIT:
case DEVICE_STATE_JOIN:
LoRaWAN.join();
break;
case DEVICE_STATE_SEND:
prepareTxFrame(appPort);
LoRaWAN.send();
deviceState = DEVICE_STATE_CYCLE;
break;
case DEVICE_STATE_CYCLE:
txDutyCycleTime = appTxDutyCycle + randr(-APP_TX_DUTYCYCLE_RND, APP_TX_DUTYCYCLE_RND);
LoRaWAN.cycle(txDutyCycleTime);
deviceState = DEVICE_STATE_SLEEP;
break;
case DEVICE_STATE_SLEEP:
LoRaWAN.sleep(loraWanClass);
break;
default:
deviceState = DEVICE_STATE_INIT;
break;
}
}
```
## Data Decoding on SnapEmu
Custom decoder function for the payload format:
```javascript
function Decoder(bytes, port) {
var decoded = {};
if (bytes.length >= 13) {
// Extract heart rate (bytes 4-7)
var hrBytes = new Uint8Array([bytes[4], bytes[5], bytes[6], bytes[7]]);
var hrView = new DataView(hrBytes.buffer);
decoded.heartRate = hrView.getFloat32(0, true);
// Extract SpO2 (bytes 9-12)
var spo2Bytes = new Uint8Array([bytes[9], bytes[10], bytes[11], bytes[12]]);
var spo2View = new DataView(spo2Bytes.buffer);
decoded.spo2 = spo2View.getFloat32(0, true);
}
return decoded;
}
```
## Platform Visualization
SnapEmu displays:
- Real-time heart rate graph
- SpO2 level monitoring
- Historical data (up to 1 month)
- Mobile app + web interface
## Troubleshooting
| Issue | Solution |
|-------|----------|
| No heartbeat detected | Ensure finger is properly placed, adjust LED current |
| Erratic readings | Clean sensor, reduce movement, check power supply |
| LoRa join failed | Verify gateway connection, check credentials |
| Data not showing on platform | Check decoder function, verify port number |
## References
- [SnapEmu Documentation](https://snapemudoc.readthedocs.io/)
- [Heltec Sensor Decoding](https://docs.heltec.cn/general/define_sensor_decoding_function_on_snapemu.html)
- Original project by ashley15 on Hackster.io
**License:** GPL3+

View File

@ -0,0 +1,107 @@
# Heltec Tracker Meshtastic Low Power Setting Tutorial
## Overview
This project demonstrates how to configure a Heltec Wireless Tracker with Meshtastic to achieve extended battery life through low-power mode settings. The device integrates ESP32-S3FN8, SX1262 LoRa module, and UC6580 GNSS for IoT tracking applications.
## Hardware Requirements
- Heltec Wireless Tracker development kit
- 1000mAh lithium battery (fully charged)
- LoRa adapter antenna
- Latest Meshtastic firmware version
## Configuration Steps
### Device Role Setup
Set the device operating mode:
- **Role**: TRACKER
### Position Configuration
Adjust location broadcasting parameters:
| Parameter | Value | Description |
|-----------|-------|-------------|
| Position broadcast interval | 900 seconds | How often to broadcast location |
| Smart broadcast min distance | 10 meters | Minimum movement to trigger broadcast |
| Smart broadcast min interval | 900 seconds | Minimum time between broadcasts |
| GPS update interval | 30 seconds | How often to poll GPS |
| GPS_RX_PIN | 33 | GNSS receive pin |
| GPS_TX_PIN | 34 | GNSS transmit pin |
| PIN_GPS_EN | 3 | GNSS power enable (V1.1) |
### Power Management Configuration
Enable sleep modes for power conservation:
| Parameter | Value | Description |
|-----------|-------|-------------|
| Wait for Bluetooth | 0 | Don't wait for BT connection |
| Super deep sleep duration | 1800 seconds | Deep sleep period |
| Light sleep duration | 900 seconds | Light sleep period |
| Minimum wake time | 30 seconds | Minimum active time |
## Meshtastic App Configuration
Using the Meshtastic mobile app:
1. Connect to device via Bluetooth
2. Navigate to **Settings** → **Device Config**
3. Set Role to **TRACKER**
4. Navigate to **Position Config**
5. Apply the position parameters above
6. Navigate to **Power Config**
7. Apply the power parameters above
8. Save and reboot device
## Results
Successfully configured devices achieve dramatically reduced power consumption:
| Metric | Value |
|--------|-------|
| **Idle current draw** | 13 microamps |
| **Active operation** | ~1% battery per hour |
| **Expected runtime (1000mAh)** | ~100 hours active |
## Power Consumption Breakdown
| Mode | Current Draw |
|------|--------------|
| Deep Sleep | 13 µA |
| Light Sleep | ~1 mA |
| GPS Active | ~89 mA |
| LoRa TX | ~178 mA |
| LoRa RX | ~59 mA |
## Tips for Maximum Battery Life
1. **Use larger battery**: 2000-3000mAh recommended for multi-day operation
2. **Optimize broadcast interval**: Increase if tracking precision isn't critical
3. **Use external antenna**: Better signal = faster TX, less power
4. **Disable WiFi**: If not needed for configuration
5. **Reduce GPS polling**: 60-120 second intervals for stationary tracking
## Troubleshooting
### Device won't enter deep sleep
- Ensure Bluetooth timeout is set to 0
- Check that no active mesh traffic is preventing sleep
- Verify firmware version supports deep sleep
### GPS not getting fix
- Ensure GPIO3 is HIGH (V1.1 hardware)
- Check antenna connection
- Allow 30-60 seconds for cold start fix
### Battery draining fast
- Check if device is stuck in active mode
- Verify sleep settings were saved
- Monitor serial output for wake events
## Source
Original project by ashley15 on Hackster.io
License: Open source

Binary file not shown.

After

Width:  |  Height:  |  Size: 674 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

File diff suppressed because it is too large Load Diff

BIN
docs/images/2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 321 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 565 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 332 KiB

BIN
docs/images/tracker-1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 269 KiB

BIN
docs/images/tracker-3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 249 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 396 KiB

BIN
docs/pdfs/gnss-protocol.pdf Normal file

Binary file not shown.

BIN
docs/pdfs/schematic.pdf Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

View File

@ -0,0 +1,166 @@
# HTIT-Tracker V0.5 Schematic
## Document Metadata
- **Format:** PDF 1.4
- **Title:** New Output
- **Keywords:** Altium
- **Creator:** Altium Designer
- **Producer:** llPDFLib 3.x
- **Creation Date:** 2023-07-31
---
## Schematic Components
This is the full schematic for the Heltec Wireless Tracker V0.5, designed in Altium Designer.
### Power Management
| Component | Value/Part | Function |
|-----------|-----------|----------|
| F1 | 6V 500mA | Fuse |
| D1 | RSB6.8S | TVS Diode |
| D2 | 1N5819 | Schottky Diode |
| Q1 | AO3401 | P-channel MOSFET |
| U2 | TP4054 | LiPo Charger IC |
| U4 | CE6260B33M | 3.3V LDO |
| U6 | CE6260B33M | 3.3V LDO (Vext) |
| R16 | 2K/5% | Charge current set |
### ESP32-S3FN8 Main MCU (U7)
**Crystal:**
| Component | Value |
|-----------|-------|
| U5 | 40MHz Crystal |
| C19, C20 | 22pF/10V |
| X1 | 32.768KHz (RTC) |
| C8, C22 | 4.7pF/10V |
**Key GPIO Connections:**
- GPIO0: USER_Key
- GPIO1: Vbat_Read (via ADC)
- GPIO2: ADC_Ctrl
- GPIO3: Vext_Ctrl
- GPIO8: LoRa_NSS
- GPIO9: LoRa_SCK
- GPIO10: LoRa_MOSI
- GPIO11: LoRa_MISO
- GPIO12: LoRa_RST
- GPIO13: LoRa_BUSY
- GPIO14: DIO1
- GPIO18: LED Write Ctrl
- GPIO19/20: USB_D-/USB_D+
- GPIO21: LED_K (TFT backlight)
- GPIO33: GNSS_TX
- GPIO34: GNSS_RX
- GPIO35: GNSS_RST
- GPIO36: GNSS_PPS
- GPIO38-42: TFT Display (CS, RES, RS, SCLK, SDIN)
- GPIO47: BOOT_MODE
- GPIO48: D_SEL
### SX1262 LoRa Module (U12)
| Component | Value | Function |
|-----------|-------|----------|
| L1 | 2.7nH | RF matching |
| L2 | 24nH | RF filter |
| L3 | 2.0nH | RF matching |
| C12, C15, C18, C25 | 0.1uF | Decoupling |
| C13, C14 | 1.8pF | RF matching |
| U11 | UPG2179 | RF Switch |
| X4 | 32MHz | TCXO |
| E4 | IPEX | LoRa Antenna |
### UC6580 GNSS Module (U9)
| Component | Value | Function |
|-----------|-------|----------|
| X2 | 26MHz | TCXO |
| X3 | 32.768KHz | RTC Crystal |
| C34, C41 | 4.7pF | Crystal load |
| R27 | 10K/5% | Reset pullup |
| U8 | HDDL1L5RSS-B8 | L1/L5 LNA |
| U10 | SW7125DE | RF Amplifier |
| E3 | IPEX | GNSS Antenna |
**RF Frontend:**
| Component | Value |
|-----------|-------|
| L4 | 68nH |
| L5 | 1nH |
| L6 | 2.2nH |
| L7 | 18nH |
| L8 | 0R/5% |
| L9 | 6.8nH |
| L10 | 7nH |
| L11 | 4.5nH |
| EL2 | 1uH (inductor) |
### TFT Display (U1 - 0.96" OLED)
| Pin | Signal |
|-----|--------|
| SDIN | GPIO42 |
| SCLK | GPIO41 |
| RS | GPIO40 |
| RES | GPIO39 |
| CS | GPIO38 |
| LED_K | GPIO21 (via Q4) |
### USB Type-C (U3)
| Pin | Signal |
|-----|--------|
| VBUS | VDD_5V |
| DN1/DN2 | USB_N |
| DP1/DP2 | USB_P |
| CC1 | R3 (5.1K to GND) |
| CC2 | R6 (5.1K to GND) |
### Battery Management
| Component | Value | Function |
|-----------|-------|----------|
| JP3 | 1.25X2P-LiPo | Battery connector |
| C1 | 10uF/10V | Input cap |
| C2 | 220nF/10V | Charge cap |
| R13 | 390K/1% | Voltage divider |
| R14 | 100K/1% | Voltage divider |
| Q2 | AO3401 | Power switch |
| Q3 | S9013 | ADC control |
### LEDs
| LED | Color | Resistor | Function |
|-----|-------|----------|----------|
| LED1 | Orange | R7 (330R) | Charging indicator |
| LED2 | White | R10 (330R) | User LED |
### Buttons
| Button | Function |
|--------|----------|
| S1 | RESET_SW |
| S2 | USER_SW (GPIO0) |
---
## Pin Headers
### Header P2 (8-pin)
Power and ground pins
### Header P3 (8-pin)
Additional GPIO
### Header P4 (16-pin)
Main GPIO header J2
### Header P5 (16-pin)
Main GPIO header J3
---
![Schematic Detail](../images/schematic_page_1_img_1.png)

View File

@ -0,0 +1,101 @@
# ESP32 Development Platforms Overview
## Summary
Three primary development approaches for ESP32 microcontrollers, each suited to different development goals:
---
## ESP-IDF
**Best for:** Production-ready applications, low-level control
The official and most comprehensive framework for low-level control and production-ready applications. This platform provides extensive control capabilities for developers building robust, production-level systems.
### Pros:
- Full access to ESP32 features
- Official Espressif support
- Best performance optimization
- Production-ready tooling
### Cons:
- Steeper learning curve
- More verbose code
- Longer development time
---
## MicroPython
**Best for:** Rapid prototyping, interactive development
Enables rapid prototyping through an interactive scripting runtime. This approach favors quick iteration and experimentation over embedded systems projects.
### Pros:
- Fast prototyping
- Interactive REPL
- Easy to learn
- Great for education
### Cons:
- Slower execution
- Higher memory usage
- Limited hardware access
---
## Arduino via PlatformIO
**Best for:** Library ecosystem, familiar workflow
Offers a simplified development model with access to a rich ecosystem of libraries and tools. This combines the familiar Arduino framework with PlatformIO's professional development environment.
### Pros:
- Huge library ecosystem
- Familiar Arduino syntax
- Good documentation
- Active community
### Cons:
- Abstraction overhead
- May hide hardware details
---
## Heltec Wireless Tracker Recommendations
For the Wireless Tracker specifically:
| Use Case | Recommended Platform |
|----------|---------------------|
| Meshtastic | Pre-built firmware |
| LoRaWAN Projects | Arduino/PlatformIO |
| GNSS Development | ESP-IDF or Arduino |
| Quick Prototyping | MicroPython |
| Production Devices | ESP-IDF |
### Heltec Library Support
Heltec provides official libraries for:
- **Arduino**: `Heltec ESP32 Dev-Boards` library
- **PlatformIO**: `heltec-automation/Heltec ESP32 Dev-Boards`
- **ESP-IDF**: Examples in Heltec GitHub repository
---
## Quick Start Commands
### PlatformIO
```ini
[env:heltec_wireless_tracker]
platform = espressif32
board = heltec_wireless_tracker
framework = arduino
lib_deps =
heltec-automation/Heltec ESP32 Dev-Boards
```
### Arduino IDE
1. Add board URL: `https://resource.heltec.cn/download/package_heltec_esp32_index.json`
2. Install "Heltec ESP32 Series Dev-boards"
3. Select "Wireless Tracker" from board menu

47
docs/wiki/faq.md Normal file
View File

@ -0,0 +1,47 @@
# Wireless Tracker Frequently Asked Questions
## Q: How do I access boot mode manually if I'm unable to upload code?
**A:** The Wireless Tracker uses ESP32S3's internal USB, which may fail to enter bootloader in low-power mode or when certain pins are occupied. To manually enter boot mode:
- **Device not connected:** Press the `USER` button before plugging into a USB port
- **Device already connected:** Hold `USER` button → Press `RESET` → Release `RESET` → Release `USER` button
Timing requirement: TRST ≥ 10 ms
---
## Q: Why isn't Meshtastic firmware working properly on V1.1 hardware?
**A:** The V1.1 hardware changed the GNSS chip power supply control pin to GPIO3, causing compatibility issues with official Meshtastic firmware.
**Solution:** Download the temporary firmware package from Heltec's resources and flash using the CLI command: `device-install.bat -f firmware.factory.bin`
*Note: This was resolved in Meshtastic 2.2.17 Beta, which auto-detects device version.*
---
## Q: Why is my screen not displaying?
**A:** Two common causes:
1. When running LoRa/LoRaWAN sample code: Check the serial port and press RST. Verify device activation via the licensing documentation.
2. When running Meshtastic: Confirm you've downloaded the correct firmware version for your device.
---
## Q: What are the key GPIO differences between V1.0 and V1.1?
**A:** The main change in V1.1:
- **GPIO3** now controls GNSS power (set HIGH to enable)
- Added dedicated LDO for UC6580 GNSS module
- Improved power isolation between LoRa and GNSS subsystems
---
## Q: How do I check which hardware version I have?
**A:** Look for the version marking on the PCB near the USB connector, or check:
- V1.0: GNSS power tied to main rail
- V1.1: GNSS has independent power control via GPIO3

View File

@ -0,0 +1,50 @@
# Wireless Tracker Hardware Update Log
## V1.0
**Release Date:** June 30, 2023
- First release
- Initial public sale
- [Schematic diagram](https://resource.heltec.cn/download/Wireless_Tracker/Wireless_Tacker1.0/HTIT-Tracker_V0.3.pdf)
- [Datasheet](https://resource.heltec.cn/download/Wireless_Tracker/Wireless%20tracke.pdf)
---
## V1.1
**Release Date:** Late 2023
### Changes:
- **Fixed:** Power loss issue affecting the GNSS module during LoRa operation
- **Enhanced:** Low-power functionality
- **Added:** Additional LDO to supply power to the UC6580 GNSS module independently
- **Changed:** GNSS control pin removed; GPIO 3 set to `HIGH` enables GNSS power
### Key Differences from V1.0:
| Feature | V1.0 | V1.1 |
|---------|------|------|
| GNSS Power | Shared rail | Dedicated LDO |
| GNSS Control | N/A | GPIO3 |
| Power Isolation | Limited | Improved |
| Low Power Mode | Basic | Enhanced |
### Documentation:
- [Schematic diagram](https://resource.heltec.cn/download/Wireless_Tracker/Wireless_Tacker1.1)
- [Datasheet](https://resource.heltec.cn/download/Wireless_Tracker/Wireless%20Tracker%201.1.pdf)
---
## Hardware Version Detection
To determine your hardware version programmatically:
```cpp
// V1.1 requires GPIO3 HIGH to enable GNSS
#define GNSS_CTRL_PIN 3
void setup() {
// For V1.1 hardware - enable GNSS power
pinMode(GNSS_CTRL_PIN, OUTPUT);
digitalWrite(GNSS_CTRL_PIN, HIGH);
}
```

31
docs/wiki/product-info.md Normal file
View File

@ -0,0 +1,31 @@
# Wireless Tracker Product Summary
## Overview
The Wireless Tracker is an IoT development kit combining ESP32-S3FN8 with dual wireless and positioning capabilities. It integrates LoRa, GPS, and multi-system GNSS functionality for tracking applications.
## Key Components
- **Main Processor:** ESP32-S3FN8 (dual-core Xtensa 32-bit)
- **LoRa Module:** SX1262
- **GNSS Chip:** UC6580 (supports GPS, GLONASS, BDS, Galileo, NAVIC, QZSS)
- **Display:** 0.96-inch 160×80 TFT LCD
- **Connectivity:** Wi-Fi 802.11 b/g/n, Bluetooth 5 & Mesh, LoRa
## Core Features
- Low power design of dual-frequency multi-system based on 22nm technology
- USB Type-C interface with voltage regulation and protection circuits
- Integrated lithium battery management with automatic power switching
- 2.4GHz metal spring antenna for Wi-Fi/Bluetooth; IPEX connector for LoRa/GNSS
- Arduino IDE compatible
- Meshtastic and LoRaWAN support
## Technical Specifications
| Parameter | Value |
|-----------|-------|
| **TX Power** | 21±1 dBm |
| **RX Sensitivity** | -134 dBm |
| **Operating Temp** | -20°C to 70°C |
| **Dimensions** | 65.48 × 28.06 × 13.52 mm |
| **Battery** | 3.7V lithium supply/charging |
## Applications
Object tracking, vehicle location, pet/livestock monitoring, bicycle sharing, children tracking, field sensing networks.

View File

@ -0,0 +1,37 @@
# Wireless Tracker Documentation
## Overview
The Wireless Tracker is an ESP32-S3FN8-based development kit combining SX1262 and UC6580 chipsets for "fast GNSS solution for IoT" with multi-connectivity options and precision positioning capabilities.
## Key Features
- **Chipset**: ESP32-S3FN8 + SX1262 + UC6580
- **Connectivity**: Wi-Fi, LoRa, Bluetooth 5, GNSS
- **Positioning**: Multi-system support (GPS, GLONASS, BDS, Galileo, NAVIC, QZSS) with L1/L5/L2 bands
- **Display**: 0.96" 160×80 LCD
- **Power**: 3.7V lithium battery with charging capability
- **Dimensions**: 65.48 × 28.06 × 13.52mm
- **Max TX Power**: 21±1dBm
## Technical Specifications
| Component | Spec |
|-----------|------|
| Main Processor | ESP32-S3FN8 |
| LoRa Transceiver | SX1262 |
| GNSS Module | UC6580 |
| Bluetooth | Version 5 |
| Antenna | Wi-Fi/BT 2.4GHz onboard; IPEX slots for LoRa/GNSS |
## Getting Started Resources
The documentation references guides for:
- Development environment setup
- LoRaWAN integration
- Meshtastic application
- License usage
## Available Documentation
Complete technical materials including datasheets, schematics, pin maps, and hardware update logs are available through the Heltec resource portal.

30
site/.dockerignore Normal file
View File

@ -0,0 +1,30 @@
# Dependencies
node_modules/
# Build output
dist/
# Git
.git/
.gitignore
# IDE
.vscode/
.idea/
# Logs
*.log
npm-debug.log*
# OS
.DS_Store
Thumbs.db
# Environment files (use docker-compose env)
.env.local
.env.*.local
# Dev files
*.md
!README.md
Makefile

21
site/.gitignore vendored Normal file
View File

@ -0,0 +1,21 @@
# build output
dist/
# generated types
.astro/
# dependencies
node_modules/
# logs
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
# environment overrides (keep .env tracked for defaults)
.env.local
.env.*.local
# macOS-specific files
.DS_Store

57
site/Dockerfile Normal file
View File

@ -0,0 +1,57 @@
# Multi-stage build for Heltec Wireless Tracker Documentation
# Stage 1: Build the static site
FROM node:22-slim AS builder
# Disable telemetry
ENV ASTRO_TELEMETRY_DISABLED=1
ENV CI=true
WORKDIR /app
# Copy package files
COPY package.json package-lock.json ./
# Install dependencies
RUN npm ci
# Copy source files
COPY . .
# Build the static site
RUN npm run build
# Stage 2: Production server with nginx
FROM nginx:alpine-slim AS production
# Copy nginx config
COPY nginx.conf /etc/nginx/conf.d/default.conf
# Copy built static files
COPY --from=builder /app/dist /usr/share/nginx/html
# Add healthcheck
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
CMD wget -q --spider http://127.0.0.1:80/ || exit 1
EXPOSE 80
# Stage 3: Development server
FROM node:22-slim AS development
# Disable telemetry
ENV ASTRO_TELEMETRY_DISABLED=1
WORKDIR /app
# Copy package files
COPY package.json package-lock.json ./
# Install dependencies
RUN npm ci
# Copy source files (will be overridden by volume mount in dev)
COPY . .
EXPOSE 4321
CMD ["npm", "run", "dev", "--", "--host", "0.0.0.0"]

62
site/Makefile Normal file
View File

@ -0,0 +1,62 @@
.PHONY: dev prod build logs stop clean restart shell
# Default target
.DEFAULT_GOAL := dev
# Development mode with hot reloading
dev:
@echo "Starting development server..."
docker compose --profile dev up -d heltec-docs-dev
@echo "Site available at https://$(shell grep DOMAIN .env | cut -d= -f2)"
docker compose logs -f heltec-docs-dev
# Production mode with static build
prod:
@echo "Building and starting production server..."
docker compose --profile prod up -d --build heltec-docs-prod
@echo "Site available at https://$(shell grep DOMAIN .env | cut -d= -f2)"
docker compose logs -f heltec-docs-prod
# Build the Docker image
build:
docker compose build
# Build production image specifically
build-prod:
docker compose --profile prod build heltec-docs-prod
# Show logs
logs:
docker compose logs -f
# Stop all containers
stop:
docker compose --profile dev --profile prod down
# Stop and remove volumes
clean:
docker compose --profile dev --profile prod down -v --remove-orphans
docker image prune -f
# Restart containers
restart: stop dev
# Shell into development container
shell:
docker compose --profile dev exec heltec-docs-dev /bin/sh
# Check container status
status:
docker compose ps
# Local development without Docker (requires Node.js)
local:
npm run dev
# Build locally without Docker
local-build:
npm run build
# Preview local build
local-preview:
npm run preview

49
site/README.md Normal file
View File

@ -0,0 +1,49 @@
# Starlight Starter Kit: Basics
[![Built with Starlight](https://astro.badg.es/v2/built-with-starlight/tiny.svg)](https://starlight.astro.build)
```
npm create astro@latest -- --template starlight
```
> 🧑‍🚀 **Seasoned astronaut?** Delete this file. Have fun!
## 🚀 Project Structure
Inside of your Astro + Starlight project, you'll see the following folders and files:
```
.
├── public/
├── src/
│ ├── assets/
│ ├── content/
│ │ └── docs/
│ └── content.config.ts
├── astro.config.mjs
├── package.json
└── tsconfig.json
```
Starlight looks for `.md` or `.mdx` files in the `src/content/docs/` directory. Each file is exposed as a route based on its file name.
Images can be added to `src/assets/` and embedded in Markdown with a relative link.
Static assets, like favicons, can be placed in the `public/` directory.
## 🧞 Commands
All commands are run from the root of the project, from a terminal:
| Command | Action |
| :------------------------ | :----------------------------------------------- |
| `npm install` | Installs dependencies |
| `npm run dev` | Starts local dev server at `localhost:4321` |
| `npm run build` | Build your production site to `./dist/` |
| `npm run preview` | Preview your build locally, before deploying |
| `npm run astro ...` | Run CLI commands like `astro add`, `astro check` |
| `npm run astro -- --help` | Get help using the Astro CLI |
## 👀 Want to learn more?
Check out [Starlights docs](https://starlight.astro.build/), read [the Astro documentation](https://docs.astro.build), or jump into the [Astro Discord server](https://astro.build/chat).

111
site/astro.config.mjs Normal file
View File

@ -0,0 +1,111 @@
// @ts-check
import { defineConfig } from 'astro/config';
import starlight from '@astrojs/starlight';
// https://astro.build/config
export default defineConfig({
site: 'https://heltec-tracker-module.l.zmesh.systems',
// Disable telemetry
telemetry: false,
// Disable devToolbar
devToolbar: { enabled: false },
integrations: [
starlight({
title: 'Heltec Wireless Tracker',
description: 'Documentation for the Heltec Wireless Tracker ESP32-S3FN8 development kit with LoRa, GNSS, and WiFi',
logo: {
src: './src/assets/tracker-icon.svg',
alt: 'Heltec Wireless Tracker',
},
social: [
{ icon: 'github', label: 'GitHub', href: 'https://github.com/Heltec-Aaron-Lee/WiFi_Kit_series' },
{ icon: 'external', label: 'Heltec Wiki', href: 'https://wiki.heltec.org' },
],
head: [
{
tag: 'meta',
attrs: {
name: 'keywords',
content: 'ESP32-S3, LoRa, GNSS, GPS, Meshtastic, LoRaWAN, Heltec, Wireless Tracker',
},
},
],
sidebar: [
{
label: 'Getting Started',
items: [
{ label: 'Overview', slug: 'getting-started/overview' },
{ label: 'Hardware Versions', slug: 'getting-started/hardware-versions' },
{ label: 'Development Platforms', slug: 'getting-started/development-platforms' },
],
},
{
label: 'Hardware',
items: [
{ label: 'Specifications', slug: 'hardware/specifications' },
{ label: 'Pinout', slug: 'hardware/pinout' },
{ label: 'Power', slug: 'hardware/power' },
{ label: 'Schematic', slug: 'hardware/schematic' },
],
},
{
label: 'Guides',
items: [
{ label: 'Meshtastic Low Power', slug: 'guides/meshtastic-low-power' },
{ label: 'Heart Rate Monitor', slug: 'guides/heart-rate-monitor' },
{ label: 'LoRaWAN Setup', slug: 'guides/lorawan-setup' },
],
},
{
label: 'Reference',
items: [
{ label: 'GNSS Protocol', slug: 'reference/gnss-protocol' },
{ label: 'LoRa Frequencies', slug: 'reference/lora-frequencies' },
{ label: 'FAQ', slug: 'reference/faq' },
],
},
{
label: 'Resources',
items: [
{ label: 'Downloads', slug: 'resources/downloads' },
],
},
],
// Customize search
pagefind: true,
// Custom CSS
customCss: [
'./src/styles/custom.css',
],
// Components customization
components: {
// Override the page title to show hardware version warnings
},
}),
],
vite: {
server: {
host: '0.0.0.0',
// Only configure HMR for reverse proxy when explicitly set
// Without this, Vite auto-detects localhost settings correctly
...(process.env.VITE_HMR_HOST && {
hmr: {
host: process.env.VITE_HMR_HOST,
protocol: 'wss',
clientPort: 443,
},
}),
},
},
});

58
site/docker-compose.yml Normal file
View File

@ -0,0 +1,58 @@
services:
heltec-docs:
build:
context: .
target: ${MODE:-development}
container_name: heltec-tracker-docs
restart: unless-stopped
environment:
- ASTRO_TELEMETRY_DISABLED=1
- VITE_HMR_HOST=${VITE_HMR_HOST:-}
networks:
- caddy
labels:
# Caddy reverse proxy configuration
caddy: ${DOMAIN:-heltec-tracker-module.l.zmesh.systems}
caddy.reverse_proxy: "{{upstreams ${PORT:-4321}}}"
# HMR WebSocket support for dev mode
caddy.reverse_proxy.flush_interval: "-1"
caddy.reverse_proxy.transport: "http"
caddy.reverse_proxy.transport.read_timeout: "0"
caddy.reverse_proxy.transport.write_timeout: "0"
caddy.reverse_proxy.transport.keepalive: "5m"
caddy.reverse_proxy.transport.keepalive_idle_conns: "10"
caddy.reverse_proxy.stream_timeout: "24h"
caddy.reverse_proxy.stream_close_delay: "5s"
# Development mode override
heltec-docs-dev:
extends:
service: heltec-docs
profiles:
- dev
build:
target: development
volumes:
- ./src:/app/src:ro
- ./public:/app/public:ro
- ./astro.config.mjs:/app/astro.config.mjs:ro
environment:
- ASTRO_TELEMETRY_DISABLED=1
- VITE_HMR_HOST=${VITE_HMR_HOST}
labels:
caddy.reverse_proxy: "{{upstreams 4321}}"
# Production mode override
heltec-docs-prod:
extends:
service: heltec-docs
profiles:
- prod
build:
target: production
labels:
caddy.reverse_proxy: "{{upstreams 80}}"
networks:
caddy:
external: true

29
site/nginx.conf Normal file
View File

@ -0,0 +1,29 @@
server {
listen 80;
server_name _;
root /usr/share/nginx/html;
index index.html;
# Enable gzip compression
gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_proxied any;
gzip_types text/plain text/css text/xml text/javascript application/javascript application/json application/xml application/rss+xml image/svg+xml;
# Cache static assets
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
# Handle SPA routing - serve index.html for all routes
location / {
try_files $uri $uri/ $uri.html /index.html;
}
# Security headers
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
}

6394
site/package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

17
site/package.json Normal file
View File

@ -0,0 +1,17 @@
{
"name": "site",
"type": "module",
"version": "0.0.1",
"scripts": {
"dev": "astro dev",
"start": "astro dev",
"build": "astro build",
"preview": "astro preview",
"astro": "astro"
},
"dependencies": {
"@astrojs/starlight": "^0.37.6",
"astro": "^5.6.1",
"sharp": "^0.34.2"
}
}

1
site/public/favicon.svg Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128"><path fill-rule="evenodd" d="M81 36 64 0 47 36l-1 2-9-10a6 6 0 0 0-9 9l10 10h-2L0 64l36 17h2L28 91a6 6 0 1 0 9 9l9-10 1 2 17 36 17-36v-2l9 10a6 6 0 1 0 9-9l-9-9 2-1 36-17-36-17-2-1 9-9a6 6 0 1 0-9-9l-9 10v-2Zm-17 2-2 5c-4 8-11 15-19 19l-5 2 5 2c8 4 15 11 19 19l2 5 2-5c4-8 11-15 19-19l5-2-5-2c-8-4-15-11-19-19l-2-5Z" clip-rule="evenodd"/><path d="M118 19a6 6 0 0 0-9-9l-3 3a6 6 0 1 0 9 9l3-3Zm-96 4c-2 2-6 2-9 0l-3-3a6 6 0 1 1 9-9l3 3c3 2 3 6 0 9Zm0 82c-2-2-6-2-9 0l-3 3a6 6 0 1 0 9 9l3-3c3-2 3-6 0-9Zm96 4a6 6 0 0 1-9 9l-3-3a6 6 0 1 1 9-9l3 3Z"/><style>path{fill:#000}@media (prefers-color-scheme:dark){path{fill:#fff}}</style></svg>

After

Width:  |  Height:  |  Size: 696 B

BIN
site/public/images/2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 321 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 503 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 503 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 503 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 503 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 503 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 503 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 149 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 503 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 503 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 225 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 503 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 503 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 503 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 503 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 503 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 503 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 503 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 503 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 674 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 565 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 332 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 269 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 249 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 396 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

View File

@ -0,0 +1,41 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" fill="none">
<!-- PCB Board -->
<rect x="8" y="12" width="48" height="40" rx="3" fill="#1a472a" stroke="#2d5a3d" stroke-width="1.5"/>
<!-- Circuit traces -->
<path d="M12 20h8M12 44h8M44 20h8M44 44h8" stroke="#4ade80" stroke-width="0.75" opacity="0.6"/>
<path d="M20 16v32M44 16v32" stroke="#4ade80" stroke-width="0.5" opacity="0.4"/>
<!-- ESP32-S3 Chip -->
<rect x="22" y="22" width="20" height="16" rx="1" fill="#1f2937"/>
<text x="32" y="32" font-family="monospace" font-size="5" fill="#9ca3af" text-anchor="middle">S3</text>
<!-- LoRa Antenna connector (IPEX) -->
<circle cx="52" cy="32" r="3" fill="#fbbf24" stroke="#f59e0b" stroke-width="0.5"/>
<path d="M49 32h-5" stroke="#f59e0b" stroke-width="1"/>
<!-- GNSS Antenna connector -->
<circle cx="52" cy="22" r="2.5" fill="#60a5fa" stroke="#3b82f6" stroke-width="0.5"/>
<!-- Display (TFT) -->
<rect x="11" y="24" width="8" height="12" rx="0.5" fill="#0f172a" stroke="#334155" stroke-width="0.5"/>
<rect x="12" y="25" width="6" height="10" rx="0.25" fill="#1e293b"/>
<!-- USB-C Port -->
<rect x="28" y="48" width="8" height="4" rx="1" fill="#6b7280"/>
<rect x="30" y="49" width="4" height="2" rx="0.5" fill="#374151"/>
<!-- Battery connector -->
<rect x="12" y="40" width="6" height="3" rx="0.5" fill="#dc2626"/>
<!-- Status LEDs -->
<circle cx="16" y="18" r="1.5" fill="#22c55e"/>
<circle cx="48" cy="42" r="1.5" fill="#3b82f6"/>
<!-- LoRa signal waves -->
<path d="M56 28c2 2 2 6 0 8" stroke="#f59e0b" stroke-width="1" fill="none" opacity="0.8"/>
<path d="M58 26c3 3 3 10 0 13" stroke="#f59e0b" stroke-width="0.75" fill="none" opacity="0.5"/>
<!-- GPS satellite signal -->
<path d="M52 16l2-4M52 16l-1-4M52 16l3-3" stroke="#60a5fa" stroke-width="0.75" opacity="0.7"/>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@ -0,0 +1,7 @@
import { defineCollection } from 'astro:content';
import { docsLoader } from '@astrojs/starlight/loaders';
import { docsSchema } from '@astrojs/starlight/schema';
export const collections = {
docs: defineCollection({ loader: docsLoader(), schema: docsSchema() }),
};

View File

@ -0,0 +1,173 @@
---
title: Development Platforms
description: Choose your development environment for the Heltec Wireless Tracker
---
import { Aside, Tabs, TabItem, Card, CardGrid } from '@astrojs/starlight/components';
Three primary development approaches are available for the Wireless Tracker, each suited to different goals and experience levels.
## Platform Comparison
<CardGrid>
<Card title="Arduino / PlatformIO" icon="seti:arduino">
**Best for**: Library ecosystem, familiar workflow, rapid development
Pros: Huge library ecosystem, familiar syntax, active community
Cons: Abstraction overhead, may hide hardware details
</Card>
<Card title="ESP-IDF" icon="seti:c">
**Best for**: Production applications, low-level control
Pros: Full feature access, official support, best performance
Cons: Steeper learning curve, more verbose code
</Card>
<Card title="MicroPython" icon="seti:python">
**Best for**: Rapid prototyping, education, scripting
Pros: Fast iteration, interactive REPL, easy to learn
Cons: Slower execution, higher memory usage
</Card>
</CardGrid>
## Recommended Platform by Use Case
| Use Case | Recommended |
|----------|-------------|
| Meshtastic | Pre-built firmware |
| LoRaWAN projects | Arduino/PlatformIO |
| GNSS development | ESP-IDF or Arduino |
| Quick prototyping | MicroPython |
| Production devices | ESP-IDF |
## Setup Instructions
<Tabs>
<TabItem label="PlatformIO">
PlatformIO provides a professional development environment with dependency management.
### platformio.ini
```ini
[env:heltec_wireless_tracker]
platform = espressif32
board = heltec_wireless_tracker
framework = arduino
monitor_speed = 115200
lib_deps =
heltec-automation/Heltec ESP32 Dev-Boards
```
### Installation
1. Install VS Code with PlatformIO extension
2. Create new project with the configuration above
3. Build and upload with Ctrl+Alt+U
</TabItem>
<TabItem label="Arduino IDE">
The Arduino IDE offers a beginner-friendly environment.
### Board Manager Setup
1. Open **File → Preferences**
2. Add to "Additional Board Manager URLs":
```
https://resource.heltec.cn/download/package_heltec_esp32_index.json
```
3. Open **Tools → Board → Boards Manager**
4. Search for "Heltec ESP32" and install
5. Select **Tools → Board → Heltec ESP32 Series Dev-boards → Wireless Tracker**
### Library Installation
1. Open **Sketch → Include Library → Manage Libraries**
2. Search "Heltec ESP32" and install
</TabItem>
<TabItem label="ESP-IDF">
The official Espressif framework provides maximum control.
### Prerequisites
1. Install ESP-IDF v5.x following [official docs](https://docs.espressif.com/projects/esp-idf/en/latest/esp32s3/get-started/)
2. Clone Heltec examples:
```bash
git clone https://github.com/Heltec-Aaron-Lee/WiFi_Kit_series.git
```
### Build Example
```bash
cd WiFi_Kit_series/esp-idf/examples/wireless_tracker
idf.py set-target esp32s3
idf.py build
idf.py -p /dev/ttyUSB0 flash monitor
```
</TabItem>
<TabItem label="MicroPython">
MicroPython enables interactive development and rapid prototyping.
### Firmware Installation
1. Download ESP32-S3 MicroPython firmware from [micropython.org](https://micropython.org/download/ESP32_GENERIC_S3/)
2. Flash with esptool:
```bash
esptool.py --port /dev/ttyUSB0 erase_flash
esptool.py --port /dev/ttyUSB0 write_flash -z 0 esp32s3-*.bin
```
### Basic Example
```python
from machine import Pin, UART
import time
# Enable GNSS power (V1.1)
gnss_pwr = Pin(3, Pin.OUT)
gnss_pwr.value(1)
# Setup GNSS UART
gnss = UART(1, baudrate=115200, tx=34, rx=33)
while True:
if gnss.any():
print(gnss.readline())
time.sleep(0.1)
```
</TabItem>
</Tabs>
## Heltec Library Functions
The official Heltec library provides helper functions for common operations:
```cpp
#include "HT_st7735.h" // TFT display
#include "LoRaWan_APP.h" // LoRaWAN stack
#include "HT_TinyGPS++.h" // GNSS parsing
// Display initialization
HT_st7735 display;
display.init();
display.clear();
display.drawString(0, 0, "Hello Tracker!");
// LoRa initialization
Mcu.begin(HELTEC_BOARD, SLOW_CLK_TPYE);
LoRaWAN.init(CLASS_A, ACTIVE_REGION);
```
<Aside type="tip">
Start with PlatformIO and the Heltec library for the smoothest development experience. Move to ESP-IDF when you need fine-grained control or are preparing for production.
</Aside>
## Bootloader Access
If code upload fails, manually enter bootloader mode:
1. **Device not connected**: Press and hold `USER` before plugging in USB
2. **Device already connected**: Hold `USER` → Press `RESET` → Release `RESET` → Release `USER`
Timing requirement: Reset signal must be held for ≥10 ms.

View File

@ -0,0 +1,122 @@
---
title: Hardware Versions
description: Differences between Wireless Tracker V1.0 and V1.1 hardware revisions
---
import { Aside, Tabs, TabItem } from '@astrojs/starlight/components';
The Wireless Tracker has undergone hardware revisions since its initial release. Understanding the differences is critical for firmware compatibility.
## Version Timeline
| Version | Release | Key Change |
|---------|---------|------------|
| **V1.0** | June 2023 | Initial release |
| **V1.1** | Late 2023 | Added dedicated GNSS LDO, GPIO3 control |
## V1.1 Changes
The V1.1 revision addressed power isolation issues that could cause GNSS failures during LoRa transmission.
### What Changed
| Feature | V1.0 | V1.1 |
|---------|------|------|
| GNSS Power | Shared rail | Dedicated LDO |
| GNSS Control | Always on | GPIO3 (HIGH = enabled) |
| Power Isolation | Limited | Improved |
| Low Power Mode | Basic | Enhanced |
<Aside type="caution" title="Important">
V1.1 requires **GPIO3 set to HIGH** to enable the GNSS module. Firmware written for V1.0 may not work correctly on V1.1.
</Aside>
## Identifying Your Version
### Physical Inspection
Look for the version marking on the PCB near the USB connector.
### Programmatic Detection
```cpp
// V1.1 detection - check if GPIO3 controls GNSS
#define GNSS_CTRL_PIN 3
void setup() {
Serial.begin(115200);
// For V1.1 hardware - enable GNSS power
pinMode(GNSS_CTRL_PIN, OUTPUT);
digitalWrite(GNSS_CTRL_PIN, HIGH);
delay(1000); // Allow GNSS to power up
// Check for GNSS response...
}
```
## Firmware Compatibility
### Meshtastic
<Tabs>
<TabItem label="V1.1 Hardware">
Meshtastic **2.2.17 Beta** and later auto-detect the hardware version.
For earlier versions, use the temporary firmware from Heltec:
```bash
device-install.bat -f firmware.factory.bin
```
</TabItem>
<TabItem label="V1.0 Hardware">
Standard Meshtastic firmware works without modification.
</TabItem>
</Tabs>
### Custom Firmware
Always include GNSS power initialization for V1.1 compatibility:
```cpp
// Universal initialization - works on both V1.0 and V1.1
void initGNSS() {
// V1.1: Enable GNSS power via GPIO3
// V1.0: This has no effect (pin not connected to GNSS power)
pinMode(3, OUTPUT);
digitalWrite(3, HIGH);
// Wait for GNSS module to initialize
delay(100);
// Continue with GNSS serial setup...
}
```
## Technical Details
### V1.1 Power Architecture
The V1.1 added a dedicated low-dropout regulator (LDO) for the UC6580 GNSS module:
- **Input**: Vext rail (controlled by GPIO3)
- **Output**: Clean 3.3V for GNSS
- **Benefit**: Eliminates voltage drops during high-current LoRa TX
### Power Consumption Improvements
| Mode | V1.0 | V1.1 |
|------|------|------|
| Deep Sleep | ~25 µA | ~15 µA |
| GNSS Only | 90 mA | 89 mA |
| LoRa + GNSS | Unstable | 89 + TX mA |
<Aside type="tip">
The V1.1's isolated power design allows simultaneous GNSS tracking and LoRa transmission without the GNSS losing lock.
</Aside>
## Documentation Links
- [V1.0 Schematic](https://resource.heltec.cn/download/Wireless_Tracker/Wireless_Tacker1.0/HTIT-Tracker_V0.3.pdf)
- [V1.1 Schematic](https://resource.heltec.cn/download/Wireless_Tracker/Wireless_Tacker1.1)
- [V1.1 Datasheet](https://resource.heltec.cn/download/Wireless_Tracker/Wireless%20Tracker%201.1.pdf)

View File

@ -0,0 +1,63 @@
---
title: Product Overview
description: Introduction to the Heltec Wireless Tracker ESP32-S3FN8 development kit
---
import { Aside, Card, CardGrid } from '@astrojs/starlight/components';
The **Wireless Tracker** is a development kit based on the ESP32-S3FN8. It integrates both SX1262 and UC6580 to provide a fast GNSS solution for IoT. Combined with the sample programs and development tools provided, you can track any object and upload data wirelessly via Wi-Fi, Bluetooth, or LoRa.
![Wireless Tracker Board](/images/tracker-1.png)
## Key Features
<CardGrid>
<Card title="Triple Connectivity" icon="setting">
Wi-Fi 802.11 b/g/n, Bluetooth 5 with mesh support, and LoRa SX1262 for long-range communication.
</Card>
<Card title="Dual-Frequency GNSS" icon="rocket">
L1+L5 positioning with GPS, GLONASS, BDS, Galileo, NAVIC, and QZSS support.
</Card>
<Card title="Onboard Display" icon="document">
0.96" RGB TFT-LCD (80×160) for status, debugging, and user interface.
</Card>
<Card title="Battery Management" icon="star">
Integrated lithium battery charging, discharge protection, and automatic USB/battery switching.
</Card>
</CardGrid>
## Hardware Highlights
- **ESP32-S3FN8** dual-core Xtensa LX7 processor with 8MB flash
- **SX1262** LoRa transceiver with up to +21 dBm TX power
- **UC6580** 96-channel GNSS receiver
- **Type-C USB** with ESD protection and voltage regulation
- **SH1.25-2** battery connector with charging circuit
- **IPEX connectors** for LoRa and GNSS external antennas
- **Metal spring antenna** for 2.4 GHz Wi-Fi/Bluetooth
## Product Models
| Model | LoRa Frequency | Regional Networks |
|-------|----------------|-------------------|
| Wireless Tracker-LF | 470-510 MHz | CN470 (China) |
| Wireless Tracker-HF | 863-928 MHz | EU868, US915, AU915, AS923, KR920 |
<Aside type="tip">
Choose the **HF** (High Frequency) variant for most global deployments. The **LF** variant is specifically for China's CN470 band.
</Aside>
## Typical Applications
- **Asset tracking**: Vehicles, containers, equipment
- **Personal safety**: Elderly, children, pets
- **Agriculture**: Livestock, irrigation systems
- **Fleet management**: Delivery, logistics
- **Sports & recreation**: Hiking, cycling, boating
- **Mesh networking**: Meshtastic off-grid communication
## What's Next?
- [Hardware Versions](/getting-started/hardware-versions/) - Differences between V1.0 and V1.1
- [Development Platforms](/getting-started/development-platforms/) - Choose your development environment
- [Pinout Reference](/hardware/pinout/) - Pin assignments and GPIO functions

View File

@ -0,0 +1,290 @@
---
title: Heart Rate Monitor via LoRaWAN
description: Build a wireless heart rate monitor using the Heltec Wireless Tracker and MAX30102 sensor
---
import { Aside, Steps, Tabs, TabItem } from '@astrojs/starlight/components';
This project enables real-time heart rate monitoring using the Wireless Tracker connected to a MAX30102 pulse oximetry sensor. Data transmits via LoRaWAN to the SnapEmu platform for visualization.
## Hardware Requirements
| Component | Purpose |
|-----------|---------|
| Heltec Wireless Tracker | Main controller + LoRa TX |
| HT-M7603 Indoor LoRa Gateway | LoRaWAN network gateway |
| MAX30102 Heart Rate Sensor | Pulse oximetry sensor |
| DuPont Wires | Connections |
## Wiring Diagram
The MAX30102 connects via I2C:
| MAX30102 Pin | Tracker Pin | Description |
|--------------|-------------|-------------|
| VCC | 3V3 | Power (3.3V) |
| GND | GND | Ground |
| SDA | GPIO45 | I2C Data |
| SCL | GPIO46 | I2C Clock |
<Aside type="tip">
GPIO45 and GPIO46 are recommended for I2C as they don't conflict with built-in peripherals on the Wireless Tracker.
</Aside>
## Software Setup
<Steps>
1. **Configure LoRa Gateway**
Set up your HT-M7603 gateway with SnapEmu platform following the [official Heltec documentation](https://docs.heltec.cn/en/gateway/ht-m7603/connect_to_snapemu.html).
2. **Register Device on SnapEmu**
Register your Wireless Tracker node following the [SnapEmu device connection guide](https://snapemudoc.readthedocs.io/en/latest/Node%20Devices%20Connection/register_on_snapemu.html).
3. **Install Libraries**
Required Arduino libraries:
- `Wire.h` (built-in)
- `MAX30102_PulseOximeter.h`
- `LoRaWan_APP.h` (Heltec library)
4. **Test Sensor Standalone**
Upload the test code to verify sensor operation before adding LoRaWAN.
5. **Deploy Full Application**
Upload the complete LoRaWAN code with your OTAA credentials.
</Steps>
## Code Examples
<Tabs>
<TabItem label="Sensor Test">
```cpp
#include <Wire.h>
#include "MAX30102_PulseOximeter.h"
#define REPORTING_PERIOD_MS 1000
PulseOximeter pox;
uint32_t tsLastReport = 0;
void onBeatDetected() {
Serial.println("Beat detected!");
}
void setup() {
Serial.begin(115200);
Wire.begin(45, 46); // SDA=GPIO45, SCL=GPIO46
Serial.print("Initializing MAX30102..");
delay(3000);
if (!pox.begin()) {
Serial.println("FAILED");
for(;;);
} else {
Serial.println("SUCCESS");
}
pox.setIRLedCurrent(MAX30102_LED_CURR_7_6MA);
pox.setOnBeatDetectedCallback(onBeatDetected);
}
void loop() {
pox.update();
if (millis() - tsLastReport > REPORTING_PERIOD_MS) {
float heartRate = pox.getHeartRate();
float spo2 = pox.getSpO2();
Serial.print("HR: ");
Serial.print(heartRate > 0 ? String(heartRate) : "N/A");
Serial.print(" bpm / SpO2: ");
Serial.print(spo2 > 0 ? String(spo2) : "N/A");
Serial.println("%");
tsLastReport = millis();
}
}
```
</TabItem>
<TabItem label="LoRaWAN Code">
```cpp
#include <Wire.h>
#include "MAX30102_PulseOximeter.h"
#include "LoRaWan_APP.h"
#define REPORTING_PERIOD_MS 1000
// OTAA Parameters - Replace with your SnapEmu values
uint8_t devEui[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA8 };
uint8_t appEui[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
uint8_t appKey[] = { 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 };
// LoRaWAN Configuration
uint16_t userChannelsMask[6] = { 0x00FF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 };
LoRaMacRegion_t loraWanRegion = ACTIVE_REGION;
DeviceClass_t loraWanClass = CLASS_A;
uint32_t appTxDutyCycle = 15000; // 15 second transmit interval
bool overTheAirActivation = true;
bool loraWanAdr = true;
bool isTxConfirmed = true;
uint8_t appPort = 2;
uint8_t confirmedNbTrials = 4;
PulseOximeter pox;
uint32_t tsLastReport = 0;
static void prepareTxFrame(uint8_t port) {
pox.update();
float heartRate = pox.getHeartRate();
float spo2 = pox.getSpO2();
unsigned char *puc;
appDataSize = 0;
// Packet header
appData[appDataSize++] = 0x04;
appData[appDataSize++] = 0x00;
appData[appDataSize++] = 0x0A;
appData[appDataSize++] = 0x02;
// Heart rate (4 bytes float)
puc = (unsigned char *)(&heartRate);
appData[appDataSize++] = puc[0];
appData[appDataSize++] = puc[1];
appData[appDataSize++] = puc[2];
appData[appDataSize++] = puc[3];
// Separator
appData[appDataSize++] = 0x12;
// SpO2 (4 bytes float)
puc = (unsigned char *)(&spo2);
appData[appDataSize++] = puc[0];
appData[appDataSize++] = puc[1];
appData[appDataSize++] = puc[2];
appData[appDataSize++] = puc[3];
Serial.printf("TX: HR=%.1f SpO2=%.1f\n", heartRate, spo2);
}
void onBeatDetected() {
Serial.println("Beat!");
}
void setup() {
Serial.begin(115200);
Wire.begin(45, 46);
Mcu.begin(HELTEC_BOARD, SLOW_CLK_TPYE);
Serial.print("Initializing MAX30102..");
delay(3000);
if (!pox.begin()) {
Serial.println("FAILED");
for(;;);
}
Serial.println("SUCCESS");
pox.setIRLedCurrent(MAX30102_LED_CURR_27_1MA);
pox.setOnBeatDetectedCallback(onBeatDetected);
LoRaWAN.init(loraWanClass, loraWanRegion);
LoRaWAN.setDefaultDR(3);
}
void loop() {
pox.update();
// Local display
if (millis() - tsLastReport > REPORTING_PERIOD_MS) {
float heartRate = pox.getHeartRate();
float spo2 = pox.getSpO2();
Serial.printf("HR: %s bpm | SpO2: %s%%\n",
heartRate > 0 ? String(heartRate).c_str() : "N/A",
spo2 > 0 ? String(spo2).c_str() : "N/A");
tsLastReport = millis();
}
// LoRaWAN state machine
switch (deviceState) {
case DEVICE_STATE_INIT:
case DEVICE_STATE_JOIN:
LoRaWAN.join();
break;
case DEVICE_STATE_SEND:
prepareTxFrame(appPort);
LoRaWAN.send();
deviceState = DEVICE_STATE_CYCLE;
break;
case DEVICE_STATE_CYCLE:
txDutyCycleTime = appTxDutyCycle +
randr(-APP_TX_DUTYCYCLE_RND, APP_TX_DUTYCYCLE_RND);
LoRaWAN.cycle(txDutyCycleTime);
deviceState = DEVICE_STATE_SLEEP;
break;
case DEVICE_STATE_SLEEP:
LoRaWAN.sleep(loraWanClass);
break;
default:
deviceState = DEVICE_STATE_INIT;
break;
}
}
```
</TabItem>
<TabItem label="Decoder">
```javascript
// SnapEmu payload decoder
function Decoder(bytes, port) {
var decoded = {};
if (bytes.length >= 13) {
// Extract heart rate (bytes 4-7)
var hrBytes = new Uint8Array([bytes[4], bytes[5], bytes[6], bytes[7]]);
var hrView = new DataView(hrBytes.buffer);
decoded.heartRate = hrView.getFloat32(0, true);
// Extract SpO2 (bytes 9-12)
var spo2Bytes = new Uint8Array([bytes[9], bytes[10], bytes[11], bytes[12]]);
var spo2View = new DataView(spo2Bytes.buffer);
decoded.spo2 = spo2View.getFloat32(0, true);
}
return decoded;
}
```
</TabItem>
</Tabs>
## Platform Features
SnapEmu provides:
- Real-time heart rate graph
- SpO2 level monitoring
- Historical data (up to 1 month)
- Mobile app + web interface
## Troubleshooting
| Issue | Solution |
|-------|----------|
| No heartbeat detected | Ensure finger is properly placed, adjust LED current |
| Erratic readings | Clean sensor, reduce movement, check power supply |
| LoRa join failed | Verify gateway connection, check OTAA credentials |
| Data not on platform | Check decoder function, verify port number matches |
## References
- [SnapEmu Documentation](https://snapemudoc.readthedocs.io/)
- [Heltec Sensor Decoding Guide](https://docs.heltec.cn/general/define_sensor_decoding_function_on_snapemu.html)
Based on the project by ashley15 on Hackster.io.

View File

@ -0,0 +1,299 @@
---
title: LoRaWAN Setup Guide
description: Connect your Heltec Wireless Tracker to LoRaWAN networks
---
import { Aside, Steps, Tabs, TabItem } from '@astrojs/starlight/components';
This guide covers connecting your Wireless Tracker to LoRaWAN networks including The Things Network (TTN), SnapEmu, and other LoRaWAN servers.
## Prerequisites
- Heltec Wireless Tracker with LoRa antenna
- Gateway coverage in your area (or your own gateway)
- Account on your chosen LoRaWAN network server
- Arduino IDE or PlatformIO with Heltec libraries
## Regional Frequencies
Choose the correct model for your region:
| Region | Frequency | Model |
|--------|-----------|-------|
| EU868 | 863-870 MHz | Wireless Tracker-HF |
| US915 | 902-928 MHz | Wireless Tracker-HF |
| AU915 | 915-928 MHz | Wireless Tracker-HF |
| AS923 | 920-925 MHz | Wireless Tracker-HF |
| KR920 | 920-923 MHz | Wireless Tracker-HF |
| CN470 | 470-510 MHz | Wireless Tracker-LF |
<Aside type="caution">
Using the wrong frequency band is illegal in most jurisdictions. Verify your local regulations before transmitting.
</Aside>
## OTAA vs ABP
| Method | Pros | Cons |
|--------|------|------|
| **OTAA** (Over-The-Air Activation) | More secure, automatic session renewal | Requires join process |
| **ABP** (Activation By Personalization) | Immediate transmission | Less secure, manual key management |
<Aside type="tip">
OTAA is recommended for most applications. Use ABP only when join latency is unacceptable.
</Aside>
## Network Registration
<Tabs>
<TabItem label="The Things Network">
### Register on TTN
<Steps>
1. Create account at [thethingsnetwork.org](https://www.thethingsnetwork.org/)
2. Create a new **Application**
3. Add an **End Device**:
- Select "Enter end device specifics manually"
- Frequency plan: Match your region (e.g., US915 FSB2)
- LoRaWAN version: 1.0.3
- Regional Parameters: RP001 Regional Parameters 1.0.3 revision A
4. Generate credentials:
- DevEUI: Generate or use chip's MAC
- AppEUI: All zeros or generate
- AppKey: Generate (save this!)
5. Copy credentials for firmware
</Steps>
### TTN Payload Decoder
```javascript
function decodeUplink(input) {
return {
data: {
// Parse your payload format here
battery: input.bytes[0] / 10,
latitude: ((input.bytes[1] << 24) | (input.bytes[2] << 16) |
(input.bytes[3] << 8) | input.bytes[4]) / 1000000,
longitude: ((input.bytes[5] << 24) | (input.bytes[6] << 16) |
(input.bytes[7] << 8) | input.bytes[8]) / 1000000
},
warnings: [],
errors: []
};
}
```
</TabItem>
<TabItem label="SnapEmu">
### Register on SnapEmu
<Steps>
1. Create account at [snapemu.com](https://snapemu.com/)
2. Configure your Heltec gateway to connect to SnapEmu
3. Add a new **Node Device**
4. Copy the generated credentials:
- DevEUI
- AppEUI
- AppKey
</Steps>
### SnapEmu Features
- Automatic device provisioning for Heltec devices
- Built-in decoder library
- Real-time data visualization
- Historical data storage
</TabItem>
</Tabs>
## Firmware Configuration
### Basic LoRaWAN Example
```cpp
#include "LoRaWan_APP.h"
// OTAA Credentials - Replace with your values
uint8_t devEui[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
uint8_t appEui[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
uint8_t appKey[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
// Channel mask for US915 FSB2 (channels 8-15)
uint16_t userChannelsMask[6] = { 0xFF00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 };
// For EU868, use:
// uint16_t userChannelsMask[6] = { 0x00FF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 };
LoRaMacRegion_t loraWanRegion = LORAMAC_REGION_US915; // Change for your region
DeviceClass_t loraWanClass = CLASS_A;
uint32_t appTxDutyCycle = 60000; // 60 second transmit interval
bool overTheAirActivation = true;
bool loraWanAdr = true;
bool isTxConfirmed = true;
uint8_t appPort = 1;
uint8_t confirmedNbTrials = 4;
void setup() {
Serial.begin(115200);
Mcu.begin(HELTEC_BOARD, SLOW_CLK_TPYE);
LoRaWAN.init(loraWanClass, loraWanRegion);
LoRaWAN.setDefaultDR(3); // SF7-SF12 depending on region
}
static void prepareTxFrame(uint8_t port) {
appDataSize = 4;
// Example: Send battery voltage and status
float voltage = readBatteryVoltage();
uint16_t vBat = (uint16_t)(voltage * 100);
appData[0] = (uint8_t)(vBat >> 8);
appData[1] = (uint8_t)(vBat & 0xFF);
appData[2] = 0x00; // Status byte
appData[3] = 0x00; // Reserved
}
void loop() {
switch (deviceState) {
case DEVICE_STATE_INIT:
LoRaWAN.init(loraWanClass, loraWanRegion);
deviceState = DEVICE_STATE_JOIN;
break;
case DEVICE_STATE_JOIN:
LoRaWAN.join();
break;
case DEVICE_STATE_SEND:
prepareTxFrame(appPort);
LoRaWAN.send();
deviceState = DEVICE_STATE_CYCLE;
break;
case DEVICE_STATE_CYCLE:
txDutyCycleTime = appTxDutyCycle +
randr(-APP_TX_DUTYCYCLE_RND, APP_TX_DUTYCYCLE_RND);
LoRaWAN.cycle(txDutyCycleTime);
deviceState = DEVICE_STATE_SLEEP;
break;
case DEVICE_STATE_SLEEP:
LoRaWAN.sleep(loraWanClass);
break;
default:
deviceState = DEVICE_STATE_INIT;
break;
}
}
float readBatteryVoltage() {
pinMode(2, OUTPUT);
digitalWrite(2, LOW);
int raw = analogRead(1);
digitalWrite(2, HIGH);
return (raw / 4095.0) * 3.3 * 4.9;
}
```
### Region Configuration
| Region | `LoRaMacRegion_t` | Default DR | Notes |
|--------|-------------------|------------|-------|
| EU868 | `LORAMAC_REGION_EU868` | DR5 (SF7) | 1% duty cycle |
| US915 | `LORAMAC_REGION_US915` | DR3 (SF7) | Use FSB2 for TTN |
| AU915 | `LORAMAC_REGION_AU915` | DR3 (SF7) | Similar to US915 |
| AS923 | `LORAMAC_REGION_AS923` | DR5 (SF7) | Multiple sub-bands |
| CN470 | `LORAMAC_REGION_CN470` | DR3 (SF7) | LF model only |
## Sending GPS Data
```cpp
#include "TinyGPS++.h"
TinyGPSPlus gps;
HardwareSerial GPSSerial(1);
void setup() {
// Enable GNSS power (V1.1)
pinMode(3, OUTPUT);
digitalWrite(3, HIGH);
// Initialize GNSS serial
GPSSerial.begin(115200, SERIAL_8N1, 33, 34);
}
static void prepareTxFrame(uint8_t port) {
// Read latest GPS data
while (GPSSerial.available()) {
gps.encode(GPSSerial.read());
}
if (gps.location.isValid()) {
int32_t lat = gps.location.lat() * 1000000;
int32_t lon = gps.location.lng() * 1000000;
appDataSize = 9;
// Latitude (4 bytes, big-endian)
appData[0] = (lat >> 24) & 0xFF;
appData[1] = (lat >> 16) & 0xFF;
appData[2] = (lat >> 8) & 0xFF;
appData[3] = lat & 0xFF;
// Longitude (4 bytes, big-endian)
appData[4] = (lon >> 24) & 0xFF;
appData[5] = (lon >> 16) & 0xFF;
appData[6] = (lon >> 8) & 0xFF;
appData[7] = lon & 0xFF;
// Satellites
appData[8] = gps.satellites.value();
}
}
```
## Troubleshooting
### Join Failures
| Symptom | Cause | Solution |
|---------|-------|----------|
| No join accept | Wrong credentials | Double-check DevEUI, AppEUI, AppKey |
| Timeout | No gateway | Verify gateway coverage |
| Repeated joins | Session expired | Check network server settings |
### No Uplinks Received
1. Verify antenna is connected
2. Check frequency plan matches gateway
3. Increase spreading factor (lower DR) for better range
4. Monitor RSSI/SNR on gateway
### Duty Cycle Exceeded
EU868 has strict 1% duty cycle limits:
```cpp
// Increase transmit interval to respect duty cycle
uint32_t appTxDutyCycle = 300000; // 5 minutes minimum for EU868
```
## References
- [LoRaWAN Specification](https://lora-alliance.org/resource-hub/lorawanr-specification-v103)
- [Heltec LoRaWAN Examples](https://github.com/Heltec-Aaron-Lee/WiFi_Kit_series)
- [TTN Device Registration](https://www.thethingsnetwork.org/docs/devices/)

View File

@ -0,0 +1,162 @@
---
title: Meshtastic Low Power Configuration
description: Optimize battery life on the Heltec Wireless Tracker with Meshtastic
---
import { Aside, Steps } from '@astrojs/starlight/components';
This guide demonstrates how to configure a Heltec Wireless Tracker with Meshtastic to achieve extended battery life through optimized sleep settings.
## Hardware Requirements
- Heltec Wireless Tracker development kit
- 1000mAh (or larger) lithium battery, fully charged
- LoRa antenna (IPEX connector)
- Meshtastic firmware (2.2.17+ recommended)
<Aside type="caution" title="Hardware Version">
V1.1 hardware requires GPIO3 set HIGH to enable GNSS. Meshtastic 2.2.17+ auto-detects the version. For older firmware, use the Heltec-provided temporary firmware.
</Aside>
## Expected Results
With proper configuration, you can achieve:
| Metric | Value |
|--------|-------|
| Idle current draw | 13 µA |
| Active operation | ~1% battery/hour |
| Runtime (1000mAh) | ~100 hours active |
## Power Consumption Reference
| Mode | Current Draw |
|------|--------------|
| Deep Sleep | 13 µA |
| Light Sleep | ~1 mA |
| GPS Active | ~89 mA |
| LoRa TX | ~178 mA |
| LoRa RX | ~59 mA |
## Configuration Steps
<Steps>
1. **Flash Meshtastic Firmware**
Download and flash the latest Meshtastic firmware for Wireless Tracker:
```bash
# Using esptool
esptool.py write_flash 0x0 firmware-heltec-wireless-tracker.factory.bin
# Or use the Meshtastic flasher app
```
2. **Connect via Bluetooth**
Open the Meshtastic mobile app and pair with your device via Bluetooth.
3. **Set Device Role**
Navigate to **Settings → Device Config**:
- Set **Role** to `TRACKER`
4. **Configure Position Settings**
Navigate to **Settings → Position Config**:
| Parameter | Value | Description |
|-----------|-------|-------------|
| Position broadcast interval | 900 s | Broadcast every 15 minutes |
| Smart broadcast min distance | 10 m | Movement threshold |
| Smart broadcast min interval | 900 s | Minimum time between broadcasts |
| GPS update interval | 30 s | How often to poll GPS |
**Pin Configuration** (should be auto-detected):
| Pin | Value |
|-----|-------|
| GPS_RX_PIN | 33 |
| GPS_TX_PIN | 34 |
| PIN_GPS_EN | 3 (V1.1) |
5. **Configure Power Settings**
Navigate to **Settings → Power Config**:
| Parameter | Value | Description |
|-----------|-------|-------------|
| Wait for Bluetooth | 0 | Don't wait for BT connection |
| Super deep sleep duration | 1800 s | 30-minute deep sleep |
| Light sleep duration | 900 s | 15-minute light sleep |
| Minimum wake time | 30 s | Minimum active time |
6. **Save and Reboot**
Apply settings and reboot the device.
</Steps>
## Tips for Maximum Battery Life
1. **Use a larger battery**
- 2000-3000mAh recommended for multi-day operation
- Higher capacity = proportionally longer runtime
2. **Optimize broadcast interval**
- Increase if tracking precision isn't critical
- 15-30 minute intervals work well for most uses
3. **Use external antenna**
- Better signal = faster TX completion = less power
- Quality antenna reduces retransmissions
4. **Disable unused features**
- Wi-Fi: Disable if not needed for configuration
- Bluetooth: Set timeout to 0 after configuration
5. **Reduce GPS polling**
- 60-120 second intervals for stationary tracking
- Disable GPS entirely for relay-only nodes
## Troubleshooting
### Device won't enter deep sleep
<Aside type="tip">
Check that Bluetooth timeout is set to 0 and no active mesh traffic is preventing sleep.
</Aside>
- Verify firmware version supports deep sleep
- Check for continuous mesh traffic
- Ensure no USB power connected (keeps device awake)
### GPS not getting fix
- **V1.1 hardware**: Ensure GPIO3 is HIGH (automatic in new firmware)
- Check antenna connection (IPEX connector fully seated)
- Allow 30-60 seconds for cold start fix
- Move to area with clear sky view
### Battery draining faster than expected
- Check if device is stuck in active mode (monitor serial output)
- Verify sleep settings were saved (check via app)
- Look for wake events in serial log
- Ensure no continuous retransmissions (poor antenna/coverage)
## Serial Monitoring
Monitor power states via serial console:
```cpp
// Connect at 115200 baud
// Look for these messages:
// "Going to deep sleep for X seconds"
// "Waking from deep sleep"
// "GPS fix acquired"
// "Transmitting position"
```
## Source
Based on the tutorial by ashley15 on Hackster.io, adapted for Wireless Tracker V1.1.

View File

@ -0,0 +1,229 @@
---
title: Pinout Reference
description: Pin assignments and GPIO functions for the Heltec Wireless Tracker
---
import { Aside, Tabs, TabItem } from '@astrojs/starlight/components';
## Pin Map Overview
![Wireless Tracker Pin Map](/images/datasheet/wireless-tracker-datasheet_page_6_img_1.png)
<Aside type="note">
The pin assignments follow the ESP32-S3 GPIO numbering scheme. Color coding: **Red** = Power, **Green** = GND, **Blue** = GPIO, **Pink** = ADC/DAC, **Yellow** = Serial/SPI/I2C, **Purple** = Connected internally.
</Aside>
## Header J2 (Left Side)
### Power Pins
| Pin | Name | Type | Function |
|-----|------|------|----------|
| 1 | 5V | Power | 5V power supply |
| 2 | GND | Power | Ground |
| 3 | 3V3 | Power | 3.3V output |
| 4 | GND | Power | Ground |
| 5 | 3V3 | Power | 3.3V output |
| 6 | GND | Power | Ground |
| 7 | Vext | Power | 3.3V output for TFT and GNSS |
| 8 | GND | Power | Ground |
### GPIO Pins (J2)
| Pin | GPIO | Type | Primary Function | Alternate Functions |
|-----|------|------|------------------|---------------------|
| 1 | RST | - | Reset button | - |
| 2 | 0 | I/O | USER button | Boot select |
| 3 | 1 | I/O | **Vbat_Read**¹ | Touch1, ADC1_CH0 |
| 4 | 2 | I/O | ADC Control | Touch2, ADC1_CH1 |
| 5 | 3 | I/O | **Vext Control**² | Touch3, ADC1_CH2 |
| 6 | 19 | I/O | USB D- | CLK_OUT2, ADC2_CH8, U1RTS |
| 7 | 20 | I | USB D+ | CLK_OUT1, ADC2_CH9, U1CTS |
| 8 | 21 | I/O | TFT backlight | - |
| 9 | 26 | I/O | General I/O | SPICS1 |
| 10 | 48 | I/O | D_SEL | - |
| 11 | 47 | I/O | Boot mode | - |
| 12 | 33 | I/O | **GNSS TX** | SPIIO4, FSPIHD |
| 13 | 34 | I/O | **GNSS RX** | SPI05, FSPICS0 |
| 14 | 35 | I/O | **GNSS RST** | SPI06, FSPID |
| 15 | 36 | I/O | **GNSS PPS** | SPI07, FSPICLK |
| 16 | 37 | I/O | General I/O | SPIDQS, FSPIQ |
<Aside type="tip" title="Battery Reading">
¹ Battery voltage: `VBAT = Vbat_Read × 4.9`
</Aside>
<Aside type="caution" title="V1.1 Hardware">
² GPIO3 controls GNSS power on V1.1. Set HIGH to enable the GNSS module.
</Aside>
## Header J3 (Right Side)
### GPIO Pins (J3)
| Pin | GPIO | Type | Primary Function | Alternate Functions |
|-----|------|------|------------------|---------------------|
| 1 | 18 | I/O | **LED Control** | U1RXD, ADC2_CH7, CLK_OUT3 |
| 2 | 17 | I/O | General I/O | U1TXD, ADC2_CH6 |
| 3 | 16 | I/O | General I/O | U0CTS, ADC2_CH5, XTAL_32K_N |
| 4 | 15 | I/O | General I/O | U0RTS, ADC2_CH4, XTAL_32K_P |
| 5 | 7 | I/O | General I/O | ADC1_CH6, Touch7 |
| 6 | 6 | I/O | General I/O | ADC1_CH5, Touch6 |
| 7 | 5 | I/O | General I/O | ADC1_CH4, Touch5 |
| 8 | 4 | I/O | General I/O | ADC1_CH3, Touch4 |
| Pin | GPIO | Type | Primary Function | Alternate Functions |
|-----|------|------|------------------|---------------------|
| 1 | 46 | I/O | **I2C SCL** | - |
| 2 | 45 | I/O | **I2C SDA** | - |
| 4 | 44 | I/O | U0RXD | Serial RX |
| 5 | 43 | I/O | U0TXD | Serial TX |
| 6 | 14 | I/O | **LoRa DIO1** | ADC2_CH3, Touch14 |
| 7 | 13 | I/O | **LoRa Busy** | ADC2_CH2, Touch13 |
| 8 | 12 | I/O | **LoRa RST** | ADC2_CH1, Touch12 |
| 9 | 11 | I/O | **LoRa MISO** | ADC2_CH0, Touch11 |
| 10 | 10 | I/O | **LoRa MOSI** | ADC1_CH9, Touch10 |
| 11 | 9 | I/O | **LoRa SCK** | ADC1_CH8, Touch9 |
| 12 | 8 | I/O | **LoRa NSS** | ADC1_CH7, Touch8, SUBSPICS1 |
| 13 | 42 | I/O | **TFT SDIN** | MTMS |
| 14 | 41 | I/O | **TFT SCLK** | MTDI |
| 15 | 40 | I/O | **TFT RS** | MTMS |
| 16 | 39 | I/O | **TFT RES** | MTMS |
| 18 | 38 | I/O | **TFT CS** | FSPIWP, SUBSPIWP |
## Peripheral Pin Assignments
### GNSS Module (UC6580)
| Function | GPIO | Notes |
|----------|------|-------|
| TX | 33 | GNSS → ESP32 |
| RX | 34 | ESP32 → GNSS |
| RST | 35 | Active low reset |
| PPS | 36 | 1PPS timing output |
| Power | 3 | V1.1: HIGH to enable |
### LoRa Module (SX1262)
| Function | GPIO | Notes |
|----------|------|-------|
| MOSI | 10 | SPI data out |
| MISO | 11 | SPI data in |
| SCK | 9 | SPI clock |
| NSS | 8 | Chip select (active low) |
| RST | 12 | Reset |
| BUSY | 13 | Busy indicator |
| DIO1 | 14 | Interrupt |
### TFT Display (ST7735S)
| Function | GPIO | Notes |
|----------|------|-------|
| SDIN | 42 | SPI data |
| SCLK | 41 | SPI clock |
| RS (DC) | 40 | Data/Command |
| RES | 39 | Reset |
| CS | 38 | Chip select |
| LED_K | 21 | Backlight control |
### I2C Bus
| Function | GPIO | Notes |
|----------|------|-------|
| SDA | 45 | Data |
| SCL | 46 | Clock |
<Aside type="tip">
GPIO45 and GPIO46 are recommended for external I2C devices as they don't conflict with built-in peripherals.
</Aside>
## Code Examples
<Tabs>
<TabItem label="Pin Definitions">
```cpp
// Wireless Tracker Pin Definitions
// GNSS (UC6580)
#define GNSS_TX_PIN 33
#define GNSS_RX_PIN 34
#define GNSS_RST_PIN 35
#define GNSS_PPS_PIN 36
#define GNSS_PWR_PIN 3 // V1.1 only
// LoRa (SX1262)
#define LORA_MOSI_PIN 10
#define LORA_MISO_PIN 11
#define LORA_SCK_PIN 9
#define LORA_NSS_PIN 8
#define LORA_RST_PIN 12
#define LORA_BUSY_PIN 13
#define LORA_DIO1_PIN 14
// TFT Display
#define TFT_SDIN_PIN 42
#define TFT_SCLK_PIN 41
#define TFT_DC_PIN 40
#define TFT_RST_PIN 39
#define TFT_CS_PIN 38
#define TFT_LED_PIN 21
// I2C
#define I2C_SDA_PIN 45
#define I2C_SCL_PIN 46
// User Interface
#define USER_BTN_PIN 0
#define LED_PIN 18
// Battery
#define VBAT_ADC_PIN 1
#define VBAT_ADC_CTRL 2
#define VEXT_CTRL_PIN 3
```
</TabItem>
<TabItem label="Initialization">
```cpp
void initGNSS() {
// Enable GNSS power (V1.1)
pinMode(GNSS_PWR_PIN, OUTPUT);
digitalWrite(GNSS_PWR_PIN, HIGH);
// Setup GNSS serial
Serial1.begin(115200, SERIAL_8N1, GNSS_RX_PIN, GNSS_TX_PIN);
}
void initLoRa() {
SPI.begin(LORA_SCK_PIN, LORA_MISO_PIN, LORA_MOSI_PIN, LORA_NSS_PIN);
pinMode(LORA_RST_PIN, OUTPUT);
pinMode(LORA_BUSY_PIN, INPUT);
pinMode(LORA_DIO1_PIN, INPUT);
// Reset LoRa module
digitalWrite(LORA_RST_PIN, LOW);
delay(10);
digitalWrite(LORA_RST_PIN, HIGH);
delay(10);
}
void initDisplay() {
pinMode(TFT_LED_PIN, OUTPUT);
digitalWrite(TFT_LED_PIN, HIGH); // Enable backlight
// TFT initialization via library...
}
float readBatteryVoltage() {
pinMode(VBAT_ADC_CTRL, OUTPUT);
digitalWrite(VBAT_ADC_CTRL, LOW);
int raw = analogRead(VBAT_ADC_PIN);
float voltage = (raw / 4095.0) * 3.3 * 4.9;
digitalWrite(VBAT_ADC_CTRL, HIGH);
return voltage;
}
```
</TabItem>
</Tabs>

View File

@ -0,0 +1,207 @@
---
title: Power Management
description: Power supply options and consumption characteristics for the Wireless Tracker
---
import { Aside, Tabs, TabItem } from '@astrojs/starlight/components';
## Power Supply Options
The Wireless Tracker supports multiple power sources with automatic switching.
<Aside type="caution">
Only connect a single power source at a time, except when using USB/5V pin specifically to charge the lithium battery.
</Aside>
### Input Specifications
| Power Mode | Min | Typical | Max | Unit |
|------------|-----|---------|-----|------|
| Type-C USB (≥500mA) | 4.7 | 5.0 | 6.0 | V |
| Lithium battery (≥250mA) | 3.3 | 3.7 | 4.2 | V |
| 5V pin (≥500mA) | 4.7 | 5.0 | 6.0 | V |
| 3V3 pin (≥150mA) | 2.7 | 3.3 | 3.5 | V |
### Output Specifications
| Output | Max Current | Notes |
|--------|-------------|-------|
| 3.3V Pin | 500 mA | Regulated output |
| 5V Pin | 500 mA | USB powered only |
| Vext Pin | 350 mA | Powers TFT + GNSS |
## Power Consumption
### By Operating Mode
| Mode | USB Power | Battery Power |
|------|-----------|---------------|
| Wi-Fi Scanning | 100 mA | 74 mA |
| Wi-Fi Access Point | 150 mA | 111 mA |
| Bluetooth Active | 102 mA | 75 mA |
| GNSS Active | 120 mA | 89 mA |
| LoRa TX @ 14 dBm | 200 mA | 148 mA |
| LoRa TX @ 17 dBm | 220 mA | 163 mA |
| LoRa TX @ 22 dBm | 240 mA | 178 mA |
| LoRa RX Only | 80 mA | 59 mA |
| Deep Sleep | 2 mA | **15 µA** |
<Aside type="tip">
Battery operation is more efficient because it avoids USB-to-3.3V regulator losses. The dramatic difference in sleep current (2mA vs 15µA) makes battery power essential for long-term deployments.
</Aside>
## Battery Management
The Wireless Tracker includes an integrated battery management system:
- **Charging**: Automatic when USB connected with battery attached
- **Protection**: Overcharge, over-discharge, short circuit
- **Switching**: Automatic USB/battery source selection
- **Monitoring**: Battery voltage readable via GPIO1 ADC
### Reading Battery Voltage
```cpp
#define VBAT_ADC_PIN 1
#define VBAT_CTRL_PIN 2
float getBatteryVoltage() {
// Enable ADC voltage divider
pinMode(VBAT_CTRL_PIN, OUTPUT);
digitalWrite(VBAT_CTRL_PIN, LOW);
// Read ADC
int rawADC = analogRead(VBAT_ADC_PIN);
// Disable voltage divider to save power
digitalWrite(VBAT_CTRL_PIN, HIGH);
// Convert to voltage
// Formula: VBAT = ADC_Reading × (3.3V / 4095) × 4.9
float voltage = (rawADC / 4095.0) * 3.3 * 4.9;
return voltage;
}
int getBatteryPercent() {
float voltage = getBatteryVoltage();
// Simple linear approximation
// 4.2V = 100%, 3.3V = 0%
int percent = (int)((voltage - 3.3) / (4.2 - 3.3) * 100);
return constrain(percent, 0, 100);
}
```
### Battery Voltage Thresholds
| Voltage | State | Approximate % |
|---------|-------|---------------|
| 4.20 V | Full | 100% |
| 4.00 V | High | 80% |
| 3.80 V | Medium | 50% |
| 3.60 V | Low | 20% |
| 3.40 V | Critical | 5% |
| 3.30 V | Cutoff | 0% |
## Low Power Modes
### Deep Sleep
The ESP32-S3 supports ultra-low-power deep sleep mode:
```cpp
#include "esp_sleep.h"
void enterDeepSleep(uint64_t sleepTimeUs) {
// Disable peripherals
digitalWrite(GNSS_PWR_PIN, LOW); // V1.1
digitalWrite(TFT_LED_PIN, LOW);
// Configure wakeup
esp_sleep_enable_timer_wakeup(sleepTimeUs);
// Optional: wakeup on button press
esp_sleep_enable_ext0_wakeup(GPIO_NUM_0, LOW);
// Enter deep sleep
esp_deep_sleep_start();
}
void setup() {
// Check wakeup reason
esp_sleep_wakeup_cause_t reason = esp_sleep_get_wakeup_cause();
switch (reason) {
case ESP_SLEEP_WAKEUP_TIMER:
Serial.println("Woke from timer");
break;
case ESP_SLEEP_WAKEUP_EXT0:
Serial.println("Woke from button");
break;
default:
Serial.println("Normal boot");
break;
}
}
```
### Light Sleep
For faster wake with moderate power savings:
```cpp
void enterLightSleep(uint64_t sleepTimeUs) {
esp_sleep_enable_timer_wakeup(sleepTimeUs);
esp_light_sleep_start();
// Execution continues here after wakeup
}
```
## Peripheral Power Control
### Vext Control (V1.1)
GPIO3 controls the Vext rail that powers the TFT display and GNSS module:
```cpp
#define VEXT_PIN 3
void enableVext() {
pinMode(VEXT_PIN, OUTPUT);
digitalWrite(VEXT_PIN, HIGH);
}
void disableVext() {
digitalWrite(VEXT_PIN, LOW);
}
```
<Aside type="note">
On V1.0 hardware, Vext is always enabled. The GPIO3 control was added in V1.1 for better power management.
</Aside>
### Display Backlight
```cpp
#define TFT_LED 21
void setBacklight(bool on) {
digitalWrite(TFT_LED, on ? HIGH : LOW);
}
// PWM dimming (optional)
void setBacklightBrightness(uint8_t level) {
analogWrite(TFT_LED, level); // 0-255
}
```
## Power Optimization Tips
1. **Disable unused peripherals**: Turn off Wi-Fi, Bluetooth, GNSS when not needed
2. **Use deep sleep**: 15µA vs 74mA is a 5000× improvement
3. **Reduce LoRa TX power**: 14dBm uses 25% less current than 22dBm
4. **Lower GNSS update rate**: 1Hz vs 10Hz reduces average current
5. **PWM the display**: Dimming backlight saves significant power
6. **Batch operations**: Wake, collect data, transmit, sleep

View File

@ -0,0 +1,189 @@
---
title: Schematic Reference
description: Component reference and circuit details for the Heltec Wireless Tracker
---
import { Aside } from '@astrojs/starlight/components';
This page provides a reference to the key components and circuit blocks in the Wireless Tracker. For full schematics, see the [Downloads](/resources/downloads/) page.
## Block Diagram
![Hardware Resources Overview](/images/structure-chart.png)
## Power Management
The power section provides battery charging, voltage regulation, and power path management.
### Components
| Component | Value/Part | Function |
|-----------|-----------|----------|
| F1 | 6V 500mA | Input fuse |
| D1 | RSB6.8S | TVS diode (ESD protection) |
| D2 | 1N5819 | Schottky diode (reverse polarity) |
| Q1 | AO3401 | P-channel MOSFET (power switch) |
| U2 | TP4054 | Li-Po charger IC |
| U4 | CE6260B33M | 3.3V LDO (main) |
| U6 | CE6260B33M | 3.3V LDO (Vext) |
| R16 | 2K/5% | Charge current programming |
<Aside type="tip">
The charge current is set by R16. With 2KΩ, charging current is approximately 500mA. Modify this resistor to adjust charging rate.
</Aside>
### Battery Monitoring
| Component | Value | Function |
|-----------|-------|----------|
| R13 | 390K/1% | Voltage divider (high side) |
| R14 | 100K/1% | Voltage divider (low side) |
| Q3 | S9013 | ADC enable transistor |
Voltage divider ratio: `4.9:1` → `VBAT = ADC × 4.9`
## ESP32-S3FN8 (U7)
The main MCU handles all processing, connectivity, and peripheral control.
### Crystal Oscillators
| Component | Value | Function |
|-----------|-------|----------|
| U5 | 40 MHz | Main crystal |
| C19, C20 | 22pF | Main crystal load caps |
| X1 | 32.768 kHz | RTC crystal |
| C8, C22 | 4.7pF | RTC crystal load caps |
### Key GPIO Assignments
| GPIO | Function | Notes |
|------|----------|-------|
| 0 | USER_Key | Boot select / user button |
| 1 | Vbat_Read | Battery ADC input |
| 2 | ADC_Ctrl | ADC enable control |
| 3 | Vext_Ctrl | External power control (V1.1) |
| 8-14 | LoRa SPI | NSS, SCK, MOSI, MISO, RST, BUSY, DIO1 |
| 18 | LED | User LED control |
| 19/20 | USB | D-/D+ native USB |
| 21 | LED_K | TFT backlight |
| 33-36 | GNSS | TX, RX, RST, PPS |
| 38-42 | TFT | CS, RES, RS, SCLK, SDIN |
## SX1262 LoRa Module (U12)
The LoRa transceiver provides long-range, low-power wireless communication.
### RF Components
| Component | Value | Function |
|-----------|-------|----------|
| L1 | 2.7nH | RF matching |
| L2 | 24nH | RF filter |
| L3 | 2.0nH | RF matching |
| C12, C15, C18, C25 | 0.1µF | Decoupling |
| C13, C14 | 1.8pF | RF matching |
| U11 | UPG2179 | RF switch |
| X4 | 32 MHz | TCXO |
| E4 | IPEX | LoRa antenna connector |
### SPI Interface
| Signal | GPIO | Direction |
|--------|------|-----------|
| NSS | 8 | Output (chip select) |
| SCK | 9 | Output (clock) |
| MOSI | 10 | Output (data to SX1262) |
| MISO | 11 | Input (data from SX1262) |
| RST | 12 | Output (reset) |
| BUSY | 13 | Input (busy indicator) |
| DIO1 | 14 | Input (interrupt) |
## UC6580 GNSS Module (U9)
The GNSS receiver provides multi-constellation positioning with L1+L5 frequencies.
### Crystal and Timing
| Component | Value | Function |
|-----------|-------|----------|
| X2 | 26 MHz | Main TCXO |
| X3 | 32.768 kHz | RTC crystal |
| C34, C41 | 4.7pF | Crystal load caps |
| R27 | 10K | Reset pullup |
### RF Frontend
| Component | Value | Function |
|-----------|-------|----------|
| U8 | HDDL1L5RSS-B8 | L1/L5 LNA |
| U10 | SW7125DE | RF amplifier |
| E3 | IPEX | GNSS antenna connector |
### RF Matching Network
| Component | Value |
|-----------|-------|
| L4 | 68nH |
| L5 | 1nH |
| L6 | 2.2nH |
| L7 | 18nH |
| L9 | 6.8nH |
| L10 | 7nH |
| L11 | 4.5nH |
| EL2 | 1µH |
### UART Interface
| Signal | GPIO | Direction |
|--------|------|-----------|
| TX | 33 | GNSS → ESP32 |
| RX | 34 | ESP32 → GNSS |
| RST | 35 | Reset (active low) |
| PPS | 36 | 1PPS timing pulse |
## TFT Display (U1)
The 0.96" TFT display (ST7735S driver) provides visual feedback.
| Signal | GPIO | Function |
|--------|------|----------|
| SDIN | 42 | SPI data |
| SCLK | 41 | SPI clock |
| RS (DC) | 40 | Data/Command select |
| RES | 39 | Reset |
| CS | 38 | Chip select |
| LED_K | 21 | Backlight (via Q4) |
## USB Type-C (U3)
| Pin | Signal | Notes |
|-----|--------|-------|
| VBUS | VDD_5V | 5V power input |
| DN1/DN2 | USB_N | Data negative |
| DP1/DP2 | USB_P | Data positive |
| CC1 | R3 (5.1K) | Configuration channel |
| CC2 | R6 (5.1K) | Configuration channel |
<Aside type="note">
The 5.1K resistors on CC1/CC2 identify the device as a UFP (Upstream Facing Port) sink, requesting 5V power from USB-C sources.
</Aside>
## Status LEDs
| LED | Color | Resistor | Function |
|-----|-------|----------|----------|
| LED1 | Orange | R7 (330Ω) | Charging indicator |
| LED2 | White | R10 (330Ω) | User LED (GPIO18) |
## Buttons
| Button | Function | GPIO |
|--------|----------|------|
| S1 | RESET_SW | RST |
| S2 | USER_SW | GPIO0 |
## Download Links
- [V1.0 Schematic (PDF)](https://resource.heltec.cn/download/Wireless_Tracker/Wireless_Tacker1.0/HTIT-Tracker_V0.3.pdf)
- [V1.1 Schematic (PDF)](https://resource.heltec.cn/download/Wireless_Tracker/Wireless_Tacker1.1/HTIT-Tracker_V0.5.pdf)

View File

@ -0,0 +1,147 @@
---
title: Specifications
description: Complete technical specifications for the Heltec Wireless Tracker
---
import { Aside } from '@astrojs/starlight/components';
## General Specifications
| Parameter | Value |
|-----------|-------|
| **Master Chip** | ESP32-S3FN8 (Xtensa 32-bit LX7 dual-core) |
| **LoRa Chipset** | Semtech SX1262 |
| **GNSS Chipset** | Unicore UC6580 |
| **LoRa Frequency** | 470-510 MHz (LF) / 863-928 MHz (HF) |
| **Max TX Power** | 21 ±1 dBm |
| **LoRa Sensitivity** | -135 dBm @ SF12/125kHz |
| **Wi-Fi** | 802.11 b/g/n (2.4 GHz) |
| **Bluetooth** | Bluetooth 5, BLE, Mesh |
| **Operating Temp** | -20°C to +70°C |
| **Dimensions** | 65.48 × 28.06 × 13.52 mm |
## Interfaces
| Interface | Description |
|-----------|-------------|
| USB | Type-C with ESD protection |
| Battery | SH1.25-2 lithium battery connector |
| LoRa Antenna | IPEX (U.FL) connector |
| GNSS Antenna | IPEX (U.FL) connector |
| Wi-Fi/BT Antenna | Onboard 2.4 GHz metal spring |
| Display | 0.96" TFT-LCD (80×160 RGB) |
## Power Supply
<Aside type="caution">
Except when USB or 5V Pin is connected for lithium battery charging, only connect a single power source at a time.
</Aside>
| Power Mode | Minimum | Typical | Maximum | Unit |
|------------|---------|---------|---------|------|
| Type-C USB (≥500mA) | 4.7 | 5.0 | 6.0 | V |
| Lithium battery (≥250mA) | 3.3 | 3.7 | 4.2 | V |
| 5V pin (≥500mA) | 4.7 | 5.0 | 6.0 | V |
| 3V3 pin (≥150mA) | 2.7 | 3.3 | 3.5 | V |
## Power Output
| Output Pin | Max Current |
|------------|-------------|
| 3.3V Pin | 500 mA |
| 5V Pin (USB powered only) | 500 mA |
| Vext Pin | 350 mA |
## Power Consumption
| Mode | USB Power | Battery Power |
|------|-----------|---------------|
| Wi-Fi Scan | 100 mA | 74 mA |
| Wi-Fi AP | 150 mA | 111 mA |
| Bluetooth | 102 mA | 75 mA |
| GNSS Active | 120 mA | 89 mA |
| LoRa TX 14 dBm | 200 mA | 148 mA |
| LoRa TX 17 dBm | 220 mA | 163 mA |
| LoRa TX 22 dBm | 240 mA | 178 mA |
| LoRa RX | 80 mA | 59 mA |
| Deep Sleep | 2 mA | 15 µA |
<Aside type="tip">
Battery-powered operation is more efficient due to the lack of USB-to-3.3V conversion losses. The 15µA sleep current enables months of standby on a typical lithium cell.
</Aside>
## LoRa RF Specifications
### Transmit Power
| Frequency Band | Max Power |
|----------------|-----------|
| 470-510 MHz | 21 ±1 dBm |
| 867-870 MHz | 21 ±1 dBm |
| 902-928 MHz | 21 ±1 dBm |
### Receiver Sensitivity
| Bandwidth | Spreading Factor | Sensitivity |
|-----------|------------------|-------------|
| 125 kHz | SF12 | -135 dBm |
| 125 kHz | SF10 | -130 dBm |
| 125 kHz | SF7 | -124 dBm |
### Regional Frequencies
| Region | Frequency (MHz) | Model |
|--------|-----------------|-------|
| EU433 | 433.175-434.665 | Wireless Tracker-LF |
| CN470 | 470-510 | Wireless Tracker-LF |
| IN868 | 865-867 | Wireless Tracker-HF |
| EU868 | 863-870 | Wireless Tracker-HF |
| US915 | 902-928 | Wireless Tracker-HF |
| AU915 | 915-928 | Wireless Tracker-HF |
| KR920 | 920-923 | Wireless Tracker-HF |
| AS923 | 920-925 | Wireless Tracker-HF |
## GNSS Specifications
### Basic Information
| Parameter | Value |
|-----------|-------|
| Channels | 96 |
| Update Rate | Up to 10 Hz |
| Data Format | NMEA-0183, Unicore, RTCM 3.x |
| Frequency Points | GPS L1+L5, BDS B2a, GLONASS G1, Galileo E1+E5a, QZSS L1+L5, SBAS L1, NAVIC L5* |
*NAVIC L5 requires specific firmware
### Position Accuracy
| Parameter | Value |
|-----------|-------|
| Horizontal (RMS) | 1.5 m |
| Vertical (RMS) | 2.5 m |
| Time (RMS) | 5 ns |
| Speed | 0.02 m/s |
### Time to First Fix (TTFF)
| Mode | Time |
|------|------|
| Cold Start | < 26 s |
| Warm Start | < 2 s |
| Recapture | 1 s |
### Sensitivity by System
| Sensitivity | GNSS | BDS | GPS | Galileo | GLONASS |
|-------------|------|-----|-----|---------|---------|
| Cold Start | -148 | -146 | -148 | -144 | -144 dBm |
| Warm Start | -156 | -155 | -155 | -154 | -148 dBm |
| Tracking | -165 | -163 | -165 | -163 | -158 dBm |
| Recapture | -156 | -154 | -156 | -154 | -152 dBm |
## Physical Dimensions
![Physical Dimensions](/images/datasheet/wireless-tracker-datasheet_page_16_img_1.png)
Dimensions: **65.48 × 28.06 × 13.52 mm**

View File

@ -0,0 +1,71 @@
---
title: Heltec Wireless Tracker
description: Documentation for the Heltec Wireless Tracker ESP32-S3FN8 development kit
template: splash
hero:
tagline: A compact development kit combining ESP32-S3, LoRa, and multi-constellation GNSS for IoT tracking applications
image:
file: ../../assets/tracker-icon.svg
actions:
- text: Get Started
link: /getting-started/overview/
icon: right-arrow
variant: primary
- text: View Pinout
link: /hardware/pinout/
icon: external
---
import { Card, CardGrid, LinkCard } from '@astrojs/starlight/components';
## What is the Wireless Tracker?
The **Heltec Wireless Tracker** is a development kit based on the ESP32-S3FN8 that integrates:
- **SX1262** LoRa transceiver for long-range, low-power communication
- **UC6580** GNSS module with L1+L5 dual-frequency positioning
- **0.96" TFT display** for status and debugging
- **Lithium battery management** with charging and protection
<CardGrid stagger>
<Card title="Multi-Constellation GNSS" icon="rocket">
Supports GPS, GLONASS, BDS, Galileo, NAVIC, and QZSS for fast, accurate positioning anywhere in the world.
</Card>
<Card title="LoRaWAN Ready" icon="setting">
Compatible with EU868, US915, AU915, AS923, and other regional LoRaWAN frequencies for global deployment.
</Card>
<Card title="Low Power Design" icon="star">
22nm technology enables sleep currents as low as 15µA on battery power for extended field operation.
</Card>
<Card title="Meshtastic Compatible" icon="puzzle">
Works with Meshtastic firmware for decentralized off-grid mesh networking.
</Card>
</CardGrid>
## Hardware Variants
| Model | Frequency Range | Use Case |
|-------|-----------------|----------|
| **Wireless Tracker-LF** | 470-510 MHz | China mainland (CN470) |
| **Wireless Tracker-HF** | 863-928 MHz | EU868, US915, AU915, AS923, KR920 |
:::caution[Hardware Version]
The V1.1 hardware revision changed GNSS power control to GPIO3. Check [Hardware Versions](/getting-started/hardware-versions/) for compatibility details.
:::
## Quick Links
<CardGrid>
<LinkCard title="Specifications" href="/hardware/specifications/" description="Full technical specifications" />
<LinkCard title="Pinout Reference" href="/hardware/pinout/" description="Pin assignments and functions" />
<LinkCard title="Development Platforms" href="/getting-started/development-platforms/" description="Arduino, ESP-IDF, MicroPython" />
<LinkCard title="Downloads" href="/resources/downloads/" description="Datasheets, schematics, firmware" />
</CardGrid>
## Popular Guides
<CardGrid>
<LinkCard title="Meshtastic Low Power" href="/guides/meshtastic-low-power/" description="Extend battery life with optimized sleep settings" />
<LinkCard title="Heart Rate Monitor" href="/guides/heart-rate-monitor/" description="Build a LoRaWAN health sensor" />
<LinkCard title="LoRaWAN Setup" href="/guides/lorawan-setup/" description="Connect to The Things Network and SnapEmu" />
</CardGrid>

View File

@ -0,0 +1,212 @@
---
title: Frequently Asked Questions
description: Common questions and solutions for the Heltec Wireless Tracker
---
import { Aside } from '@astrojs/starlight/components';
## Bootloader & Programming
### How do I enter boot mode manually?
The Wireless Tracker uses ESP32-S3's internal USB, which may fail to enter bootloader mode in certain situations. To manually enter boot mode:
**Device not connected:**
1. Press and hold the `USER` button
2. Connect the USB cable
3. Release `USER` button
**Device already connected:**
1. Hold `USER` button
2. Press `RESET` button
3. Release `RESET` button
4. Release `USER` button
<Aside type="note">
Timing requirement: Reset signal must be held for ≥10 ms
</Aside>
### Why can't I upload code?
Common causes:
1. Wrong board selected in IDE
2. Device not in bootloader mode
3. Serial port driver issues
4. Another program has the port open
**Solutions:**
1. Select "Heltec Wireless Tracker" in board manager
2. Use manual boot mode entry (see above)
3. Install CP210x or CH340 drivers if needed
4. Close serial monitor before uploading
## Hardware Versions
### What are the key differences between V1.0 and V1.1?
| Feature | V1.0 | V1.1 |
|---------|------|------|
| GNSS Power | Shared rail | Dedicated LDO |
| GNSS Control | Always on | GPIO3 (HIGH = enabled) |
| Power Isolation | Limited | Improved |
| Sleep Current | ~25 µA | ~15 µA |
<Aside type="caution" title="Important">
V1.1 requires **GPIO3 set to HIGH** to enable the GNSS module. Firmware written for V1.0 may not work correctly on V1.1.
</Aside>
### How do I identify my hardware version?
1. **Physical marking**: Look for version marking on PCB near USB connector
2. **Programmatic detection**: V1.1 has GNSS tied to GPIO3 control
```cpp
// Simple test - if GNSS works after this, it's V1.1
pinMode(3, OUTPUT);
digitalWrite(3, HIGH);
```
## Meshtastic
### Why isn't Meshtastic firmware working on V1.1?
The V1.1 hardware changed the GNSS power control pin to GPIO3. Older Meshtastic firmware didn't know about this change.
**Solution:**
- Use **Meshtastic 2.2.17 Beta or later** (auto-detects version)
- Or use temporary Heltec firmware: `device-install.bat -f firmware.factory.bin`
### Device shows "No GPS" in Meshtastic
1. **V1.1 hardware**: Ensure you're using compatible firmware
2. **Antenna**: Check GNSS antenna is connected (IPEX connector)
3. **Location**: Move outdoors with clear sky view
4. **Cold start**: Allow 30-60 seconds for initial fix
## Display Issues
### Why is my screen not displaying?
**When running LoRa/LoRaWAN code:**
1. Check serial output for errors
2. Press RST button
3. Verify device activation via licensing docs
**When running Meshtastic:**
1. Confirm correct firmware version for your hardware
2. Check display settings in Meshtastic app
3. Verify backlight pin (GPIO21) is enabled
### Screen shows garbage or artifacts
1. Check TFT library version compatibility
2. Verify SPI pin configuration
3. Try reducing SPI clock speed
4. Check power supply stability
## Power & Battery
### How do I read battery voltage?
```cpp
#define VBAT_ADC_PIN 1
#define VBAT_CTRL_PIN 2
float readBattery() {
pinMode(VBAT_CTRL_PIN, OUTPUT);
digitalWrite(VBAT_CTRL_PIN, LOW); // Enable divider
int raw = analogRead(VBAT_ADC_PIN);
digitalWrite(VBAT_CTRL_PIN, HIGH); // Disable to save power
// VBAT = ADC * 4.9
return (raw / 4095.0) * 3.3 * 4.9;
}
```
### Device won't charge
1. Verify USB cable supports data+power (not charge-only)
2. Check battery polarity (red=positive)
3. Battery may be deeply discharged - leave connected for 30 min
4. Check charging LED (orange when charging)
### High sleep current consumption
1. **V1.1**: Set GPIO3 LOW to disable GNSS in sleep
2. Disable display backlight (GPIO21 LOW)
3. Disable WiFi/BT before sleep
4. Use `esp_deep_sleep_start()` not light sleep
## GPS/GNSS
### GPS won't get a fix
1. **Antenna**: Ensure IPEX antenna is connected securely
2. **Power (V1.1)**: Set GPIO3 HIGH to enable GNSS
3. **Location**: Clear sky view required, move away from buildings
4. **Time**: Cold start takes up to 26 seconds
5. **Interference**: Move away from other electronics
### GPS accuracy is poor
1. Allow time for multi-constellation acquisition
2. Use external active antenna for better signal
3. Check if all GNSS systems are enabled (`$CFGSYS,H11`)
4. Verify antenna has clear sky view (not just outdoors)
## LoRa
### No LoRa communication
1. Verify antenna is connected (IPEX connector on LoRa port)
2. Check frequency matches between devices
3. Verify regional settings are correct
4. Increase spreading factor for longer range
### LoRaWAN join fails
1. Double-check DevEUI, AppEUI, AppKey
2. Verify gateway is online and in range
3. Check frequency plan matches network server
4. Try increasing TX power or SF
### Short range
1. Use higher spreading factor (SF10-SF12)
2. Check antenna connection and orientation
3. Verify TX power settings
4. Consider terrain and obstacles
## Software
### "Board not found" in Arduino IDE
1. Add Heltec board URL to preferences:
```
https://resource.heltec.cn/download/package_heltec_esp32_index.json
```
2. Install "Heltec ESP32 Series Dev-boards" from Boards Manager
3. Select "Wireless Tracker" from board menu
### Library conflicts
The Heltec library may conflict with generic ESP32 libraries. Solutions:
1. Use Heltec-specific library versions
2. Remove duplicate libraries from Arduino/libraries folder
3. Use PlatformIO with explicit lib_deps
### Memory issues (sketch too large)
1. Use minimal partition scheme
2. Enable PSRAM if available
3. Reduce debug output
4. Use release build (-O2 optimization)
## Resources
- [Heltec Wiki](https://wiki.heltec.org)
- [Heltec GitHub](https://github.com/Heltec-Aaron-Lee/WiFi_Kit_series)
- [Meshtastic Documentation](https://meshtastic.org/docs/)
- [Downloads Page](/resources/downloads/)

Some files were not shown because too many files have changed in this diff Show More