ESP8266 Pinout Reference: Which GPIO pins should you use?

This article is a guide for the ESP8266 GPIOs: pinout diagrams, their functions and how to use them.

ESP8266 Pinout Reference GPIOs Pins Guide

The ESP8266 12-E chip comes with 17 GPIO pins. Not all GPIOs are exposed in all ESP8266 development boards, some GPIOs are not recommended to use, and others have very specific functions.

With this guide, you’ll learn how to properly use the ESP8266 GPIOs and avoid hours of frustration by using the most suitable pins for your projects.

We also have a guide for the ESP32 GPIOs: ESP32 Pinout Reference: Which GPIO pins should you use?

ESP8266 12-E Chip Pinout

The following figure illustrates the ESP8266 12-E chip pinout. Use this diagram if you’re using an ESP8266 bare chip in your projects.

ESP8266 12-E chip pinout diagram gpios pins

Note: not all GPIOs are accessible in all development boards, but each specific GPIO works in the same way regardless of the development board you’re using. If you’re just getting started with the ESP8266, we recommend reading our guide: Getting Started with the ESP8266.

At the moment, there are a wide variety of development boards with the ESP8266 chip that differ in the number of accessible GPIOs, size, form factor, etc…

The most widely used ESP8266 boards are the ESP-01, ESP8266-12E NodeMCU Kit, and the Wemos D1 Mini. For a comparison of these board, you can read this guide: ESP8266 Wi-Fi Development Boards comparison.

ESP8266-01 Pinout

If you’re using an ESP8266-01 board, you can use the following GPIO diagram as a reference.

ESP-01 ESP8266 pinout diagram gpios pins

ESP8266 12-E NodeMCU Kit

The ESP8266 12-E NodeMCU kit pinout diagram is shown below.

ESP8266 12-E NodeMCU Kit pinout diagram gpios pins

Wemos D1 Mini Pinout

The following figure shows the WeMos D1 Mini pinout.

WeMos D1 Mini Pinout diagram gpios pins

Download PDF with ESP8266 Pinout Diagrams

We’ve put together a handy PDF that you can download and print, so you always have the ESP8266 diagrams next to you:

Download PDF Pinout Diagrams »

ESP8266 Peripherals

The ESP8266 peripherals include:

  • 17 GPIOs
  • SPI
  • I2C (implemented on software)
  • I2S interfaces with DMA
  • UART
  • 10-bit ADC

Best Pins to Use – ESP8266

One important thing to notice about ESP8266 is that the GPIO number doesn’t match the label on the board silkscreen. For example, D0 corresponds to GPIO16 and D1 corresponds to GPIO5.

The following table shows the correspondence between the labels on the silkscreen and the GPIO number as well as what pins are the best to use in your projects, and which ones you need to be cautious.

The pins highlighted in green are OK to use. The ones highlighted in yellow are OK to use, but you need to pay attention because they may have unexpected behavior mainly at boot. The pins highlighted in red are not recommended to use as inputs or outputs.

D0GPIO16no interruptno PWM or I2C supportHIGH at boot
used to wake up from deep sleep
D1GPIO5OKOKoften used as SCL (I2C)
D2GPIO4OKOKoften used as SDA (I2C)
D3GPIO0pulled upOKconnected to FLASH button, boot fails if pulled LOW
D4GPIO2pulled upOKHIGH at boot
connected to on-board LED, boot fails if pulled LOW
D8GPIO15pulled to GNDOKSPI (CS)
Boot fails if pulled HIGH
debug output at boot, boot fails if pulled LOW
A0ADC0Analog InputX

Continue reading for a more detailled and in-depth analysis of the ESP8266 GPIOs and its functions.

GPIOs connected to the Flash Chip

GPIO6 to GPIO11 are usually connected to the flash chip in ESP8266 boards. So, these pins are not recommended to use.

Pins used during Boot

The ESP8266 can be prevented from booting if some pins are pulled LOW or HIGH. The following list shows the state of the following pins on BOOT:

  • GPIO16: pin is high at BOOT
  • GPIO0: boot failure if pulled LOW
  • GPIO2: pin is high on BOOT, boot failure if pulled LOW
  • GPIO15: boot failure if pulled HIGH
  • GPIO3: pin is high at BOOT
  • GPIO1: pin is high at BOOT, boot failure if pulled LOW
  • GPIO10: pin is high at BOOT
  • GPIO9: pin is high at BOOT

Pins HIGH at Boot

There are certain pins that output a 3.3V signal when the ESP8266 boots. This may be problematic if you have relays or other peripherals connected to those GPIOs. The following GPIOs output a HIGH signal on boot:

  • GPIO16
  • GPIO3
  • GPIO1
  • GPIO10
  • GPIO9

Additionally, the other GPIOs, except GPIO5 and GPIO4, can output a low-voltage signal at boot, which can be problematic if these are connected to transistors or relays. You can read this article that investigates the state and behavior of each GPIO on boot.

GPIO4 and GPIO5 are the most safe to use GPIOs if you want to operate relays.

Analog Input

