Elecrow ThinkNode M2 (ESP32-S3)

Pocket Meshtastic node on an ESP32-S3 - SX1262 LoRa, 1.3" OLED, 1000mAh battery and an integrated antenna, preloaded and working minutes out of the box. Reviewed head-to-head against its nRF52840 sibling.

USB-C
Elecrow ThinkNode M2 (ESP32-S3) board
88.4 × 46 mm
ESP32-S3
MCU
240MHz
clock
4MB
flash
512KB
SRAM
21· 2 ADC
GPIO
BLE 5.0+ WiFi
radio
On this page

Pinout

21 pins
View:
PinGPIOLabelsStatusCapabilitiesNotes
10IO0BOOTstrapping-BOOT button - hold at power-up for download mode
23IO3LORA_DIO1strapping-Internal - SX1262 DIO1 interrupt
34IO4PWR_BTNsafe-Power button (active high)
45IO5BUZZERsafepwmInternal - buzzer
56IO6PWR_LEDsafe-Internal - power LED
67IO7USB_DETECTsafe-Internal - external/USB power detection
710IO10LORA_CSstrappingspiInternal - SX1262 chip select
811IO11LORA_MOSIstrappingspiInternal - SX1262 SPI MOSI
912IO12LORA_SCKstrappingspiInternal - SX1262 SPI clock
1013IO13LORA_MISOstrappingspiInternal - SX1262 SPI MISO
1114IO14LORA_BUSYstrapping-Internal - SX1262 busy signal
1215IO15SCLsafei2cInternal I2C - SH1106 OLED
1316IO16SDAsafei2cInternal I2C - SH1106 OLED
1417IO17VBAT_ADCsafeadcInternal - battery voltage sense (1.548x divider, ADC2)
1521IO21LORA_RSTsafe-Internal - SX1262 reset
1642IO42ADC_VstrappingadcInternal - auxiliary voltage sense
1743IO43TXD0strappinguartUART0 - USB-C serial logs/flashing
1844IO44RXD0strappinguartUART0 - USB-C serial logs/flashing
1946IO46OLED_PWRstrapping-Internal - OLED power-rail enable, drive high before display init
2047IO47FUNC_BTNstrapping-Function button
2148IO48LORA_PWRstrapping-Internal - SX1262 power-rail enable, drive high before radio init

Start with these

8 pins with no boot or system involvement
IO4PWR_BTNIO5BUZZERIO6PWR_LEDIO7USB_DETECTIO15SCLIO16SDAIO17VBAT_ADCIO21LORA_RST

Freely assignable - no strapping, flash, USB or JTAG duties. Ideal first picks for buttons, sensors and LEDs.

Fine - with a little care

sampled at boot or shared with debug/serial
PinLabelWhat to knowRole
IO0GPIO0Must be pulled high (default) or low (to enter UART download mode) at reset. Using it for other functions can interfere with boot mode configuration.Strapping
IO3GPIO3Sampled at reset to select JTAG interface (USB Serial/JTAG controller vs. external pins). Improper use can disable external JTAG or alter debug interface.Strapping
IO42MTMS (GPIO42)Default JTAG TMS signal for debugging. Using this pin for other purposes will disable the JTAG interface (unless JTAG is rerouted to USB).Other
IO43U0TXD (GPIO43)Used for bootloader output and UART console logs. If repurposed, you will lose the default serial output (and programming via UART0).Other
IO44U0RXD (GPIO44)Used for bootloader input (download mode via serial). If repurposed, you cannot use the default UART0 download mode for programming the chip.Other
IO46GPIO46Must be at a defined level during reset (with GPIO0) to select normal or download boot and UART/USB print mode. This pin is input-only (no output drive), so it should be left for its intended strapping function.Strapping

Only if you know the tricks

