Hardware Matrix

ESP32 vs ESP8266 for ESPHome: Which Board?

Published · figures computed from the dataset, last updated

Almost every wired pairing in this index names a host board, and for an ESPHome node the choice is between the ESP8266 and a member of the ESP32 family. 108 of the curated ESPHome configs here target an ESP32-family chip and 10 target the ESP8266. Both run ESPHome well, so the useful question is not which one works but which one runs out first for the node you are building: memory, serial ports, analog pins, or a radio the chip does not have.

The short answer

Start a new node on an ESP32-family board. Reach for an ESP8266 when the node has one bus and one job and the board is already in the drawer. Within the ESP32 family:

  • Classic ESP32: the most analog inputs you can use with Wi-Fi on, three UARTs that route to almost any pin, Bluetooth Classic and LE, and an Ethernet MAC on the chip. The reference host for most configs in this index.
  • ESP32-C3: a single RISC-V core, Bluetooth LE and USB on the chip, in small, low-cost boards. The modern stand-in for an ESP8266.
  • ESP32-S3: two cores, USB on the chip and optional PSRAM in the package. The one for cameras, colour displays, speakers and microphones.
  • ESP32-C6: Wi-Fi 6 plus an 802.15.4 radio, so the node can join Thread or Zigbee instead of Wi-Fi.
  • ESP32-S2: no Bluetooth at all. Fine for a Wi-Fi sensor, no use as a Bluetooth proxy.
  • ESP32-H2 and ESP32-P4: no Wi-Fi of their own. The H2 talks Thread or Zigbee only; the P4 needs a second ESP32 as its radio.

The chips side by side

Chip ESP8266 ESP32 ESP32-C3 ESP32-S3 ESP32-C6
CPU 1 × Xtensa L106 2 × Xtensa LX6, 240 MHz 1 × RISC-V, 160 MHz 2 × Xtensa LX7, 240 MHz 1 × RISC-V, 160 MHz
RAM about 50 kB left for the program on Wi-Fi 520 KB SRAM 400 KB SRAM 512 KB SRAM, optional PSRAM 512 KB SRAM
Radios Wi-Fi 4 Wi-Fi 4, Bluetooth 4.2 Classic and LE Wi-Fi 4, Bluetooth 5 LE Wi-Fi 4, Bluetooth 5 LE Wi-Fi 6, Bluetooth 5 LE, 802.15.4 (Thread, Zigbee)
GPIOs on the chip 17 34 22 45 30, or 22 in the smaller package
Hardware UARTs 1, plus a transmit-only UART1 3 2 3 2, plus a low-power UART
I²C software only 2 1 2 1, plus a low-power I²C
ADC one 10-bit pin, 0 to 1.0 V 12-bit; ADC1 on GPIO32 to 39 12-bit; ADC1 on GPIO0 to 4 12-bit; ADC1 on GPIO1 to 10 12-bit; ADC1 on GPIO0 to 6
USB through a converter chip through a converter chip USB-Serial-JTAG on GPIO18/19 USB OTG and USB-Serial-JTAG on GPIO19/20 USB-Serial-JTAG on GPIO12/13
Deep sleep, chip only 20 µA 10 µA 5 µA 7 µA 7 µA
Wi-Fi transmit current 170 mA typical 240 mA typical 335 mA peak 340 mA peak 354 mA peak

Figures from Espressif's datasheets for each chip, and the ESP8266's RAM line is Espressif's figure for a chip connected to a router. The transmit rows are not like-for-like: the ESP8266 and ESP32 sheets give a typical figure at a 50% duty cycle, the newer sheets a peak at full power. The ESP32-S2 is not in the table; ESPHome lists it as a single-core LX7 with 43 GPIOs, USB OTG and no Bluetooth.

What this index's configs and planner assume

Host ESP8266ESP32ESP32-C3ESP32-S3
Curated ESPHome configs 1093213
Usable GPIO pins 9261636
Hardware UARTs free for parts 1212
Usable analog inputs 16510
Analog caveat One ADC pin (A0), 0-1.0V range — most boards add a divider for 3.3V.ADC1 only (GPIO32-39). ADC2 is unusable while Wi-Fi is on, which is always here.ADC1 on GPIO0-4. ADC2 is unusable with Wi-Fi active.ADC1 on GPIO1-10. ADC2 is unusable with Wi-Fi active.

