The Arduino Nano ESP32 is a native ESP32-S3 development board in the familiar Arduino Nano form factor.
Unlike the UNO R4 WiFi, where an ESP32-S3 acts mainly as a connectivity coprocessor, the Nano ESP32 runs your application directly on the ESP32-S3.
The board combines:
- dual-core Xtensa LX7 CPU up to 240 MHz;
- 512 kB internal SRAM;
- 8 MB PSRAM;
- 16 MB external Flash;
- 2.4 GHz Wi-Fi 4;
- Bluetooth LE 5.0;
- native USB-C;
- eight analog inputs;
- SPI, I²C, UART, I²S and TWAI/CAN;
- ESP-NOW;
- MicroPython support;
- Arduino Cloud support.
The most important pinout detail is that Nano ESP32 uses Arduino Nano pin names that do not match the raw ESP32-S3 GPIO numbers.
For example:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
D2 → Arduino pin 2 → ESP32-S3 GPIO5 A0 → Arduino pin 17 → ESP32-S3 GPIO1 D13 → Arduino pin 13 → ESP32-S3 GPIO48 |
This guide maps the Arduino names to the physical ESP32-S3 GPIOs and explains the default UART, SPI, I²C, ADC, USB, boot and LED connections.
Arduino Nano ESP32 Specifications
| Feature | Arduino Nano ESP32 |
|---|---|
| Main module | u-blox NORA-W106-10B |
| SoC | Espressif ESP32-S3 |
| CPU | Dual-core 32-bit Xtensa LX7 |
| Maximum CPU frequency | 240 MHz |
| Internal SRAM | 512 kB |
| RTC SRAM | 16 kB total RTC-domain memory |
| PSRAM | 8 MB Octal SPI |
| External Flash | 16 MB QSPI |
| Operating voltage | 3.3 V |
| Digital pins | 14 standard, 21 including analog pins |
| Analog inputs | 8 |
| ADC resolution | 12-bit SAR hardware |
| DAC | No true voltage DAC |
| Wi-Fi | 2.4 GHz 802.11 b/g/n |
| Bluetooth | Bluetooth LE 5.0 |
| USB | Native USB-C |
| SPI default | D10-D13 |
| I²C default | A4 SDA, A5 SCL |
| UART default | D0 RX, D1 TX |
| CAN/TWAI | Classic CAN controller, flexible GPIO assignment |
| VIN | 6-21 V recommended |
Complete Nano ESP32 Arduino-to-GPIO Mapping
| Board label | Arduino pin number | ESP32-S3 GPIO | Main functions |
|---|---|---|---|
| D0 / RX | 0 | GPIO44 | UART RX, GPIO |
| D1 / TX | 1 | GPIO43 | UART TX, GPIO |
| D2 | 2 | GPIO5 | GPIO |
| D3 | 3 | GPIO6 | GPIO |
| D4 | 4 | GPIO7 | GPIO |
| D5 | 5 | GPIO8 | GPIO |
| D6 | 6 | GPIO9 | GPIO |
| D7 | 7 | GPIO10 | GPIO |
| D8 | 8 | GPIO17 | GPIO |
| D9 | 9 | GPIO18 | GPIO |
| D10 | 10 | GPIO21 | SPI CS by default, GPIO |
| D11 | 11 | GPIO38 | SPI COPI/MOSI, GPIO |
| D12 | 12 | GPIO47 | SPI CIPO/MISO, GPIO |
| D13 | 13 | GPIO48 | SPI SCK, built-in LED, GPIO |
| A0 | 17 | GPIO1 | ADC1_CH0, digital GPIO |
| A1 | 18 | GPIO2 | ADC1_CH1, digital GPIO |
| A2 | 19 | GPIO3 | ADC1_CH2, digital GPIO |
| A3 | 20 | GPIO4 | ADC1_CH3, digital GPIO |
| A4 / SDA | 21 | GPIO11 | ADC2_CH0, I²C SDA, digital GPIO |
| A5 / SCL | 22 | GPIO12 | ADC2_CH1, I²C SCL, digital GPIO |
| A6 | 23 | GPIO13 | ADC2_CH2, digital GPIO |
| A7 | 24 | GPIO14 | ADC2_CH3, digital GPIO |
Arduino Pin Numbering vs Raw GPIO Numbering
Nano ESP32 is unusual because Arduino provides two numbering modes in the IDE:
|
1 2 3 4 5 |
Tools → Pin Numbering |
The options are:
- By Arduino pin — default Nano-style numbering;
- By GPIO number (legacy) — conventional ESP32 raw GPIO numbering.
Why This Matters
With default Arduino numbering:
|
1 2 3 4 |
pinMode(2, OUTPUT); |
means:
|
1 2 3 4 5 |
D2 → GPIO5 |
If you switch the IDE to raw GPIO numbering:
|
1 2 3 4 |
pinMode(2, OUTPUT); |
means:
|
1 2 3 4 5 |
GPIO2 → board pin A1 |
That is a completely different physical pin.
Use D0, D1, D2 and A0 Constants
The safest Arduino-style code is:
|
1 2 3 4 5 6 7 |
pinMode(D2, OUTPUT); digitalWrite(D2, HIGH); int sensor = analogRead(A0); |
Arduino documents that symbolic names such as:
|
1 2 3 4 5 6 7 8 |
D0 D1 D2 A0 A1 |
continue to refer to the same physical board pins regardless of which pin-numbering mode is selected.
This makes code much less fragile.
Physical Nano Header Layout
With the USB-C connector at the top, the Nano ESP32 follows the familiar Nano dual-row format:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
Left side Right side D13 / SCK D12 / CIPO 3V3 D11 / COPI B0 D10 A0 D9 A1 D8 A2 D7 A3 D6 A4 / SDA D5 A5 / SCL D4 A6 D3 A7 D2 VBUS GND B1 RST GND D0 / RX VIN D1 / TX |
The exact arrangement matters because B0/B1 and VBUS occupy positions that differ from some older Nano-family boards.
3.3 V Logic Only
Nano ESP32 is a 3.3 V board.
Arduino explicitly warns that all digital and analog pins operate at 3.3 V and higher external voltages can damage the board.
Do not connect 5 V logic directly to:
- D0-D13;
- A0-A7;
- B0/B1;
- other exposed ESP32 signals.
Use a suitable level shifter, divider or 3.3 V-compatible peripheral.
There Is No Normal 5 V Pin
Nano ESP32 does not provide a continuously regulated 5 V rail like a classic Nano.
It exposes:
|
1 2 3 4 |
VBUS |
which carries approximately 5 V when the board is powered from USB-C.
If the board is powered only through VIN, VBUS is not automatically active.
This distinction matters when powering external 5 V modules.
VIN
Arduino specifies a recommended VIN range of:
|
1 2 3 4 |
6-21 V |
The onboard MP2322 converter steps VIN down to the board’s 3.3 V operating rail.
3.3 V Output
The 3.3 V header pin is connected to the board’s regulated 3.3 V rail and can power external low-voltage peripherals.
Remember that every GPIO also uses 3.3 V logic.
GPIO Current
Arduino’s current datasheet states maximum GPIO drive figures of approximately:
|
1 2 3 4 5 |
40 mA source 28 mA sink |
These should not be treated as convenient design targets for continuous high-current loads.
Use a transistor or driver for:
- relays;
- motors;
- large LEDs;
- solenoids;
- other power devices.
UART: D0 and D1
The default external UART pins are:
|
1 2 3 4 5 6 7 8 |
D0 / RX → GPIO44 D1 / TX → GPIO43 |
In Arduino code:
|
1 2 3 4 |
Serial1.begin(115200); |
is the normal choice for an external UART peripheral.
D1/TX Has a Series Resistor
The official pinout notes that the D1/TX0 path contains a 499 Ω series resistor.
This limits current and should be considered when attaching unusual loads to the TX signal.
For normal UART receivers it is not a problem.
USB Serial Is Native
The USB-C connector connects directly to ESP32-S3 native USB hardware.
So:
|
1 2 3 4 5 6 7 8 |
Serial → USB-C serial connection Serial1 → D0/D1 UART |
This keeps the external UART independent from the normal PC serial connection.
Native USB Pins
Internally, ESP32-S3 uses:
|
1 2 3 4 5 |
GPIO19 = USB D- GPIO20 = USB D+ |
These signals are routed to the USB-C connector rather than appearing as normal Nano header GPIOs.
Do not expect to use GPIO19/GPIO20 freely as header pins while also using the native USB interface.
USB-C Capabilities
The USB-C port is used for:
- power;
- programming;
- serial communication;
- native USB device functions;
- built-in debugging.
Arduino also lists Nano ESP32 as compatible with the standard Keyboard and Mouse HID libraries.
Out-of-the-Box Debugging
Nano ESP32 supports debugging without requiring a separate external debug probe.
This is one advantage of the ESP32-S3 native USB/Serial-JTAG architecture.
Advanced development can use:
- breakpoints;
- step execution;
- variable inspection;
- lower-level ESP-IDF debugging.
SPI Pins
The default SPI mapping is:
|
1 2 3 4 5 6 7 |
D10 = CS D11 = COPI / MOSI D12 = CIPO / MISO D13 = SCK |
Mapped to raw GPIO:
|
1 2 3 4 5 6 7 |
D10 → GPIO21 D11 → GPIO38 D12 → GPIO47 D13 → GPIO48 |
Basic SPI Example
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#include <SPI.h> const int chipSelect = D10; void setup() { pinMode(chipSelect, OUTPUT); digitalWrite(chipSelect, HIGH); SPI.begin(); } |
Using D10 instead of numeric 10 keeps the code safe across the Nano ESP32 numbering modes.
D13 Is Also LED_BUILTIN
The normal built-in user LED is connected to:
|
1 2 3 4 5 |
D13 → GPIO48 |
That same pin is also the default SPI SCK pin.
So the built-in LED can flash during SPI activity.
I²C Pins
The default I²C mapping is:
|
1 2 3 4 5 |
A4 = SDA A5 = SCL |
Raw GPIO mapping:
|
1 2 3 4 5 |
A4 → GPIO11 A5 → GPIO12 |
Use:
|
1 2 3 4 5 6 7 8 |
#include <Wire.h> void setup() { Wire.begin(); } |
I²C Pins Are Flexible on ESP32-S3
The ESP32-S3 GPIO matrix allows I²C to be routed to many different free GPIOs.
Arduino uses A4/A5 by default for Nano compatibility, but advanced code can remap the bus.
For portable Nano sketches, leave the defaults unless you have a specific reason to change them.
Eight Analog Inputs
Nano ESP32 exposes:
|
1 2 3 4 5 6 7 8 9 10 11 |
A0 A1 A2 A3 A4 A5 A6 A7 |
The analog mapping is:
| Analog pin | GPIO | ADC unit/channel |
|---|---|---|
| A0 | GPIO1 | ADC1_CH0 |
| A1 | GPIO2 | ADC1_CH1 |
| A2 | GPIO3 | ADC1_CH2 |
| A3 | GPIO4 | ADC1_CH3 |
| A4 | GPIO11 | ADC2_CH0 |
| A5 | GPIO12 | ADC2_CH1 |
| A6 | GPIO13 | ADC2_CH2 |
| A7 | GPIO14 | ADC2_CH3 |
ADC Resolution
ESP32-S3 uses 12-bit SAR ADC hardware for normal single-read operation.
A raw 12-bit result spans:
|
1 2 3 4 |
0 to 4095 |
Arduino-ESP32 can configure resolution through the appropriate ADC APIs.
As with every MCU ADC, nominal resolution is not the same as guaranteed absolute accuracy.
ADC Input Is 3.3 V-Class, Not 5 V
Never apply 5 V directly to a Nano ESP32 analog input.
Use an appropriate resistor divider if measuring a higher voltage.
The usable measurement range also depends on ESP32 ADC attenuation settings rather than simply assuming:
|
1 2 3 4 |
0 to 3.300 V |
maps perfectly to:
|
1 2 3 4 |
0 to 4095 |
For accurate measurement, use calibration and avoid operating exactly at the ADC range boundaries.
Important: A4-A7 Use ADC2
The first four analog pins:
|
1 2 3 4 |
A0-A3 |
use ADC1.
The last four:
|
1 2 3 4 |
A4-A7 |
use ADC2.
This matters because Espressif documents limitations when ADC2 is used while Wi-Fi is active.
At low level, ADC2 readings can fail or become unavailable while the Wi-Fi driver owns ADC2 resources.
If your project requires dependable analog measurement while Wi-Fi is running, prefer:
|
1 2 3 4 5 6 7 |
A0 A1 A2 A3 |
where possible because those are ADC1 channels.
A4/A5 Conflict with I²C Too
A4 and A5 are also the default I²C pins.
So they have two different potential conflicts:
|
1 2 3 4 5 6 |
A4/A5 → ADC2 channels → default I2C SDA/SCL |
If I²C is active on those pins, do not simultaneously treat them as independent analog inputs.
No True DAC
ESP32-S3 does not include the two true voltage DACs found on the original ESP32.
Nano ESP32 therefore has no direct equivalent to the 12-bit DAC on Arduino Nano R4 or UNO R4.
For analog voltage output use:
- an external DAC;
- PWM plus filtering;
- I²S-based external audio DAC hardware.
PWM
ESP32-S3 uses flexible LEDC PWM hardware rather than fixed AVR-style PWM pins.
That means PWM can be routed to many suitable output GPIOs.
Example:
|
1 2 3 4 |
analogWrite(D5, 128); |
or use the lower-level Arduino-ESP32 LEDC API when you need explicit frequency and resolution control.
Interrupts
Arduino’s current Nano ESP32 datasheet states that all exposed GPIOs can be configured as interrupts through the ESP32 interrupt matrix.
Normal Arduino code can use:
|
1 2 3 4 5 6 7 8 |
attachInterrupt( digitalPinToInterrupt(D2), myISR, RISING ); |
Again, symbolic D2 is preferable to a raw numeric literal when the pin-numbering mode might change.
TWAI / Classic CAN
ESP32-S3 includes a TWAI controller, which is Espressif’s implementation of classic CAN 2.0B.
Unlike boards with fixed CAN header pins, Nano ESP32 does not assign default TWAI TX/RX pins.
Suitable free GPIOs can be selected in software.
You still need an external CAN transceiver:
|
1 2 3 4 5 6 7 8 |
ESP32-S3 TWAI ↓ 3.3 V-compatible CAN transceiver ↓ CANH / CANL |
TWAI on ESP32-S3 is classic CAN and does not support CAN-FD frames.
I²S
ESP32-S3 includes two I²S controllers.
There are no fixed Nano header pins assigned to I²S.
The GPIO matrix allows signals such as:
- MCLK;
- BCLK;
- WS/LRCLK;
- DIN;
- DOUT;
to be routed to suitable available GPIOs.
This makes Nano ESP32 useful for:
- digital microphones;
- audio DACs;
- amplifier modules;
- audio processing projects.
RGB LED
Nano ESP32 includes an onboard RGB LED connected to three ESP32-S3 GPIOs:
|
1 2 3 4 5 6 |
Red → GPIO46 Green → GPIO0 Blue → GPIO45 |
Arduino provides symbolic LED names, so use those rather than relying on raw GPIO numbers.
B0 and B1 Pins
Two Nano header positions expose ESP32-S3 boot/strapping-related pins:
|
1 2 3 4 5 |
B0 → GPIO46 B1 → GPIO0 |
These are also shared with parts of the onboard RGB LED circuitry.
B1 Bootloader Function
Arduino documents that:
|
1 2 3 4 |
B1 → GPIO0 |
can be shorted to GND while resetting the board to force ESP32-S3 bootloader/download mode.
This is useful when recovering an unresponsive board.
B0/B1 Should Be Used Carefully
Because B0 and B1 are strapping-related pins, Arduino recommends using them mainly as outputs if you repurpose them in a sketch.
External circuits that force an unexpected level during reset can change the ESP32-S3 boot behaviour.
For ordinary projects, use D0-D13/A0-A7 first and leave B0/B1 alone unless you specifically need them.
Bootloader Recovery
If the board becomes unresponsive:
- short B1 to GND;
- press/reset the board;
- enter bootloader mode;
- upload appropriate firmware;
- remove the B1-GND short;
- reset normally.
Arduino provides dedicated recovery documentation for Nano ESP32.
16 MB External Flash
The board includes:
|
1 2 3 4 5 |
128 Mbit = 16 MB |
of external QSPI Flash.
This is far more storage than classic Nano-family AVR boards.
It provides headroom for:
- large firmware;
- OTA partitions;
- filesystems;
- web assets;
- certificates;
- MicroPython files.
8 MB PSRAM
The NORA-W106 module also includes:
|
1 2 3 4 |
8 MB Octal SPI PSRAM |
This is valuable for:
- large buffers;
- graphics;
- audio;
- machine-learning models;
- networking;
- large JSON documents;
- MicroPython applications.
This memory capacity is one reason Nano ESP32 is much better suited to network-heavy applications than small AVR Nano boards.
Wi-Fi and Bluetooth
The onboard NORA-W106 module provides:
- 2.4 GHz 802.11 b/g/n Wi-Fi;
- Bluetooth Low Energy 5.0;
- integrated antenna.
The wireless stack runs directly on the same ESP32-S3 that executes your sketch.
There is no separate network coprocessor.
ESP-NOW
Nano ESP32 supports Espressif’s ESP-NOW peer-to-peer protocol.
This is useful for:
- wireless sensor nodes;
- low-latency controller links;
- remote buttons;
- robot-to-robot communication.
MicroPython
Arduino officially supports MicroPython on Nano ESP32.
The combination of:
- 240 MHz dual-core CPU;
- 512 kB SRAM;
- 8 MB PSRAM;
- 16 MB Flash;
- Wi-Fi and BLE;
makes the board substantially more comfortable for MicroPython than low-memory AVR boards.
Low-Power Hardware
ESP32-S3 includes:
- RTC memory;
- ULP coprocessor;
- deep sleep;
- light sleep;
- RTC-capable ADC operation;
- power-management hardware.
Arduino quotes very low SoC-only sleep currents, but the complete development board consumes more because regulators, LEDs and other board components remain present.
Always measure the complete board if battery lifetime matters.
Nano ESP32 vs Classic Nano Pin Compatibility
The Nano footprint makes mechanical migration easy, but electrical compatibility is not guaranteed.
| Feature | Classic Nano | Nano ESP32 |
|---|---|---|
| Logic voltage | 5 V | 3.3 V |
| CPU | ATmega328P, 16 MHz | Dual LX7, up to 240 MHz |
| Flash | 32 kB | 16 MB external |
| RAM | 2 kB | 512 kB + 8 MB PSRAM |
| ADC | 10 bit | 12-bit hardware |
| Wi-Fi | No | Yes |
| BLE | No | Yes |
| Native USB | No | Yes |
| True DAC | No | No |
For the legacy board’s exact mapping, see our classic Arduino Nano pinout guide.
Nano ESP32 vs Nano R4
The Nano R4 takes almost the opposite approach.
Nano R4 gives you:
- 5 V GPIO;
- RA4M1 Cortex-M4;
- 14-bit ADC;
- true 12-bit DAC;
- RTC;
- fixed CAN pins;
- Qwiic.
Nano ESP32 gives you:
- much faster CPU;
- far more memory;
- native Wi-Fi/BLE;
- ESP-NOW;
- PSRAM;
- MicroPython;
- ESP-IDF ecosystem.
See our Arduino Nano R4 pinout guide for the RA4M1 alternative.
Nano ESP32 and the Wider ESP32-S3 Family
Nano ESP32 uses the same fundamental ESP32-S3 architecture as many Espressif and third-party S3 boards, but its pin naming and compact Nano footprint are different.
If you need more GPIO access or want to compare module memory configurations, see our ESP32-S3 boards, modules and variants comparison.
Quick Pin Reference
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
UART D0 = GPIO44 = RX D1 = GPIO43 = TX SPI D10 = GPIO21 = CS D11 = GPIO38 = COPI / MOSI D12 = GPIO47 = CIPO / MISO D13 = GPIO48 = SCK / LED_BUILTIN I2C A4 = GPIO11 = SDA A5 = GPIO12 = SCL ADC1 A0 = GPIO1 A1 = GPIO2 A2 = GPIO3 A3 = GPIO4 ADC2 A4 = GPIO11 A5 = GPIO12 A6 = GPIO13 A7 = GPIO14 USB internal GPIO19 = D- GPIO20 = D+ Boot / RGB shared B0 = GPIO46 = red LED B1 = GPIO0 = green LED / boot strap Blue RGB LED = GPIO45 Operating voltage 3.3 V VIN 6-21 V VBUS 5 V only when USB is supplying it |
Best Practices
- Use symbolic pin names such as
D2andA0instead of bare numbers. - Remember that the default Arduino pin number is not the same as the raw ESP32 GPIO number.
- Never apply 5 V logic directly to Nano ESP32 GPIO.
- Use A0-A3 when analog measurement must coexist reliably with active Wi-Fi.
- Remember A4/A5 are both ADC2 channels and the default I²C bus.
- Do not expect a true DAC; ESP32-S3 has none.
- Keep B0/B1 free from external reset-time constraints unless you understand ESP32 strapping behaviour.
- Use
Serialfor USB andSerial1for D0/D1 UART. - Remember D13 shares SPI SCK with the built-in LED.
- Use a 3.3 V-compatible CAN transceiver when using TWAI.
Final Thoughts
The Arduino Nano ESP32 gives you a very capable ESP32-S3 platform in a compact Nano footprint, but its pinout requires more attention than an AVR Nano because there are two numbering systems.
The most important mappings are:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
D0 / D1 → GPIO44 / GPIO43 → UART D10-D13 → GPIO21 / GPIO38 / GPIO47 / GPIO48 → SPI A4 / A5 → GPIO11 / GPIO12 → I2C A0-A3 → GPIO1-GPIO4 → ADC1 A4-A7 → GPIO11-GPIO14 → ADC2 USB → internal GPIO19 / GPIO20 B1 → GPIO0 → bootloader strap B0 → GPIO46 → strapping / RGB LED shared |
The best habit is simple:
|
1 2 3 4 5 |
Use D0, D1, D2... and A0, A1... in Arduino sketches |
rather than assuming the number printed in code is automatically the raw ESP32 GPIO number.
Once that distinction is understood, Nano ESP32 becomes a very flexible platform: compact, fast, memory-rich, wireless, MicroPython-capable and fully integrated into both the Arduino and ESP32 ecosystems.