wired to flash or USB - expect a fight
PinLabelWhat to knowRole
IO10FSPICS0Used to select the external flash chip. It is required for flash access and cannot be repurposed without losing flash connectivityFlash
IO11FSPIDUsed as a data line for flash (and in-package PSRAM). It should not be used as GPIO when the flash/PSRAM is in use.Flash
IO12FSPICLKDrives the flash (and PSRAM) clock. This critical signal must be reserved for memory and not used as general GPIO.Flash
IO13FSPIQUsed as a data line for flash/PSRAM transfers. Not available for other uses when flash/PSRAM is connected.Flash
IO14FSPIWPConnected to external flash (data/write-protect signal). Not recommended as GPIO because it’s reserved for flash operations.Flash
IO47SPICLK_PUsed only on variants with Octal SPI interface (e.g. ESP32-S3R16V) as part of the differential clock pair. On such chips it operates at 1.8 V and is reserved for the high-speed octal SPI clock, not for general GPIO use.Flash
IO48SPICLK_NUsed only on variants with Octal SPI interface, as the negative leg of the differential clock&. On such chips it operates at 1.8 V; it should be avoided for GPIO to prevent conflicts with the octal flash/PSRAM clock.Flash
These are recommendations, not hard rules - with the right pull-ups, timing and boot-state awareness most pins can be made to work. When in doubt, start green.
Pinout notes The Elecrow ThinkNode M2 (ESP32-S3) pinout brings out 21 GPIO pins - every one of them usable in your project. For peripherals, I²C is mapped to SDA on GPIO16…

The Elecrow ThinkNode M2 (ESP32-S3) pinout brings out 21 GPIO pins - every one of them usable in your project.

For peripherals, I²C is mapped to SDA on GPIO16 and SCL on GPIO15.

On the analog side there are 2 ADC-capable pins for sensors and battery monitoring and PWM on 1 pins.

If you want zero surprises, IO4, IO5, IO6, IO7 and 4 more are free of any such role - the safest first picks. 6 of the exposed pins carry boot-time or system duties on the ESP32-S3 (IO0, IO3, IO42 and 3 more).


No GPIO is broken out - the ThinkNode M2 is a finished device, and this map documents the internal wiring for firmware authors. The SX1262 LoRa radio sits on SPI: IO12 (SCK), IO11 (MOSI), IO13 (MISO), IO10 (CS), with IO21 (reset), IO14 (busy), IO3 (DIO1) and IO48 switching the radio's power rail.

The SH1106 OLED lives on I2C (IO16 SDA / IO15 SCL) behind a switched rail on IO46 that must be enabled before the display responds. The Function button is IO47, the Power button IO4, the buzzer IO5, and the power LED IO6.

Power management: battery voltage is sensed on IO17 (ADC2, 1.548x divider), USB presence on IO7, and UART0 logs run on the usual IO43/IO44 through USB-C. All of this matches the upstream Meshtastic variant definition, which is the reference if you write custom firmware.

Getting started

flash your first firmware in ~2 minutes
Tool:
1
Connect over USB
Install your USB-serial driver (CH340 / CP210x) if no port appears. Not detected? Hold BOOT while plugging in.
2
Match & flash
Set the Tools options shown, then click Upload.
3
Verify it runs
The onboard LED on GPIO4 blinks - swap the pin if your board's LED differs.
Set these in Tools · leave everything else at default
Arduino IDE 2.x — Tools Copy
Board: "ESP32S3 Dev Module"
Flash Size: "4MB (32Mb)"
PSRAM: "QSPI PSRAM"
Partition Scheme: "Default 4MB with spiffs (1.2MB APP / 1.5MB SPIFFS)" (default)
Upload Speed: "921600"
▸ every other Tools option — leave at default
Board: ESP32S3 Dev Module
Flash Size: 4MB (32Mb)
PSRAM: QSPI PSRAM
Partition Scheme: Default 4MB with spiffs (1.2MB APP / 1.5MB SPIFFS)
Upload Speed: 921600
Find it: Tools ▸ Board ▸ ESP32 Arduino ▸ ESP32S3 Dev Module
blink.ino Copy
// blink the onboard LED
void setup() {
  pinMode(4, OUTPUT);
}
void loop() {
  digitalWrite(4, HIGH); delay(500);
  digitalWrite(4, LOW);  delay(500);
}
board to selectesp32-s3-devkitc-1⧉ copy
platformio.ini Copy
[env:elecrow-thinknode-m2]
platform = espressif32
board = esp32-s3-devkitc-1
framework = arduino
monitor_speed = 115200
upload_speed = 921600
board_build.arduino.memory_type = qio_qspi
build_flags = -DBOARD_HAS_PSRAM
Find it: PlatformIO Home ▸ Boards, search esp32-s3-devkitc-1 — or type it after board =.
board to selectesp32-s3-devkitc-1⧉ copy
device.yaml Copy
esp32:
  board: esp32-s3-devkitc-1
  variant: 
  framework:
    type: esp-idf