The conflict planner uses these numbers when it checks whether a parts list fits a board. Its UART count leaves out the port the USB console usually occupies, which is why it is lower than the chip totals above. Camera and dev-board variants count towards their chip.

Where the ESP8266 still earns its place

The one-job node: an I²C climate sensor, a relay, a button, an infrared blaster. ESPHome supports the chip fully, boards built on it are everywhere, and a node that will never gain a second bus will never meet its limits. The 10 ESP8266 pairings with a curated config in this index are mostly that shape:

Where the ESP8266 runs out first

Memory

Espressif puts the heap and data space left to a program at around 50 kB once an ESP8266 is connected to a router. ESPHome's Wi-Fi, API connection and every component you add share that space, so the margin is measured in kilobytes. ESPHome's documentation warns that the web server component takes a lot of memory and can make a node less stable, especially on the ESP8266. A small colour display shows the scale: the full 16-bit frame buffer of a 128 × 160 panel is about 40 kB, a rounding error on an ESP32 and the difference between building and not on an ESP8266, which is why the ST7735 page discusses 8-bit colour. ESPHome also documents encrypted MQTT, with a CA certificate, on the ESP32. A node that needs a web page, a display and a TLS broker wants an ESP32.

One and a half serial ports

The ESP8266 has two hardware UARTs, and only one of them can receive. UART0 sits on GPIO1 and GPIO3, shared with the USB converter and the boot messages, or can be swapped to GPIO15 (TX) and GPIO13 (RX). UART1 is transmit-only, on GPIO2. Ask ESPHome for a UART on any other pins and it falls back to software serial, which its documentation says can glitch, especially at higher baud rates. In practice that is one receiving serial part per ESP8266, with serial logging switched off (baud_rate: 0 under logger:) so the logger does not talk over it. A PMS5003 and an MH-Z19B on one node is an ESP32 job, and the LD2450 radar, which only talks at 256000 baud, is no candidate for software serial.

Pins that are already spoken for

The chip has 17 GPIOs, and few come without conditions. GPIO6 to GPIO11 connect to the flash. GPIO0, GPIO2 and GPIO15 choose the boot mode: GPIO0 and GPIO2 must be high and GPIO15 low for the chip to start from flash, so a part that pulls one the wrong way at power-on leaves the node stuck before ESPHome runs. GPIO1 and GPIO3 are the serial port. GPIO16 is the deep-sleep wake line and has a pull-down but no pull-up. ESPHome's documentation names GPIO4, GPIO5 and GPIO12 to GPIO14 as the pins without boot-time restrictions, and GPIO12 to GPIO14 are also the hardware SPI bus. A relay that clicks at every power cycle is usually wired to one of the boot-mode pins, which is why the ESP8266 relay pairing puts its input on GPIO5.

One analog input, 0 to 1.0 V

The ESP8266 has a single 10-bit ADC pin, and the chip itself reads 0 to 1.0 V on it. Development boards usually put a divider in front of A0 so it accepts more. Using A0 for a sensor also rules out ESPHome's supply-voltage reading, which needs the pin left unconnected. A second analog sensor means an ADS1115 on the I²C bus, or a second board.

No Bluetooth, no RMT driver, timer-only sleep

There is no Bluetooth radio, so no Bluetooth proxy and no BLE sensors. ESPHome's RMT LED strip driver is ESP32-only, so addressable strips go through NeoPixelBus, which ESPHome recommends running on GPIO3 with its DMA method to reduce flicker; GPIO3 is also UART0's receive pin. Deep sleep wakes only on a timer: GPIO16 has to be wired to RST, and ESPHome offers no wake-up pin on this chip.

