Heltec Wireless Stick V2/V2.1
0.49" 64x32 OLED on the switched Vext rail, SX1276, 8 MB flash, no SD slot and no GNSS. The small panel gets its own page layout — ten columns and four rows — rather than the 128x64 one clipped. Serial is a CP2102 bridge, 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). Uses the 8 MB partition table for the same reason the V3 does: no SD card, so the filesystem is the only storage the transport store has.
Heltec now publishes photographs of the Wireless Stick V3 — an ESP32-S3 with an SX1262. This build targets the V2/V2.1, an ESP32 with an SX1276: a different board behind the same name.
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
| Vendor | Heltec |
| PlatformIO env | heltec-ws |
| Board header | src/boards/heltec_ws.h |
| MCU | ESP32: 8 MB flash |
| Chip family | ESP32 |
| Radio | SX1276 |
| Display | 0.49" 64x32 SSD1306 on Vext |
| Extras | PPP over the CP2102 bridge (no SD, no GNSS) |
| Host links | Wi-Fi access point + station · CP2102 serial bridge |
| Flashing | esptool can reset the chip through this port |
02 Radio
| Transceiver | Semtech SX1276/78 |
| Radio family | SX127x |
| As the registry states it | SX1276 |
| Default channel | 869.525 MHz · BW 125 kHz · SF8 · CR 4/5 · 7 dBm inherited from Config.h |
| SPI bus | VSPI |
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_ws.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 5 | PIN_LORA_SCK | |
| MISO | GPIO 19 | PIN_LORA_MISO | ||
| MOSI | GPIO 27 | PIN_LORA_MOSI | ||
| CS | GPIO 18 | PIN_LORA_CS | ||
| RST | GPIO 14 | PIN_LORA_RST | ||
| DIO1 | GPIO 35 | PIN_LORA_DIO1 | unused by this driver on SX127x | |
| DIO0 | GPIO 26 | PIN_LORA_DIO0 | ||
| OLED panel | SDA | GPIO 4 | PIN_OLED_SDA | |
| SCL | GPIO 15 | PIN_OLED_SCL | ||
| RST | GPIO 16 | PIN_OLED_RST | ||
| Vext | GPIO 21 | PIN_DISPLAY_VEXT | ||
| Controls & indicators | BTN | GPIO 0 | PIN_BUTTON | |
| LED | GPIO 25 | 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 SX1276/78 |
| Radio self-test at boot | driven | Proves the IRQ line on first boot Prove the IRQ line at boot rather than trusting the pin map. The SX1280 work showed a wrong IRQ pin reports itself perfectly healthy and simply never receives; this board's pins come from a second-hand source, so they get checked. Drop this once it has been confirmed on hardware |
| RF front end | no | Driven before the radio can hear anything |
| External PA | no | — |
| Display | driven | OLED · 64×32 |
| 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 has a JST LiPo connector and a lithium charging circuit, so a cell can be fitted — but nothing here reads its voltage yet, and that is on purpose. The reference RNode_Firmware does not read it on this board either, so there is no confirmed divider pin to copy, and a guessed one is worse here than elsewhere: a wrong IRQ pin fails loudly and obviously, while a wrong ADC pin returns a plausible number that is simply not the battery. Reporting "no battery" is truthful and every caller already handles it. Once a cell is on hand the pin can be found the same way the SX1280's were — sample the ADC-capable pins and see which one tracks half the pack voltage |
| 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 | no | Bridge: CP2102 |
05 Bench notes
verified on hardware; PPP built, not yet run on this board.
06 Install
Browser
Pick Heltec Wireless Stick V2/V2.1 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-ws
From source
pio run -e heltec-ws pio run -e heltec-ws -t upload pio run -e heltec-ws -t uploadfs