The ESP-01S is the revised, widely available iteration of the original ESP-01, built around the Espressif ESP8266EX System-on-Chip. While it retains the same physical 2x4 header footprint, the 'S' variant introduces critical internal hardware changes—specifically onboard pull-up resistors and a 1MB flash chip—that alter how you wire it for boot modes. Below is the definitive pinout reference, boot-strapping matrix, and hardware identification guide for the ESP-01S.
The Complete ESP-01S Pinout Reference Table
Unlike mains wiring governed by NEC or IEC color codes, embedded module pinouts follow the manufacturer's hardware design guidelines. The table below maps the physical ESP-01S pins to their ESP8266EX GPIO equivalents, default states, and primary functions. When using pre-soldered pigtail harnesses, standard UART color coding typically applies: Black (GND), Red (VCC), Green (TX), and White (RX), though always verify with a multimeter before applying power.
| Pin Name | Alt Name / GPIO | Direction | Default State | Function & Practical Notes |
|---|---|---|---|---|
| VCC | 3V3 / Power | Input | N/A | 3.3V power supply. Must be capable of sourcing 500mA to handle RF transmission spikes. Do not exceed 3.6V. |
| GND | Ground | N/A | 0V | Common ground. Internally tied to the metal RF shield. Must be shared with your microcontroller's ground. |
| TX | GPIO1 / UTXD | Output | High (3.3V) | UART Transmit. Outputs 3.3V logic. Connects to the RX pin of your host microcontroller or USB-serial adapter. |
| RX | GPIO3 / URXD | Input | High (3.3V) | UART Receive. Strictly 3.3V tolerant. Requires a logic level shifter or voltage divider if driven by a 5V source. |
| GPIO0 | Boot Select 0 | I/O | Pulled High (10kΩ) | Determines boot mode. Must be HIGH for normal execution, LOW for UART flash/download mode. Has onboard 10kΩ pull-up on the 'S' variant. |
| GPIO2 | Boot Select 1 / TX1 | I/O | Pulled High (10kΩ) | Must be HIGH (or floating) during boot. Outputs boot logs at 74880 baud. Has onboard 10kΩ pull-up on the 'S' variant. |
| RST | RESET / EN | Input | Pulled High | Active LOW reset. Pull to GND to reboot the chip. Must be HIGH for normal operation. |
| CH_PD | EN / Chip Enable | Input | Pulled High | Chip Power Down. Must be HIGH (3.3V) for the module to operate. If LOW, the chip enters a deep shutdown state. |
Rows People Get Wrong: Boot Modes and Logic Levels
When troubleshooting ESP-01S circuits, 90% of failures stem from misinterpreting three specific rows in the table above. Here is the practical breakdown of where designs fail.
The CH_PD vs. EN Naming Confusion
Early Espressif documentation labeled the enable pin as CH_PD (Chip Power Down). Modern ESP32 and updated ESP8266 documentation refers to this exact same pin as EN (Enable). On the ESP-01S silkscreen, you will almost always see "CH_PD" or "EN" printed. Regardless of the label, this pin must be tied to 3.3V (either directly or via a 10kΩ pull-up resistor) for the module to turn on. If you leave it floating, the module will randomly brownout or fail to boot.
The 5V Logic Trap on the RX Pin
The ESP8266EX silicon is strictly a 3.3V device. While the TX pin outputs 3.3V (which a 5V Arduino Uno will read as a valid HIGH), the RX pin is not 5V tolerant. Driving the ESP-01S RX pin directly from a 5V ATmega328P UART TX pin will degrade the internal protection diodes and eventually destroy the GPIO3 pad. Always use a bidirectional logic level converter (like a BSS138 MOSFET board) or a simple resistor voltage divider (e.g., 1kΩ series, 2kΩ to GND) to step the 5V TX signal down to ~3.3V.
Boot Strapping: The ESP-01S Pull-Up Advantage
The ESP8266EX reads GPIO0 and GPIO2 during the first few milliseconds of power-up to decide whether to boot from flash or enter UART download mode.
- Normal Boot (Run Code): GPIO0 = HIGH, GPIO2 = HIGH
- Flash Mode (Upload Code): GPIO0 = LOW, GPIO2 = HIGH
The critical difference: The original ESP-01 only had a 10kΩ pull-up on GPIO0. GPIO2 was left floating, meaning builders had to add external pull-up resistors to prevent boot failures. The ESP-01S added a 10kΩ onboard pull-up to both GPIO0 and GPIO2. If you are using an ESP-01S, you can leave both pins floating for a normal boot, but you must still actively pull GPIO0 to GND when you want to flash new firmware.
Faded Silk Screens: Identifying Pins Without Markings
Cheap clone modules from bulk marketplace orders frequently arrive with misaligned, faded, or entirely missing silkscreen text. If you cannot read the pin labels, do not guess. You can safely identify the ESP-01S pinout using physical orientation and a multimeter.
Step 1: Physical Orientation
Hold the module with the PCB antenna pointing UP, the metal RF shield facing you, and the 2x4 pin header pointing DOWN. The pins are arranged in two columns of four.
Step 2: The Standard Layout Matrix
| Position | Left Column | Right Column |
|---|---|---|
| Top Row | TX (GPIO1) | RX (GPIO3) |
| Second Row | GND | GPIO0 |
| Third Row | CH_PD (EN) | RST |
| Bottom Row | GPIO2 | VCC |
Step 3: Multimeter Verification
Set your multimeter to continuity mode. Touch the black probe to the metal RF shield (which is hard-tied to GND). Probe the pins on the header. The pin that beeps is GND (Left column, second row). Once GND is confirmed, the physical matrix above is locked in. To verify VCC (Right column, bottom row), switch to diode mode; you will read a forward voltage drop (typically ~0.4V to 0.6V) from GND to VCC due to the internal decoupling capacitors and the ESP8266EX power rails.
For deeper hardware design specifications and GPIO limitations, refer to the official Espressif ESP8266EX Datasheet and the Random Nerd Tutorials ESP8266 Pinout Reference.
Frequently Asked Questions
Can I power the ESP-01S directly from the 3.3V pin of an Arduino Uno?
No, this is a primary cause of brownouts and module resets. The onboard 3.3V regulator on a genuine Arduino Uno (typically an LP2985 or similar) is only rated for about 150mA. During Wi-Fi transmission bursts, the ESP-01S can draw current spikes up to 350mA. This exceeds the Arduino's regulator capacity, causing the voltage to droop below 2.8V, which triggers the ESP8266's internal brownout detector and reboots the module. You must power the ESP-01S VCC pin using a dedicated 3.3V LDO regulator (like an AMS1117-3.3) capable of supplying at least 500mA, fed from the Arduino's 5V pin or an external USB power supply.
Why does my ESP-01S boot into flash mode instead of running my code?
If your module continuously outputs garbage text at 74880 baud or refuses to execute your uploaded sketch, GPIO0 is being held LOW during the boot sequence. On the ESP-01S, GPIO0 has an onboard 10kΩ pull-up, so it should default to HIGH. However, if you have an external circuit, a pushbutton, or a sensor wired to GPIO0 that pulls the line to GND at the exact moment power is applied, the chip will interpret this as a request to enter UART download mode. Ensure GPIO0 is left floating or pulled HIGH during power-on, and only pull it to GND immediately before pressing the RST button when you intentionally want to flash new firmware.
What is the difference between the ESP-01 and ESP-01S LED behavior?
The original ESP-01 featured a blue LED wired directly to the TX pin (GPIO1). Every time the module transmitted serial data, the LED flashed, which caused issues if the user wanted to use GPIO1 for standard I/O or PWM. The ESP-01S revised this design. On the ESP-01S, the blue LED is typically moved to GPIO2 (and sometimes a secondary red power LED is added to VCC). Because GPIO2 is also a boot-strapping pin, the LED on the 'S' variant will flicker during the boot sequence. If you need to use GPIO2 for a relay or sensor, be aware that the onboard LED resistor will act as a weak pull-down, which may require you to use a stronger external pull-up resistor (e.g., 4.7kΩ) to guarantee a successful boot.