Pins to leave alone on each ESP32

  • ESP32: GPIO0, 2, 5, 12 and 15 are strapping pins, and GPIO12 sets the flash supply voltage at reset, so a part that pulls it high can stop a module booting. GPIO6 to 11 belong to the flash. On WROVER modules GPIO16 and 17 belong to the PSRAM, which is why the GPS and A4988 pages tell WROVER owners to move those lines. GPIO34 to 39 are input-only with no internal pull-ups, so a rotary encoder wants other pins or external resistors.
  • ESP32-C3: GPIO2, 8 and 9 are strapping pins, GPIO12 to 17 connect to the flash, and GPIO18 and 19 carry the on-chip USB. GPIO9 is the one that decides the boot: held low at reset, it puts the chip in download mode instead of starting ESPHome. This index's C3 configs put I²C on GPIO8 and GPIO9, where the bus pull-ups keep GPIO9 high, which is what a normal boot needs; a part that drags GPIO9 low at power-on belongs on another pin.
  • ESP32-S3: GPIO0, 3, 45 and 46 are strapping pins. GPIO26 to 32 serve the flash and PSRAM, and modules with octal PSRAM, such as the one on the XIAO ESP32S3 Sense, take GPIO33 to 37 as well. GPIO19 and 20 are the USB pins.
  • ESP32-C6: GPIO4, 5, 8, 9 and 15 are strapping pins, GPIO24 to 30 serve the flash, and GPIO12 and 13 are the USB pins.

Espressif's GPIO reference for each chip lists these in full: ESP32, ESP32-C3, ESP32-S3 and ESP32-C6.

Analog: ADC1 or nothing

On the classic ESP32, ADC2 shares hardware with the Wi-Fi radio, and Espressif's advice is to use ADC1 pins when Wi-Fi is running. An ESPHome node has Wi-Fi running all the time, so plan analog sensors onto GPIO32 to 39; the capacitive soil probe sits on GPIO34 for that reason. The S2 and S3 split the same way, with ADC1 on GPIO1 to 10 and ADC2 on GPIO11 to 20. The C3's only ADC2 channel, on GPIO5, is no longer supported by ESP-IDF because of a hardware erratum, and the C6 and H2 have ADC1 alone.

Range is the second catch. The attenuation option in ESPHome's ADC sensor sets how much voltage a pin accepts. At the highest setting, 12 dB, Espressif specifies the classic ESP32's effective range as 150 mV to 2450 mV. With attenuation: auto, ESPHome picks the setting per reading, and its own testing found a usable range of roughly 0.075 V to 3.12 V. Neither reaches 3.3 V, so a sensor with a full-rail output wants a divider. When a node needs more inputs or better resolution than the chip gives, an ADS1115 adds four 16-bit channels on I²C.

Serial, I²C and SPI

The classic ESP32 and the S3 each have three UARTs and two I²C controllers, and the UARTs can be routed to almost any free pin. The C3 and C6 have two UARTs and one main I²C controller, and the C6 adds low-power versions of both. On boards whose USB socket goes through a converter chip, UART0 is the console. ESPHome has no software serial on the ESP32 family, and with hardware ports to spare it rarely needs one: a CO2 sensor and a mmWave radar fit on one classic ESP32 with the console still on UART0. A second I²C bus is the cheapest way out of an address clash, as the I²C address conflicts guide explains, and a TCA9548A multiplexer covers the case where two buses are not enough.

LED strips and PWM

On ESP32 chips with RMT hardware, addressable strips use esp32_rmt_led_strip, which works on both frameworks. ESPHome deprecated NeoPixelBus's ESP32 support in 2026.6 because the library does not build on ESP-IDF, and its migration guide names esp32_rmt_led_strip as the replacement for both NeoPixelBus and FastLED's clockless driver. The ESP32-C2 and C61 have no RMT hardware and cannot drive a strip this way. On the S3, RMT memory comes in 48-symbol blocks and long strips can flicker under Wi-Fi load until rmt_symbols is raised, as the WS2812B page explains. Plain PWM for dimmers, buzzers and motors is ledc on the ESP32 family and esp8266_pwm on the ESP8266.

Bluetooth proxies and BLE sensors

Neither the ESP8266 nor the ESP32-S2 has a Bluetooth radio. ESP32 variants that do can scan for BLE sensors and run as a Home Assistant Bluetooth proxy with active connections. The limits are memory and radio time. ESPHome warns that the BLE stack takes a large share of RAM and that crashes become likely with too many other components on the node. Each active connection slot costs about 1 kB: the default is three, the ceiling nine, and ESPHome advises staying at five or fewer. It recommends ESP-IDF over Arduino for a proxy because it uses less memory, and a board on Ethernet so the radio is not also carrying Wi-Fi traffic. On single-core chips such as the C3, Wi-Fi and BLE scanning share the one core, which ESPHome notes has caused trouble connecting to Wi-Fi. The comfortable proxy is a dual-core classic ESP32 or S3 doing nothing else, ideally on Ethernet. The Bluetooth hub lists the Bluetooth devices in this index.