The ESP8266 only supports analog reading in one GPIO. That GPIO is called ADC0 and it is usually marked on the silkscreen as A0.

The maximum input voltage of the ADC0 pin is 0 to 1V if you’re using the ESP8266 bare chip. If you’re using a development board like the ESP8266 12-E NodeMCU kit, the voltage input range is 0 to 3.3V because these boards contain an internal voltage divider.

You can learn how to use analog reading with the ESP8266 with the following guide:

On-board LED

Most of the ESP8266 development boards have a built-in LED. This LED is usually connected to GPIO2.

ESP8266 NodeMCU On-board LED

The LED is connected to a pull-down resistor, so when you send a HIGH signal the LED turns off.


When the RST pin is pulled LOW, the ESP8266 resets. This is the same as pressing the on-board RESET button.

ESP8266 NodeMCU On-board Reset button


When GPIO0 is pulled LOW, it sets the ESP8266 into bootloader mode. This is the same as pressing the on-board FLASH/BOOT button.

ESP8266 NodeMCU GPIO 0 Flash boot button


GPIO16 can be used to wake up the ESP8266 from deep sleep. To wake up the ESP8266 from deep sleep, GPIO16 should be connected to the RST pin. Learn how to put the ESP8266 into deep sleep mode:


The ESP8266 doens’t have hardware I2C pins, but it can be implemented in software. So you can use any GPIOs as I2C. Usually, the following GPIOs are used as I2C pins:

  • GPIO5: SCL
  • GPIO4: SDA


The pins used as SPI in the ESP8266 are:

  • GPIO12: MISO
  • GPIO13: MOSI
  • GPIO14: SCLK
  • GPIO15: CS

PWM Pins

ESP8266 allows software PWM in all I/O pins: GPIO0 to GPIO16. PWM signals on ESP8266 have 10-bit resolution. Learn how to use ESP8266 PWM pins:

Interrupt Pins

The ESP8266 supports interrupts in any GPIO, except GPIO16.

Wrapping Up

We hope you’ve found this guide for the ESP8266 GPIOs useful. If you have some tips on how to use the ESP8266 GPIOs properly, you can write a comment below.

We also have a similar guide for the ESP32 GPIOs that you can read.

If you’re getting started with the ESP8266, we have some great content you might be interested in:

Thanks for reading.

Learn how to program and build projects with the ESP32 and ESP8266 using MicroPython firmware DOWNLOAD »

Learn how to program and build projects with the ESP32 and ESP8266 using MicroPython firmware DOWNLOAD »

Enjoyed this project? Stay updated by subscribing our weekly newsletter!

