Heltec WiFi LoRa 32 V3
0.96" 128x64 OLED on the switched Vext rail, SX1262 with a TCXO, 8 MB flash and no PSRAM, no SD slot and no GNSS. Very common hardware. A CP2102 bridge rather than the S3's native USB, so it appears as /dev/ttyUSB* and not as an Espressif JTAG device — and every CP2102 reports the serial number 0001, so with more than one attached /dev/serial/by-id/ names only one of them and the rest have to be found by path. The serial port also carries PPP: pppd on the host makes the node a network interface at 10.65.<n>.1 (docs/local-link.md), and being an S3 it can be put into its downloader over that link. Uses an 8 MB partition table: the stock one maps only the first 4 MB, and with no SD card the filesystem is the only storage the transport store has.
01 Hardware
| Vendor | Heltec |
| PlatformIO env | heltec-v3 |
| Board header | src/boards/heltec_v3.h |
| MCU | ESP32-S3: 8 MB flash, no PSRAM |
| Chip family | ESP32-S3 |
| Radio | SX1262 (TCXO, DIO2 drives the RF switch) |
| Display | 0.96" SSD1306 on the switched Vext rail |
| Extras | PPP over the CP2102 bridge (no SD, no GNSS) |
| Host links | Wi-Fi access point + station · CP2102 serial bridge · PPP over that bridge |
| Flashing | esptool can reset the chip through this port |
02 Radio
| Transceiver | Semtech SX1262 |
| Radio family | SX126x |
| As the registry states it | SX1262 (TCXO, DIO2 drives the RF switch) |
| TCXO | 1.8 V reference |
| DIO2 drives the RF switch | yes |
| Default channel | 869.525 MHz · BW 125 kHz · SF8 · CR 4/5 · 7 dBm inherited from Config.h |
| SPI bus | FSPI |
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_v3.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.
Every pin as a table, with the define it comes from
| Peripheral | Signal | GPIO | Define | Note |
|---|---|---|---|---|
| Radio | SCK | GPIO 9 | PIN_LORA_SCK | |
| MISO | GPIO 11 | PIN_LORA_MISO | ||
| MOSI | GPIO 10 | PIN_LORA_MOSI | ||
| CS | GPIO 8 | PIN_LORA_CS | ||
| RST | GPIO 12 | PIN_LORA_RST | ||
| BUSY | GPIO 13 | PIN_LORA_BUSY | ||
| DIO1 | GPIO 14 | PIN_LORA_DIO1 | ||
| OLED panel | SDA | GPIO 17 | PIN_OLED_SDA | |
| SCL | GPIO 18 | PIN_OLED_SCL | ||
| RST | GPIO 21 | PIN_OLED_RST | ||
| Vext | GPIO 36 | PIN_DISPLAY_VEXT | ||
| Controls & indicators | BTN | GPIO 0 | PIN_BUTTON | |
| LED | GPIO 35 | PIN_STATUS_LED |
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.
| Capability | State | Detail |
|---|---|---|
| Reticulum transport | driven | Path table, announce propagation, hop-by-hop forwarding |
| Wi-Fi AP + captive portal | driven | Status page, neighbours, bulletin board, settings |
| TCP 4242 + AutoInterface | driven | Stock RNS clients, zero-config discovery |
| LoRa radio | driven | Semtech SX1262 |
| Radio self-test at boot | driven | Proves the IRQ line on first boot Prove the interrupt line on the first boot. Two sources agreeing is better than one, but neither is this board on this bench |
| RF front end | no | Driven before the radio can hear anything |
| External PA | no | — |
| Display | driven | OLED · 128×64 |
| Backlight control | no | — |
| Touch layer | no | — |
| Keyboard | no | On its own microcontroller, over I²C |
| Trackball | no | — |
| microSD | no | Reticulum store moves onto the card when one is present |
| GNSS | no | — |
| Real-time clock | no | Seeds the system clock at boot |
| Power management IC | no | — |
| Battery gauge | not driven | — The board reads its cell on GPIO 1, but only while GPIO 37 holds the divider enabled — and nothing here drives that yet. A divider read without its control line returns a plausible number that is not the battery, which is a worse failure than reporting no battery at all. Left off until it can be checked against a cell, as on the Wireless Stick |
| IMU | no | — |
| Magnetometer | no | — |
| Environment sensor | no | — |
| Sounder | no | — |
| USB networking (CDC-NCM) | no | The node is an Ethernet link with DHCP over the cable |
| PPP over the serial bridge | driven | Bridge: CP2102 |
05 Bench notes
verified on hardware; PPP built, not yet run on this board.
06 Install
Browser
Pick Heltec WiFi LoRa 32 V3 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-v3
From source
pio run -e heltec-v3 pio run -e heltec-v3 -t upload pio run -e heltec-v3 -t uploadfs