RetiMesh/node latest release …
Heltec SX126x ESP32-S3 Verified on hardware

Heltec V4 (TFT)

The first colour panel and the first amplified front end in this firmware, and the first 16 MB board. The pin map has one published source — the board definition in the open-source firmware it ships with (variants/esp32s3/heltec_v4, the TFT build) — rather than the two this project prefers, so the panel, touch, button and sounder pins are unverified; the LoRa pins are the V3's and carry more weight. The front end is the part with no equivalent elsewhere here: the radio is deaf and mute until the amplifier rail is powered and its mode pins are driven, and which of two parts is fitted is read off GPIO 2 at boot. Native USB, so it enumerates as an Espressif JTAG/serial device with its MAC in the by-id name and none of the CP2102 ambiguity the rest of this bench has. OTG runs the composite device: CDC-ACM console plus CDC-NCM networking, the same stack the T3-S3s carry — note the by-id name changes to the RetiMesh identity once this firmware boots.

No photograph on file

No photograph is published for this exact variant. Heltec's WiFi LoRa 32 V4 carries a 0.96" OLED; this build targets the TFT model, whose only published pin map is the board's own shipped firmware.

The pin map below is drawn from this board's own header in the firmware, so it is right whether or not a picture is.

01 Hardware

VendorHeltec
PlatformIO envheltec-v4
Board headersrc/boards/heltec_v4.h
MCUESP32-S3: 16 MB flash, 2 MB PSRAM in package
Chip familyESP32-S3
RadioSX1262 (TCXO, DIO2 drives the RF switch) behind a GC1109 or KCT8103L front end
Display2.4" 240x320 ST7789 with a CHSC6X touch layer
Extrastwo buttons + case power button (charger /QON), DA217 accelerometer, BQ25896-ready charging state, battery ADC, GNSS on the expansion header; expansion slots for sounder/sensors (no SD)
Host linksWi-Fi access point + station · USB CDC-NCM Ethernet · native USB console
Flashingesptool can reset the chip through this port

02 Radio

TransceiverSemtech SX1262
Radio familySX126x
As the registry states itSX1262 (TCXO, DIO2 drives the RF switch) behind a GC1109 or KCT8103L front end
TCXO1.8 V reference
DIO2 drives the RF switchyes
Default channel869.525 MHz · BW 125 kHz · SF8 · CR 4/5 · 7 dBm
inherited from Config.h
SPI busFSPI

Every node on a channel must agree on frequency, bandwidth, spreading factor, coding rate and sync word. These are the defaults this build ships with; they are changed live on the node's settings page, which prints the matching RNodeInterface block.

03 Pin map

Read straight out of src/boards/heltec_v4.h — every peripheral the firmware drives on this board, and the GPIO it drives it on. A harness diagram, not a picture of where the parts sit.

Pin map heltec-v4 · 8 peripherals
ESP32-S3 16 MB flash 2 MB PSRAM in package Radio SPI SCK 9 MISO 11 MOSI 10 CS 8 RST 12 BUSY 13 DIO1 14 RF front end GPIO PWR 7 EN 2 MODE·GC1109 46 MODE·KCT 5 TFT panel SPI SCK 17 MOSI 33 CS 15 DC 16 RST 18 BL 21 Touch layer I²C SDA 47 SCL 48 RST 44 GNSS UART RX 39 TX 38 EN 34 RST 42 PPS 41 STBY 40 I²C bus I²C SDA 4 SCL 3 Power GPIO VBAT 1 VBAT·EN 37 Controls & indicators GPIO BTN 0 BTN2 35 BUZZ 6
Every pin as a table, with the define it comes from
PeripheralSignalGPIODefineNote
RadioSCKGPIO 9PIN_LORA_SCK
MISOGPIO 11PIN_LORA_MISO
MOSIGPIO 10PIN_LORA_MOSI
CSGPIO 8PIN_LORA_CS
RSTGPIO 12PIN_LORA_RST
BUSYGPIO 13PIN_LORA_BUSY
DIO1GPIO 14PIN_LORA_DIO1
RF front endPWRGPIO 7PIN_FEM_POWERLDO enable for the FEM rail
ENGPIO 2PIN_FEM_ENABLECSD on both parts: high to run
MODE·GC1109GPIO 46PIN_FEM_MODE_GC1109CPS: high = full PA, low = bypass
MODE·KCTGPIO 5PIN_FEM_MODE_KCTCTX: high = TX / RX bypass, low = RX LNA
TFT panelSCKGPIO 17PIN_TFT_SCK
MOSIGPIO 33PIN_TFT_MOSI
CSGPIO 15PIN_TFT_CS
DCGPIO 16PIN_TFT_DC
RSTGPIO 18PIN_TFT_RST
BLGPIO 21PIN_TFT_BL
Touch layerSDAGPIO 47PIN_TOUCH_SDA
SCLGPIO 48PIN_TOUCH_SCL
RSTGPIO 44PIN_TOUCH_RST
GNSSRXGPIO 39PIN_GPS_RX
TXGPIO 38PIN_GPS_TX
ENGPIO 34PIN_GPS_EN
RSTGPIO 42PIN_GPS_RSTlow for >100 ms resets an L76K
PPSGPIO 41PIN_GPS_PPS
STBYGPIO 40PIN_GPS_STANDBYhigh forces the receiver awake
I²C busSDAGPIO 4PIN_I2C_SDA
SCLGPIO 3PIN_I2C_SCL
PowerVBATGPIO 1PIN_BATTERY_ADC
VBAT·ENGPIO 37PIN_BATTERY_ADC_EN
Controls & indicatorsBTNGPIO 0PIN_BUTTONPRG/BOOT, the navigation key
BTN2GPIO 35PIN_BUTTON2
BUZZGPIO 6PIN_BUZZER