Thread and Zigbee on the C6 and H2

The C6 and H2 carry an IEEE 802.15.4 radio, and ESPHome has two ways to use it. The openthread component puts the node on a Thread network instead of Wi-Fi. It needs the ESP-IDF framework and a Thread border router already on your network, since the node cannot be one, and ESPHome notes that OTA updates do not work while a polling period is set for a sleepy device. The zigbee component makes the node a Zigbee end device, or a router if you ask, exposing sensors and binary sensors on ESP32 chips. A C6 can stay on Wi-Fi as a station while acting as a Zigbee end device, but ESPHome reports that Wi-Fi plus a Zigbee router is unstable, and that the H2 has proved more reliable than the C6, with some C6 boards working only beside the coordinator. The H2 has no Wi-Fi, so on that chip it is Thread or Zigbee. The P4 has no radio at all; the esp32_hosted component gives it Wi-Fi and Bluetooth through a second chip such as a C6. See the Thread and Zigbee hubs for devices on those networks.

Framework: ESP-IDF is the default

Since ESPHome 2026.1.0, an esp32: block with no framework builds with ESP-IDF. Arduino is still available on the classic ESP32, S2, S3 and C3, now packaged as an ESP-IDF component; the C5, C6, C61, H2 and P4 are ESP-IDF only. ESPHome's migration guide claims binaries up to 40% smaller on ESP-IDF, since an Arduino build carries both frameworks. A few components still need Arduino, among them heatpumpir, midea and the WLED effect, and others have ESP-IDF replacements, such as bme68x_bsec2 for bme680_bsec. The dependency also runs the other way: the speaker media player on the MAX98357A page refuses Arduino. Every ESP32-family board block in this index's own configs declares ESP-IDF explicitly; the finished products built from a vendor package, such as the Apollo AIR-1, take whatever framework the vendor's YAML chooses. The ESP8266 has one framework, so there is nothing to choose.

USB, flashing and logs

ESP8266 and classic ESP32 boards reach your computer through a USB-serial converter on UART0, and flashing and logs both go that way. The C3, C6 and S3 have a USB-Serial-JTAG peripheral on the chip, and the S2 and S3 have USB OTG, so many boards wire the socket straight to the chip and leave the converter out. That changes where ESPHome's logger has to write. It can target USB_SERIAL_JTAG (C3, C6, S3), USB_CDC (S2, S3) or a UART, and a node logging to a port your socket is not wired to boots silently. Some C3 and S3 boards still put a converter on UART0, so check the board's schematic and set hardware_uart to match, as the XIAO ESP32S3 config in this index does. Reusing the USB pins as ordinary GPIOs switches the on-chip USB off.

Power, brownouts and battery nodes

Wi-Fi transmits in bursts, and the newer chips' datasheets put those peaks at 335 to 354 mA at full power. A thin USB lead, a computer's USB port or an adapter's 3.3 V pin that sags under them shows up as brownout resets just as Wi-Fi or a camera starts, the failure the ESP32-CAM page sees most often. Give camera and LED nodes a proper 5 V supply sized for everything on it.

For battery sensors the deep-sleep row matters more: 20 µA for the ESP8266 against 5 µA for the C3, for the chip alone. The ESP8266 wakes only on its timer, through the GPIO16-to-RST wire. The classic ESP32 can also wake on an RTC-capable pin or a touch pad, and ESPHome documents waking on a group of pins with esp32_ext1_wakeup for the S2, S3, C6 and H2 among others. The C3 is not on that list, so check the deep sleep documentation before planning a C3 node around a pin wake-up. On a development board the regulator, converter chip and power LED can draw far more than the sleeping chip, so measure the whole board before promising a battery life.

Which board for which node