psram:
  mode: quad
  speed: 80MHz

# blink - GPIO4
output:
  - platform: gpio
    pin: 4
    id: led_out
light:
  - platform: binary
    name: "LED"
    output: led_out
Find it: search ESPHome's board list for esp32-s3-devkitc-1 (same ids as PlatformIO).
esptool doesn't pick board settings — a prebuilt .bin already has them baked in. This is just the raw flash command.
terminal Copy
esptool.py --chip esp32s3 --port /dev/ttyACM0 \
  --baud 921600 write_flash 0x0 firmware.bin
--port = your /dev/tty* (macOS/Linux) or COMx (Windows).

Good to know

board-specific quirks worth 60 seconds
Working mesh in minutes, not evenings illustration
Working mesh in minutes, not evenings

Preinstalled Meshtastic means the usual flash-and-troubleshoot evening becomes: power on, pair via Bluetooth, message. Our two review units found each other immediately, and suburban range reached several kilometers line-of-sight.

Buy the frequency variant for your region (EU 868 / US 915 MHz) - the SX1262 band is fixed by hardware filtering, not firmware.

The antenna is inside - by design illustration
The antenna is inside - by design

Unlike the M1 (and most LoRa handhelds), there's no antenna to screw on - it's integrated into the frame via an internal IPEX connector. The result is a genuinely pocketable 50 g unit with nothing to snap off in a backpack.

The flip side: no external antenna port for range upgrades. If you're building a rooftop or repeater node, choose hardware with an SMA connector instead.

An ESP32-S3 you're allowed to hack illustration
An ESP32-S3 you're allowed to hack
The M2's variant definition lives upstream in the Meshtastic firmware repository, which means the full internal pin map - SX1262 SPI, SH1106 I2C, buzzer, battery ADC, the OLED's power-enable on IO46 - is public. Reflash it with Arduino or ESP-IDF and it's a battery-powered LoRa dev board with a screen and case included. Writing custom firmware? Drive IO46 high before initializing the OLED and IO48 high before…

The M2's variant definition lives upstream in the Meshtastic firmware repository, which means the full internal pin map - SX1262 SPI, SH1106 I2C, buzzer, battery ADC, the OLED's power-enable on IO46 - is public. Reflash it with Arduino or ESP-IDF and it's a battery-powered LoRa dev board with a screen and case included.

Writing custom firmware? Drive IO46 high before initializing the OLED and IO48 high before the radio - both sit behind switched power rails.

Specifications

ESP32-S3 · 88.4 × 46 mm
Compute
MCU
ESP32-S3
Clock
240 MHz
SRAM · Flash
512 KB · 4MB · 8MB PSRAM
Radio
Wi-Fi
802.11 b/g/n
Bluetooth
5.0 LE
Antenna
Integrated (IPEX)
I/O
GPIO · ADC
21 · 2
UART · I²C · SPI
3 · 2 · 4
PWM
8 channels
Power
USB
USB-C
Serial
-
Boot address
0x0
Display
Screen
OLED · 1.3" · 128x64
Driver
SH1106
Touch
No
Flashing
Upload · OTA
esptool_py · esp_ota
Flash · Boot mode
- · -
Sketch · Data
- · -
46 mm88.4 mm
88.4 × 46 mm
The Elecrow ThinkNode M2 (ESP32-S3) uses esptool_py for firmware uploads, esp_ota for over-the-air (OTA) updates.

About this board

At its core is the ESP32-S3 - a dual-core Xtensa with vector extensions suited to AI workloads.

Expect to pay about $21.90 - less than the ~$30 most ESP32-S3 boards go for.

Onboard you'll find 8MB PSRAM, an OLED 1.3" 128x64 display, LoRa (SX1262), a buzzer, status LEDs (Power, Charge) and Power/Function/Boot/Reset buttons.


The Elecrow ThinkNode M2 is a ready-made Meshtastic node: an ESP32-S3 (4 MB flash, 8 MB PSRAM) paired with an SX1262 LoRa radio (868/915 MHz), a 1.3-inch SH1106 OLED, a 1000mAh battery and a cased, pocketable form factor. We reviewed it head-to-head against its nRF52840 sibling, the ThinkNode M1 - and the M2 is the one we'd point ESP32 people at.


