The classic ESP32 is called ESP32S. Since its debut in 2016, many additional ESP32 types surfaced, i.e. ESP32-S3 or ESP32-C6. But until today, the ESP32S remains popular among DIY makers because it is particularly straight-forward to use:
- Well known:** Most *ESP32 examples in the Internet or on YouTube are either for the ESP8266 or the ESP32S. There is plenty of documentation.
- Well supported: No matter what you are planning to do with the microcontroller, chances are the ESP32S is fully supported. It has been around for almost 10 years, so by now, almost all editors, development environments, home automation systems, and whatnot have incorporated this microcontroller.
- Well balanced: The ESP32S comes with an exceptionally well balanced feature set and includes support for motor control, contains a DAC (digital-to-analog converter), touch support, and much more that may be useful for DIY makers.
That said, if you are looking for a miniature footprint or cutting-edge low power consumption, or if you are into the latest wireless standards such as Matter or Threads, then you may want to pick one of the ESP32S successors instead.
ESP32 Types
The most popular and widely available ESP32S is the WROOM-32D. But there are quite a view variations. When you purchase ESP32 dev boards, look for the fine print in the type:
- WROOM-32: First version of ESP32
- WROOM-32D: Revised version of ESP32 with PCB antenna
- WROOM-32E: Same as WROOM-32D but with an IPX antenna jack for connecting an external antenna
- WROVER: Same as WROOM-32 but with additional 4/8 MB pSRAM
- WROVER-B: Same as WROOM-32D but with additional 8MB pSRAM
- WROVER-IB: Same as WROVER-B but with an IPX antenna jack instead of a built-in PCB antenna
In addition, check the memory size. The price difference between 4MB and 8MB versions is typically very small, and the extra margin in memory may save your project one day.
Once you start planning on using a ESP32S in your project, one of the first things you want to find out is what the GPIO pins are that are safe to use. That’s covered by the next section below.
GPIOs
The GPIO information in this section applies to all and every ESP32S and to all development boards that use an ESP32S.
The GPIOs that are actually exposed and that can be used by you depend on the particular development board you purchase. There are boards with 38 pins, 30 pins, and even smaller form factors with much less pins. The fewer pins a development board exposes, the more of the ESP32S functionality is unavailable to you. Which can be perfectly ok: if you don’t need the full set of GPIOs but would rather like to build smaller devices, then get a smaller development board. It’s a trade-off between space requirements and available features.
The information below does not apply to other ESP32 microcontrollers such as ESP32-S2 or ESP32-C3. While their GPIO layout may be similar, it is not identical.
Always-Safe ESP32 GPIOs
These GPIOs are always safe to use for whatever purpose:
GPIO | Modes | Remark | Remark |
---|---|---|---|
4 | Ain Din Dout | D4 | general purpose input/output GPIO |
16 | Din Dout | RX2 | general purpose input/output GPIO |
17 | Din Dout | TX2 | general purpose input/output GPIO |
25 | Ain Aout Din Dout | DAC1 | exposes DAC1 (if used) |
26 | Ain Aout Din Dout | DAC2 | exposes DAC2 (if used) |
27 | Ain Din Dout | general purpose input/output GPIO | |
32 | Ain Din Dout | general purpose input/output GPIO | |
33 | Ain Din Dout | general purpose input/output GPIO | |
34 | Ain Din | input only, no pullup/pulldown | |
35 | Ain Din | input only, no pullup/pulldown | |
36 | Ain Din | input only, no pullup/pulldown | |
37 | Ain Din | input only, no pullup/pulldown | |
38 | Ain Din | input only, no pullup/pulldown | |
39 | Ain Din | input only, no pullup/pulldown |
Second-Choice GPIOs
If you need more GPIOs, you can look into using the GPIOs below. They serve other purposes as well, so make sure your using them does not cause conflicts. If your code i.e. does not use the I2C interface, it is perfectly ok to use these GPIOs for other purposes:
GPIO | Modes | Caveat |
---|---|---|
0 | Ain Din Dout | input is pulled up, outputs PWM signal at boot, must be low to enter flashing mode |
1 | Dout | TX pin for serial communications, debug output at boot |
2 | Ain Din Dout | connected to on-board LED, floating or low to enter flashing mode |
3 | Din | RX pin for serial communications, high at boot |
5 | Din Dout | outputs PWM signal at boot, strapping pin, VSPI |
12 | Ain Din Dout | boot fails if pulled high, strapping pin, HSPI |
13 | Ain Din Dout | free to use if HSPI is not used |
14 | Ain Din Dout | free to use if HSPI is not used |
15 | Ain Din Dout | free to use if HSPI is not used |
18 | Din Dout | free to use if VSPI is not used |
19 | Din Dout | free to use if VSPI is not used |
21 | Din Dout | free to use if I2C is not used |
22 | Din Dout | free to use if I2C is not used |
23 | Din Dout | free to use if VSPI is not used |
Interface Pins (I2C and SPI)
Most sensors and peripherals use either the I2C (slow speed) or SPI (high speed) interface. While these interfaces can be emulated in software, it is always best to use the dedicated hardware GPIOs. They are typically much faster and put less load on the microcontroller.
I2C
GPIO | Remark |
---|---|
21 | SDA |
22 | SCL |
SPI
Function | VSPI | HSPI |
---|---|---|
MOSI | 23 | 13 |
MISO | 19 | 12 |
CLK | 18 | 14 |
CS | 5 | 15 |
Strapping Pins
Some pins are called strapping pins because their logical state at boot time determines whether the microcontroller runs the ROM bootloader code, or your uploaded firmware. That’s why strapping pins should be used with care.
As you see below, using strapping GPIOs in your code isn’t as risky as some say:
GPIO | Label | Remark |
---|---|---|
0 | 0 | low to run ROM serial boot loader. Else, run custom code |
2 | D2 | if GPIO is high, then GPIO2 is ignored. Else, must be low/floating to enter boot loader. |
5 | D5 | controls timing of SDIO slave, default is high during boot (rising-edge output). Irrelevant when chip uses normal SPI flash. Used for CS in VSPI. |
12 | D12 | sets flash voltage (3.3V by default). If set to high on accident during boot, 3.3V flash receives 1.8V and browns out |
15 | D15 | low silences boot messages |
In reality, most restrictions apply during boot time only which is a period of time where your code has not even started to run:
- GPIO0: do not use
- GPIO2: must never be hard-wired to high. In your code, you can freely use GPIO2 because your code will not run when boot mode was enabled via the boot button, and GPIO2 only matters in boot mode.
- GPIO5: its strapping functionality does not apply to normal development boards, so it can be freely used unless hardware SPI is needed (i.e. for color displays or other high speed peripherals)
- GPIO12: must never be hard-wired to high. In your code, you can freely use GPIO2 because your code will only run after the flash voltage has been set.
- GPIO15: Freely usable. Whether nor not boot messages are emitted is not interfering with boot.
The one thing to keep in mind is to not use strapping pins as inputs (you cannot control whether a user or input sensor delivers a high signal at the wrong time), and never hard-code strapping pins to high levels otherwise.
From your code, you can use these GPIOs without much restrictions.
Serial Com GPIOs
The serial communications interface is used to upload new firmware, and often also to communicate with it: Serial.print()
commands in your firmware code can output information, i.e. sensor data, that show in the terminal window of an IDE.
During normal operation, and if you don’t need serial communications yourself, its two pins can be used for other purposes as well:
GPIO | Label | Remark |
---|---|---|
1 | TX0 | serial comm (transmit) |
3 | RX0 | serial comm (receive) |
However, using these GPIOs may require prerequisites to not interfere with required serial comm during boot or firmware upload.
Since your firmware code can not run at these sensitive instances, your code is always fine. What you do need to consider is your hardware design and schematics: do not physically pull-up or pull-down these pins or connect components to these pins that can alter their state during boot.
Ghost GPIOs
For unknown reasons, six GPIOs are generally not exposed in the ESP32S GPIO MUX, so they are never exposed on any board:
GPIO | Label |
---|---|
20 | newer versions may expose this GPIO after all |
24 | not working |
28-30 | not working |
Slow Website?
This website is typically very fast, and pages should appear instantly. If this site is very slow for you, then your routing may be messed up, and this issue does not only affect done.land, but potentially a few other websites and downloads as well. Here are simple steps to speed up your Internet experience and fix issues with slow websites and downloads..
Comments
Please do leave comments below. I am using utteran.ce, an open-source and ad-free light-weight commenting system.
Here is how your comments are stored
Whenever you leave a comment, a new github issue is created on your behalf.
-
All comments become trackable issues in the Github Issues section, and I (and you) can follow up on them.
-
There is no third-party provider, no disrupting ads, and everything remains transparent inside github.
Github Users Yes, Spammers No
To keep spammers out and comments attributable, all you do is log in using your (free) github account and grant utteranc.es the permission to submit issues on your behalf.
If you don’t have a github account yet, go get yourself one - it’s free and simple.
If for any reason you do not feel comfortable with letting the commenting system submit issues for you, then visit Github Issues directly, i.e. by clicking the red button Submit Issue at the bottom of each page, and submit your issue manually. You control everything.
Discussions
For chit-chat and quick questions, feel free to visit and participate in Discussions. They work much like classic forums or bulletin boards. Just keep in mind: your valued input isn’t equally well trackable there.
(content created Mar 23, 2024 - last updated Sep 29, 2024)