El ESP32-S3 tiene 45 GPIO, pero no todos se pueden usar igual. Algunos deciden cómo arranca la placa, otros son el USB, y los de la memoria PSRAM quedan ocupados según la variante. Elegir mal un pin da síntomas confusos: la placa no arranca, el USB deja de responder o una lectura analógica falla solo cuando enciendes el Wi-Fi.
Esta guía usa la placa ESP32-S3-DevKitC-1 v1.1 como referencia. Si tu placa es de otro fabricante, el chip es el mismo, pero el orden y los rótulos pueden cambiar: compáralo con su esquema. Para ver todas las especificaciones del chip, está la ficha del ESP32-S3.

Resumen rápido
| Grupo | GPIO | Qué hacer |
|---|---|---|
| Seguros para uso general | 1, 2, 4–18, 21, 38–42, 47, 48 | Úsalos con calma; revisa los matices de abajo |
| Arranque (strapping) | 0, 3, 45, 46 | Evítalos o cuida su nivel al encender |
| USB nativo | 19 (D−), 20 (D+) | No los uses si necesitas el conector USB |
| Consola serie (UART0) | 43 (TX), 44 (RX) | Déjalos libres para depurar |
| PSRAM octal | 35, 36, 37 | Ocupados en módulos N8R8 y N16R8 |
| Memoria flash interna | 26–32 | No existen en la placa: son de la flash |
Los pines de arranque: 0, 3, 45 y 46
Al encender, el chip lee el nivel de estos pines y decide cómo iniciar:
- GPIO0: a nivel bajo entra en modo de descarga. Es el botón BOOT de la placa.
- GPIO45: fija el voltaje de la memoria flash interna.
- GPIO46: controla si se muestra el registro de arranque por el puerto serie.
- GPIO3: elige la fuente de JTAG.
Puedes usarlos como GPIO normales después del arranque, pero si algo externo los fuerza a un nivel equivocado en el momento del encendido, la placa no inicia o arranca en un modo raro. Un sensor o un relé con resistencia de pull-up o pull-down en estos pines es la causa típica de "funciona al conectar el USB pero no al encenderlo solo".
Regla práctica: si tienes pines libres de sobra, no uses estos cuatro.
USB nativo: GPIO19 y GPIO20
El ESP32-S3 tiene USB integrado en el chip. Los pines GPIO19 (D−) y GPIO20 (D+) van al conector marcado USB de la placa. Si los configuras como entrada o salida, pierdes el USB nativo: no podrás cargar programas por ese conector ni usar el puerto serie USB (CDC) hasta reiniciar con otro código.
Si ves que el ESP32 no aparece en el puerto USB justo después de usar GPIO19 o GPIO20, esa es la causa más probable.
La placa tiene dos conectores: el de UART (convertidor USB-serie, pasa por GPIO43 y GPIO44) y el de USB (nativo). Para cargar programas basta cualquiera de los dos.
PSRAM octal: GPIO35, 36 y 37
Las variantes con PSRAM octal (N8R8, N16R8: "R8" indica 8 MB de PSRAM) usan GPIO35, GPIO36 y GPIO37 para hablar con la memoria. En esos módulos no están disponibles. En una variante sin PSRAM octal (por ejemplo, N8 o N16 a secas) quedan libres, pero si quieres que tu código funcione en cualquier variante, no los uses.
Los GPIO26 a GPIO32 conectan la flash interna y no salen a la placa. Los GPIO33 y GPIO34 tampoco salen en la DevKitC-1.
ADC1 frente a ADC2
El ESP32-S3 tiene dos convertidores analógicos con 20 canales en total:
- ADC1: GPIO1 a GPIO10.
- ADC2: GPIO11 a GPIO20.
El Wi-Fi comparte hardware con ADC2. Con el Wi-Fi activo, una lectura en ADC2 puede fallar o devolver un error por timeout. Si tu proyecto usa Wi-Fi y lee un sensor analógico, conéctalo a un pin de ADC1 (GPIO1 a GPIO10).
const int PIN_SENSOR = 4; // ADC1_3: seguro con Wi-Fi activo
void setup() {
Serial.begin(115200);
analogReadResolution(12); // 0 a 4095
}
void loop() {
int lectura = analogRead(PIN_SENSOR);
Serial.println(lectura);
delay(500);
}
Las lecturas del ADC del ESP32 no son perfectamente lineales. Si necesitas precisión, usa analogReadMilliVolts(), que aplica la calibración de fábrica.
Entradas táctiles
Los GPIO1 a GPIO14 pueden funcionar como sensores táctiles capacitivos (TOUCH1 a TOUCH14). Sirven para botones sin pulsador: basta un cable o una lámina de metal conectada al pin.
JTAG: GPIO39 a GPIO42
Los pines 39 a 42 (MTCK, MTDO, MTDI, MTMS) son la interfaz JTAG para depurar con hardware externo. Si no usas JTAG externo, son GPIO normales. El ESP32-S3 también trae depuración JTAG por el USB integrado, así que rara vez necesitas ocuparlos.
Pines por defecto de I2C, SPI y UART
Casi cualquier periférico puede asignarse a cualquier GPIO libre gracias a la matriz de pines del chip, así que los "pines por defecto" son solo una convención del núcleo de Arduino. En la DevKitC-1 son:
| Bus | Señal | GPIO |
|---|---|---|
| I2C | SDA / SCL | 8 / 9 |
| SPI | SS / MOSI / SCK / MISO | 10 / 11 / 12 / 13 |
| UART0 | TX / RX | 43 / 44 |
Estos valores vienen del archivo pins_arduino.h de la variante y pueden cambiar entre versiones del núcleo o entre placas. Si algo no responde, imprime SDA, SCL, MOSI y SCK en el Monitor Serie o fíjalos tú:
#include <Wire.h>
void setup() {
Wire.begin(8, 9); // SDA, SCL explícitos
}
Fijar los pines en el código evita sorpresas al cambiar de placa.
El LED integrado
La DevKitC-1 trae un LED RGB direccionable (tipo WS2812), no un LED simple. Está en GPIO38 en la versión 1.1 y en GPIO48 en la 1.0. Se maneja con neopixelWrite:
void setup() {}
void loop() {
neopixelWrite(RGB_BUILTIN, 0, 20, 0); // verde tenue
delay(500);
neopixelWrite(RGB_BUILTIN, 0, 0, 0); // apagado
delay(500);
}
RGB_BUILTIN apunta al pin correcto en tu versión de la placa. Si prefieres no depender de él, ese pin cuenta como ocupado en tu lista.
Límites eléctricos
- Los GPIO trabajan a 3,3 V. No conectes señales de 5 V directamente: usa un divisor de tensión o un conversor de nivel.
- Por cada pin no pidas más de unos 20 mA. Para relés, motores o tiras LED, usa un transistor, un MOSFET o un módulo con optoacoplador, y alimenta la carga aparte. Más detalle en cómo alimentar un ESP32.
- Une siempre las tierras (GND) de todos los dispositivos que se comunican.
Lista de pines seguros
Para un proyecto con Wi-Fi, sin PSRAM octal y sin USB nativo:
- Entradas analógicas: GPIO1 a GPIO10 (ADC1).
- Salidas digitales y relés: GPIO4 a GPIO7, GPIO15 a GPIO18, GPIO21, GPIO47.
- I2C: GPIO8 y GPIO9.
- SPI: GPIO10 a GPIO13.
Y cuando algo falle sin razón aparente, revisa en este orden: pines de arranque, USB, PSRAM, ADC2 con Wi-Fi.
Preguntas frecuentes
¿Cuántos pines puedo usar realmente en una DevKitC-1?
Unos 36 GPIO llegan a los conectores. Con PSRAM octal bajan a 33, y si reservas los de arranque y la consola serie, quedan en torno a 25 para uso cómodo.
¿Puedo usar GPIO19 y GPIO20 como pines normales?
Sí, pero pierdes el USB nativo. Mantén a mano el conector UART para volver a cargar un programa si algo sale mal.
¿Por qué mi sensor analógico deja de funcionar al conectarme al Wi-Fi?
Probablemente está en un pin de ADC2 (GPIO11 a GPIO20). Muévelo a un pin de ADC1 (GPIO1 a GPIO10).
¿En qué se diferencian los pines del ESP32-S3 y del ESP32-C3?
El C3 tiene solo 22 GPIO, un único ADC útil con Wi-Fi y sin USB en la mayoría de placas pequeñas. Para elegir entre ambos, lee ESP32-S3 vs ESP32-C3.
ESP32-S3 DevKitC-1 N16R8
16 MB de flash y 8 MB de PSRAM; recuerda que ocupa GPIO35 a GPIO37.
Enlace de afiliado: si compras, el sitio recibe una comisión sin costo extra para ti.