04 Firmware support

What this build actually drives on this board. Where a part is fitted but left alone, the firmware's own reason is quoted underneath rather than summarised.

CapabilityStateDetail
Reticulum transportdrivenPath table, announce propagation, hop-by-hop forwarding
Wi-Fi AP + captive portaldrivenStatus page, neighbours, bulletin board, settings
TCP 4242 + AutoInterfacedrivenStock RNS clients, zero-config discovery
LoRa radiodrivenSemtech SX1262
Radio self-test at bootdrivenProves the IRQ line on first boot
A transmit at boot, timed against the interrupt. Worth more here than on any board so far: with the front end unpowered the chip still answers over SPI and still reports itself online, and the failure is silence
RF front enddrivenDriven before the radio can hear anything
The front end. This is the part that has no equivalent on any other board here: an SX1262 wired straight to an antenna works with nothing driven, while this one is deaf and mute until the amplifier is powered and told which way to face. See src/radio/LoRaFem.h for the sequence and for why the board is asked at boot which of two parts it carries
External PAdriven—
An amplifier is fitted, which this firmware reports rather than compensates for: RF_TX_DBM is what the chip is driven at, here as on the SX1280+PA board, and the operator accounts for the gain. That gain is not a constant — the part compresses, so it falls from about 11 dB at low drive to 7 dB at the top (GC1109; the KCT8103L starts at 13 dB). The tables are in LoRaFem.h. The default drive is left at the firmware's usual 7 dBm, which through this front end leaves the antenna at roughly 18 dBm. That is inside the 500 mW allowance of the 869.4-869.65 MHz sub-band the default channel sits in, and it is over the 25 mW allowed in most of the rest of EU868 — so a channel change on this board is a power decision as well as a frequency one
DisplaydrivenTFT · 240×320
Backlight controldriven—
Touch layerdriven—
The touch layer is a CHSC6X on its own I2C bus, away from everything else
KeyboardnoOn its own microcontroller, over I²C
Trackballno—
microSDnoReticulum store moves onto the card when one is present
GNSSdriven9600 baud
The published pin map is explicit that the receiver (9600 baud) is part of the V4 expansion kit rather than of the board itself. This build assumes the kit is fitted, because the bench unit has one; a bare V4 wants HAS_GPS 0
Real-time clocknoSeeds the system clock at boot
Power management ICno—
Battery gaugedriven—
The cell is read through a divider that is only connected while GPIO 37 is held high — the same arrangement the V3 has and the reason the V3 reports no battery at all. Reading the pin without raising the control line returns a plausible number that is not the battery, which is why the enable is part of the board description rather than something the reader assumes. The ratio is not the usual halving: this board divides deep and trims the result, 4.9 * 1.045, and reads it at 2.5 dB attenuation rather than the 11 dB the other boards use — which is what a divider this deep needs to keep the reading inside the converter's range
IMUdrivenDA217
a DA217; the panel follows the hand
Magnetometerno—
Environment sensorno—
Sounderdriven—
A piezo sounder on a PWM channel — not an audio path. The pin is the published map's; the bench unit produced no sound from it at any drive while everything else worked, so the part may not be fitted on all builds of the board. Driving it costs nothing either way
USB networking (CDC-NCM)drivenThe node is an Ethernet link with DHCP over the cable
PPP over the serial bridgeno—

05 Bench notes

Status as the registry records it boards.json

verified on hardware: radio through the KCT8103L front end (TX and RX on air), GNSS fix + clock, panel, touch, both buttons; sounder silent — possibly not fitted. The DA217 accelerometer is suspended while the screen is dark and comes back with it — a dark panel needs no orienting — and `STATUS` reports it as `imu=asleep`; the suspend register value is the kernel da280 driver's and has not yet been exercised on this board, so that line is what confirms it took.

06 Install

Browser

Pick Heltec V4 (TFT) in the web flasher and click Install. Desktop Chrome or Edge, over HTTPS.

Terminal

pipx run --spec "git+https://github.com/dobrevit/RetiMesh_Node#subdirectory=tools/retimesh-flash" \
  retimesh-flash install --board heltec-v4

From source

pio run -e heltec-v4
pio run -e heltec-v4 -t upload
pio run -e heltec-v4 -t uploadfs