The out-of-box experience is the selling point: Meshtastic firmware comes preinstalled, so it's power on, pair the phone app over Bluetooth, and start messaging over LoRa - we had both review units talking to each other within minutes, no flashing involved. Range in our suburban testing reached several kilometers with line of sight, and 1-2 km among buildings.


Design trade-offs versus the M1: the M2 has no GPS (the M1 does), and its OLED draws power whenever it's on, where the M1's e-paper sips it - so the M1 wins on battery life and location features. The M2 counters with a snappier display, a smaller integrated antenna (nothing to screw on), a lower price, and - the reason it's on this site - the ESP32-S3 underneath, which makes it far more hackable than the Nordic-based M1.


That hackability is real: the Meshtastic firmware variant for this board is upstream, the internal wiring is documented (SX1262 on SPI, OLED on I2C, buzzer, battery ADC), and nothing stops you reflashing it with Arduino, ESP-IDF or your own LoRa firmware. As a first mesh node or a tinkerable LoRa dev unit with a screen, battery and case already solved, it's easy money at around $22.

  • Meshtastic firmware preinstalled - pair the phone app and message over LoRa within minutes
  • SX1262 LoRa transceiver (EU 868 / US 915 MHz) with DIO2 RF switching and TCXO
  • 1.3" SH1106 OLED (128x64) behind a firmware-switched power rail
  • ESP32-S3 with 4 MB flash and 8 MB PSRAM - Wi-Fi and BLE 5 alongside LoRa
  • 1000mAh battery with USB-C charging, battery-voltage ADC and USB-detect sensing
  • Integrated antenna in the frame (IPEX connector inside) - nothing to screw on
  • Power, Function, Boot and Reset buttons plus a buzzer for alerts
  • Upstream Meshtastic variant support - the internal pin map is documented and reflashing is unrestricted
  • 88.4 x 46 x 23 mm cased, 50 g - genuinely pocketable

FAQ

5 common questions
Do I need to flash anything to use the ThinkNode M2?
No - Meshtastic comes preinstalled. Power it on, install the Meshtastic app on iOS or Android, connect over Bluetooth and you're messaging over LoRa. In our review, both ThinkNode units were exchanging messages within minutes of unboxing, with zero configuration drama.
ThinkNode M1 or M2 - which should I buy?
The M1 (nRF52840) brings GPS and a sunlight-readable e-paper display with better battery life - pick it for location sharing, hiking groups or SoftRF aviation tracking. The M2 is cheaper, more compact thanks to the integrated antenna, has a faster OLED, and is built on the ESP32-S3 - pick it as a general mesh node or if you plan to hack on the firmware with familiar ESP32 tools. Our full comparison covers both in detail.
What range does it actually get?
In our suburban testing with decent line of sight, several kilometers; in built-up urban areas, expect 1-2 km. That's typical for SX1262-class Meshtastic hardware, and the integrated antenna did not obviously underperform external-antenna units at these distances - though serious range chasers will still prefer a device with an external antenna port they can upgrade.
Can I reflash it with my own firmware?
Yes - it's a plain ESP32-S3 with USB-C serial, and the board's variant definition is upstream in the Meshtastic firmware repo, which doubles as the internal wiring reference - SX1262 on SPI (CS IO10, SCK IO12, MOSI IO11, MISO IO13), OLED on I2C IO16/IO15 behind a power-enable on IO46, buzzer on IO5. Arduino, PlatformIO and ESP-IDF all work. Just note there's no exposed GPIO, so hacks are firmware-shaped, not wiring-shaped.
Does it have GPS?
No - and that's the M2's biggest limitation as a Meshtastic device, since automatic position sharing needs it. You can still set a fixed position in the app for stationary nodes. If moving-node location matters to you, the ThinkNode M1 has full GNSS (GPS/GLONASS/BeiDou/QZSS) built in.

Where to buy

prices are typical street prices
Elecrow ThinkNode M2 (ESP32-S3)
Elecrow ThinkNode M2 (ESP32-S3)
$21.90per unit, typical

Resources

Similar boards