Node Board Why
One I²C climate sensor, a relay, a button or an IR blaster An ESP8266 you already own, or an ESP32-C3 One bus and a few pins; the limits never come into play.
Two serial parts, such as a CO2 sensor and a mmWave radar ESP32 or ESP32-S3 Hardware UARTs on almost any pin; the ESP8266 has one that receives.
Several analog inputs, such as soil probes or CT clamps ESP32 Six ADC1 pins that work with Wi-Fi on; add an ADS1115 for more.
Bluetooth proxy or BLE sensors Dual-core ESP32 or ESP32-S3, on Ethernet if possible The BLE stack needs RAM headroom and radio time.
Addressable LED strip ESP32 or ESP32-S3 RMT hardware; a 5 V strip also wants a level shifter on the data line.
Camera ESP32-S3 with PSRAM, or an ESP32-CAM The frame buffer lives in PSRAM.
Speaker, microphone or voice ESP32-S3 The speaker media player is ESP-IDF only; streaming music needs PSRAM.
Colour display ESP32, or ESP32-S3 with PSRAM for larger panels Frame buffers an ESP8266 cannot spare.
Battery sensor waking on a timer or a pin ESP32-C3 for a timer, ESP32-C6 or S3 for a pin, on a board with a low-current regulator 5 to 7 µA chip deep sleep; ESPHome documents group pin wake-ups on the C6 and S3, not the C3.
Thread or Zigbee end device ESP32-H2 or ESP32-C6 An 802.15.4 radio; ESPHome reports the H2 as the steadier Zigbee node.
Wired Ethernet ESP32 board with an Ethernet PHY The classic ESP32 has an Ethernet MAC on the chip.

Where to go next

Every device page with a curated config names its host and pins, and the ESPHome hub lists them all. The conflict planner checks a parts list against the host limits above before you wire anything. Browse by bus with I²C, UART, analog and I²S parts, or by job in the function categories. For the chips themselves, ESPHome's ESP8266 and ESP32 platform pages are the reference.

Frequently Asked Questions

Is the ESP8266 obsolete?
No. It is finished, which is not the same thing. ESPHome still supports it, and for one I2C sensor, a relay or a button it does the whole job. What it cannot do is grow: around 50 kB of memory left for the program once it is on Wi-Fi, one UART that can receive, one analog pin and no Bluetooth. For a node that might gain a second sensor later, start on an ESP32-C3, which fills the same niche without those limits.
Why do my analog readings break when Wi-Fi connects on an ESP32?
The pin is on ADC2, which shares hardware with the Wi-Fi radio. An ESPHome node keeps Wi-Fi up all the time, so only ADC1 pins are dependable: GPIO32 to GPIO39 on the classic ESP32 (GPIO34 to GPIO39 are input-only), GPIO1 to GPIO10 on the S2 and S3, and GPIO0 to GPIO4 on the C3. Move the sensor to one of those.
Can an ESP8266 or ESP32-S2 be a Bluetooth proxy?
No. Neither chip has a Bluetooth radio. Use an ESP32 variant that has one, ideally a dual-core classic ESP32 or S3 given over to the job, built with ESP-IDF, with no more than five active connection slots, and on Ethernet if the board has it.
Why does my ESP32-C3 or ESP32-S3 print nothing over USB?
The logger is writing to a different port from the one your USB socket is wired to. Boards with the socket on the chip's own USB need hardware_uart: USB_SERIAL_JTAG (USB_CDC on an S2); boards with a USB-serial converter chip need UART0. Set it explicitly in the logger block and flash again.
Can an ESP32-C6 run Zigbee or Thread in ESPHome?
Yes, both. The openthread component joins the node to a Thread network through a border router you already have, and the zigbee component makes it a Zigbee end device or router that exposes sensors and binary sensors. ESPHome reports the ESP32-H2 as the more reliable Zigbee chip and Wi-Fi alongside a Zigbee router as unstable, so on a C6 keep Zigbee to an end device, or use an H2.
Which variant should a new project default to?
An ESP32-family board. The classic ESP32 for the most usable pins, analog inputs and serial ports; the C3 for small single-sensor and battery nodes; the S3 with PSRAM for cameras, colour displays and audio; the C6 or H2 for Thread and Zigbee. Choose the ESP8266 only when its limits are known to fit: one bus, one job, a board you already own.

More guides