57 thoughts on “ESP8266 Pinout Reference: Which GPIO pins should you use?”

    • A really comprehensive guide. I’ve done a lot of trial and error with these devices. I now have all of the insight to design my projects and possibly a commercial product correctly from scratch. I am much endebted.

  1. Rui, your site is one of the best there is for learning ESP8266 (& ESP32).
    I’ve struggled a lot with projects that wont boot etc. and now I understand why !!!
    Your articles are always very professional, very interesting and easy to follow.
    I have found many solutions to problems by studying your articles & projects !!
    Thank you !!

    • Hi.
      Thank you so much for your nice works.
      I’m very happy to see that our readers really enjoy our work. That keeps me motivated to write even better content.

  2. Great article, thanks !!
    It’s always convenient to have tables showing the pin outs of these fantastic cards.
    I’ve been trying to flash an ESP-07S with nodemcu firmware lately, but I didn’t succeed. Do you have a chart for this card?
    Greetings. Mike.

  3. Thank you for producing comprehensive guides to ESP8266 devices /boards (also ESP12E), they provide very useful and accessible information sources, without the need for internet searches.

  4. Thanks for this useful guide to the pinouts.

    Does the Wemos D1 mini have an onboard voltage divider for the analog input? I ask because I just tried an ACS712 Current Sensor Module, 5V powered, and divided down to the 1V range with a 4K7 & 1K2 resistor divider.

    The ACS712 gives a “neutral” reading of half the range, so I was expecting around 512 with nothing connected. Instead I get 170, which would be expected if the A0 input was divided onboard by 3.

    (Now what do I need to do to turn a divide by 3 into a divide by 5?)

  5. This clears up some questions, thanks!

    Is there a key or guide for the color tabs used in the pinout diagrams? I understand black and red, but light blue, gray, etc?


    • Hi Dave.
      Those are just random colors we’ve chosen to differentiate the pins.
      Pins with similar functions are highlighted with the same color.
      For example, SPI is green, I2C is light blue, etc.

  6. Wonderful, clear and concise article.
    I bough one of your guide and it’s written this way.
    Pleasant to read and to use!

  7. O trabalho de vcs é perfeito, sempre fico impressionado com a qualidade e precisão de suas postagens.

  8. You are correct, the A0 input is divided. See drawing.
    In the middle of the schematic far right you can the the divider.

  9. Forgot to mention that you can modify the voltage divider on the ACS712 to a 5 to 3 V divider. Here some math comes in. since you will load 1 voltage divider by another. Some testing needed. Final calibration can be done in software.

  10. Re voltage divider on the D1 Mini, the link below says onboard there are 220K and 100K resistors, so to divide down 5 volts, you add 180K in series to A0.

  11. Great resource, thank you.
    Your site is one that I recommend to folks often as your courses are so well put together. Please keep it up 🙂

  12. I have an ESP-WROOM-32 board, what pin-out should I follow? I looks kinda like the ESP8266 12-E NodeMCU Kit, pins are differently labelled. Any assistance.

  13. Greetings

    Excellent guide.
    I was struggling with a D1 mini, three switch buttons and four relays.

    It seems that I must use an esp32.


    • A D1 mini should be able to handle 3 switch buttons and 4 relays. Note that RX and TX can be made to be GPIOs if need to be. I’ve been bitten by boot condition needs–specifically, I had a pullup for a DS18B20 on D8, which disabled normal booting.

      It’s also possible to add an MCP23017 16-bit I2C GPIO expander module (<$3US on ebay) to gain a lot more I/Os on a D1 Mini (I like the D1 Mini a lot).

  14. Hey guys! This page is very useful!

    I’m currently prototyping using a Wemos D1 mini, but tht final processor will be an ESP12EX. Since it has more GPIOs available at the bottom (GPIO: 6, 8, 10 , 9, 7, 11) do you know if these are usable? I’m planning to create my own breakout board since I don’t need the extra stuff NodeMCU has. Thank you!

  15. Hello,

    You have “MOSI” and “MISO” incorrectly swapped in the “SPI” section.
    Everywhere else it’s correct: in the pinout pictures, the Best Pins to Use table.


  16. This is a fantastic reference. I was wondering if you would consider adding HTML id tags so I can to this page, but a specific section. Since the page is so long I’d like to be able to link directly to the pin table if possible.

  17. Nice tutorials. I have several 8266 01 boards that were programmed as OTA and just reporting near by wi fi stations. Lost the documentation, now trying to restore to factory fresh. Just can not accomplish the task. Will keep trying.

  18. Really useful information, I wish I’d seen this before I did my first 8266 project the hard way.

    One little trick that worked for me was using the 12-E NodeMCU. I found the 3.3V analogue input too high – I needed 1.0V (and expected this from the documentation I had at the time). With some careful soldering I was able to short out the upper voltage divider resistor giving me 1V sensitivity with (if I recall) 100 Kohm input impedance. Normally I wouldn’t attempt such an intricate process but you just need to attach a wire to the copper pad on the chip, actually not so hard.

  19. Hello,
    I have come up with mention of the fact that the Max of voltage at ADC0 on bare ESP8266 chips is 1V.
    Is this true of ESP8266 12-E/F.
    And is this true of Wemos D1R1/R2 also.
    Appreciate your response.
    Best Regards.

    • Yes, the bare chip has a maximum voltage of 1v, of course it is possible to increase that with a simple potential divider network (2 resistors, one of which is probably already on your chip/board). Some of the development boards add a potential divider network usually to make the sensitivity 3.3v at the A0 pin, I only have direct experience of the NodeMCU board where this is the case, but it might also be true of the products you mention.

      The input impedance at A0 is 330Kohm (probably true for all such boards), so if you want to increase the max voltage further, you can add a resistor in series with A0 R = Vmax * 100-330 K. As I said previously if you want to decrease the Vmax with a little soldering* skill you can attach a resistor directly to the analogue input pin of the chip itself R = Vmax*100 – 100 K.

      *Not sure about the wisdom of this (may not be legal in your jurisdiction), but I have some old leaded solder (left over from my youth before health and safety) it melts about 20 degrees lower than unleaded, so if you set your regulated iron to coolish, its great if you want to tweak boards with surface mount components without risk of disturbing anything.

  20. Please, Please put together a pinout page like this one. Every time I google for images on espXXX pinouts, I always get your page. I looked but was not able to find one for the Arduino boards. Yours is clean and concise.

    It would be a GREAT addition !!!

    As always, thanks for all the work and time you put in!


  21. Hi, I use the info above regularly. Thanks. I have a problem which I hope you can solve. I am using GPOI 14 15 and 16 as switch position detectors.on an ESP 8266 NODEMCU
    int RED = digitalRead (D5);
    {digitalWrite (LED, LOW);}
    {digitalWrite (LED, HIGH);}
    digitalWrite (D5, HIGH);

    I can detect when RED is LOW but the LED stays on even with the last line setting D% HIGH. Any suggestions?

    • If a pin is set for input, it will have very high impedance and the voltage present will be controlled by the external circuits. You can’t meaningfully write to it to change that.

      You likely (but since I don’t know what you’re trying to do, I can’t be sure) need to arrange pull up (or perhaps down) resistors to ensure that the signal “floats” where you want it to when the input conditions change.

      But bottom line; at any given instant, a pin is either input OR output. Not both.


Leave a Reply to Sara Santos Cancel reply

Download our Free eBooks and Resources

Get instant access to our FREE eBooks, Resources, and Exclusive Electronics Projects by entering your email address below.