El ESP8266 es un chip revolucionario que ha democratizado el acceso a la conectividad Wi-Fi en el mundo de la electrónica. Fabricado por la empresa china Espressif, este SoC (System on a Chip) no solo integra un stack TCP/IP completo, sino que también cuenta con un microcontrolador, permitiendo su programación directa. El módulo ESP-01 fue el primer formato en ganar popularidad, desarrollado por AI-Thinker, sentando las bases para una nueva era de dispositivos conectados.
En el corazón del ESP8266 late una CPU RISC de 32 bits, la Tensilica Xtensa LX106, que opera a una frecuencia de 80 MHz. Para aquellos que buscan exprimir al máximo su rendimiento, existe la posibilidad de realizar overclocking, duplicando la frecuencia del reloj de la CPU hasta 160 MHz y permitiendo que la memoria flash trabaje entre 40 MHz y 80 MHz. Esta potencia, combinada con su capacidad Wi-Fi, lo convierte en una opción atractiva para una vasta gama de proyectos, desde simples experimentos hasta aplicaciones IoT complejas.
Una de las mayores ventajas del ESP8266 es su compatibilidad con el popular Entorno de Desarrollo Integrado (IDE) de Arduino. Para comenzar a programar, es necesario incorporar las librerías y los programas de manejo de las placas con el chip ESP8266 al IDE. Esto se logra indicando la URL desde donde se obtienen estas herramientas. Dentro del IDE de Arduino, se accede al "Gestor de URLs Adicionales de Tarjetas" y, posteriormente, al "Gestor de Tarjetas". Al buscar "ESP8266" en el filtro de búsqueda, aparecerá el gestor deseado, creado por la "ESP8266 Community", listo para ser instalado.
Diseñando un Circuito Básico: El LED que Parpadea
El diseño de un circuito simple para hacer parpadear un LED en los ESP utilizando el IDE de Arduino es una práctica común y fundamental para iniciarse en el mundo de la programación de microcontroladores. La pregunta que surge naturalmente es: ¿por qué siempre lo primero que se enseña es a hacer que parpadee un LED? La respuesta radica en la versatilidad de esta tarea. Si podemos controlar un pin de salida para encender y apagar un LED, significa que tenemos la capacidad de controlar cualquier dispositivo electrónico conectado a ese pin.
La clave está en la capacidad del pin de salida para suministrar la corriente y el voltaje necesarios para el funcionamiento del dispositivo. En casos donde el consumo del aparato excede lo que el pin puede entregar directamente, se recurre a componentes electrónicos simples como transistores, MOSFETs o relés para adaptar las especificaciones. Estos componentes actúan como intermediarios, amplificando o modulando la señal del pin para controlar dispositivos de mayor consumo.

Programando el Parpadeo del LED en el IDE de Arduino
Al definir las variables en el programa, es crucial entender la nomenclatura. Cuando se hace referencia a salida = 0, se está aludiendo al GPIO 0, y si se define salida = 2, se está hablando del GPIO 2. Esta convención se basa en el firmware interno del ESP.
El proceso de programación en el IDE de Arduino sigue una estructura lógica:
- Definición de la variable de salida: Se asigna un número de pin a una variable para facilitar su manejo en el código. Por ejemplo:
int ledPin = 2; - Configuración del pin en
setup(): Dentro de la funciónsetup(), que se ejecuta una sola vez al inicio del programa, se utiliza la funciónpinMode(ledPin, OUTPUT)para configurar el pin seleccionado como una SALIDA (OUTPUT). Esto indica al microcontrolador que este pin se usará para enviar señales eléctricas. - Ciclo principal en
loop(): La funciónloop(), que se ejecuta indefinidamente después desetup(), contiene la lógica para hacer parpadear el LED. - Encendido del LED: Se utiliza la función
digitalWrite(ledPin, HIGH)para enviar una señal de voltaje ALTO (generalmente 3.3V en el ESP8266) al pin, lo que enciende el LED. - Retardo: La función
delay(1000)introduce una pausa de 1000 milisegundos (1 segundo). Durante este tiempo, el LED permanece encendido. - Apagado del LED: Se utiliza la función
digitalWrite(ledPin, LOW)para enviar una señal de voltaje BAJO (generalmente 0V) al pin, lo que apaga el LED. - Segundo Retardo: Otro
delay(1000)mantiene el LED apagado durante otro segundo. - Repetición: El programa regresa al paso 4, repitiendo el ciclo de encendido, espera, apagado y espera, creando así el efecto de parpadeo.
Programando Diferentes Módulos ESP8266
La forma de programar el ESP8266 varía ligeramente dependiendo del módulo específico que se esté utilizando.
NodeMCU (ESP-12E Module)
La opción más sencilla para programar el ESP8266 es cuando se utiliza una placa como el NodeMCU (ESP-12E Module), que ya tiene implementada la comunicación USB. Esto significa que la placa incluye los circuitos auxiliares necesarios para la programación, simplificando enormemente el proceso.
Para subir código a un NodeMCU:
- Seleccionar la Placa: En el menú "Herramientas" del IDE de Arduino, se selecciona la placa "NodeMCU 1.0 (ESP-12E Module)".
- Seleccionar el Puerto COM: A continuación, también en el menú "Herramientas", se elige el puerto COM al que está conectado el NodeMCU. Este número de puerto COM variará en cada computadora y puede cambiar, ya que lo determina dinámicamente el sistema operativo. No es necesaria ninguna otra configuración adicional.
Circuito para el LED en NodeMCU:
Para conectar un LED externo al NodeMCU, se utiliza el siguiente circuito: el LED se conecta en serie con una resistencia de 220 Ohm. La conexión se realiza al pin GND y a la pata D4 del NodeMCU, que corresponde al GPIO 2.

LEDs Integrados en la Placa:
Es importante destacar que la mayoría de los modelos de NodeMCU disponibles en el mercado ya incluyen un LED conectado en el GPIO 2 y otro en el GPIO 16, integrados directamente en la placa. Si se desea probar sin armar un circuito externo, se puede comenzar probando con la placa sola. Se puede experimentar subiendo código para salida = 2 (el LED azul integrado) y luego para salida = 16 (otro LED integrado en algunas placas), observando su comportamiento.
Para cargar el código en el ESP8266, se utiliza la función OUTPUT para configurar el pin deseado. Por ejemplo, si se quiere usar el pin GPIO 2:
int ledPin = 2; // Define el pin GPIO al que está conectado el LEDvoid setup() { pinMode(ledPin, OUTPUT); // Configura el pin como salida}void loop() { digitalWrite(ledPin, HIGH); // Enciende el LED delay(1000); // Espera 1 segundo digitalWrite(ledPin, LOW); // Apaga el LED delay(1000); // Espera 1 segundo}ESP-01
Subir código a un ESP-01 requiere un enfoque ligeramente diferente debido a que no cuenta con conectividad USB integrada. Para programar un ESP-01, es necesario establecer una comunicación USB a través de un conversor de USB a niveles TTL (que maneje voltajes de 3.3V). Este conversor se conecta a la conexión serie TX/RX del ESP8266, utilizando un módulo específico para ello.

Consideraciones Importantes para el ESP-01:
- Selector de Voltaje: Al adquirir un módulo conversor USB a TTL, es crucial localizar y asegurarse de que esté configurado para operar a 3.3V. Alimentar el ESP8266 con un voltaje superior a 3.6V puede dañarlo permanentemente.
- Modo de Arranque (Boot Mode): Para subir código al ESP-01, se debe poner el chip en modo bootloader. Esto se logra configurando adecuadamente ciertos pines GPIO durante el arranque. Específicamente, el GPIO 0 debe estar conectado a GND (tierra) al momento de encender o resetear el ESP8266. Esto indica al chip que debe prepararse para recibir un nuevo firmware desde la interfaz serie.
- Firmware: El término "firmware" se refiere a un software de bajo nivel, interno, que permite controlar circuitos eléctricos. Al subir un programa por primera vez desde el IDE de Arduino, el ESP8266 graba un nuevo firmware en su memoria flash.
Proceso de Programación del ESP-01:
- Conectar el Conversor: Conecte el módulo conversor USB a TTL a su computadora. Asegúrese de que esté configurado a 3.3V.
- Conectar el ESP-01 al Conversor: Realice las conexiones entre el ESP-01 y el conversor: TX del conversor a RX del ESP-01, RX del conversor a TX del ESP-01, GND a GND, y 3.3V a 3.3V. Crucialmente, conecte el GPIO 0 del ESP-01 a GND.
- Abrir el IDE de Arduino: Ejecute el IDE de Arduino.
- Seleccionar la Placa: En el menú "Herramientas" -> "Placa", seleccione "Generic ESP8266 Module".
- Seleccionar el Puerto COM: En el menú "Herramientas" -> "Puerto", elija el número de puerto COM que corresponda a su conversor USB a TTL. Este número dependerá de su sistema operativo.
- Subir el Código: Una vez configurado todo, pulse el botón "Subir" en el IDE de Arduino. Si las conexiones son correctas y el ESP-01 está en modo bootloader, el código se compilará y se transferirá al chip.
Una vez que el código se ha subido exitosamente, se puede desconectar el GPIO 0 de GND para permitir que el ESP8266 arranque normalmente y ejecute el programa cargado.
Detalles de Hardware y Diferencias con Arduino
El ESP8266, aunque potente, presenta diferencias significativas en su arquitectura de hardware en comparación con placas Arduino tradicionales basadas en microcontroladores Atmel.
Arquitectura y Memoria
El ESP8266 carece de muchas funciones integradas por hardware que se encuentran en los procesadores Atmel. La gestión del Wi-Fi consume una parte considerable de los recursos del SoC, lo que significa que la CPU debe dividir su tiempo entre estas tareas y la ejecución del programa del usuario. Si bien el ESP8266 es generalmente más rápido que un Arduino, esta sobrecarga de trabajo puede ser un factor a considerar en aplicaciones muy sensibles al tiempo.
Una diferencia fundamental es que el ESP8266 no posee memoria Flash interna. La memoria donde se almacena el programa se encuentra en el módulo externo y se comunica con el SoC a través de la interfaz SPI. Esto permite la existencia de módulos con distintas capacidades de memoria Flash, pero también implica que los pines GPIO utilizados para esta comunicación SPI no están disponibles para otros usos.
Alimentación
La alimentación del ESP8266 se realiza a 3.3V. Es vital no exceder los 3.6V, ya que una tensión superior puede dañar permanentemente el SoC. Muchas placas de desarrollo basadas en ESP8266, como el NodeMCU, incluyen reguladores de voltaje que permiten alimentar la placa a 5V (por ejemplo, a través del puerto USB), pero internamente estos reguladores se encargan de reducir la tensión a los 3.3V requeridos por el chip.
Tolerancia a Voltajes y Corriente de los Pines GPIO
Existe un debate considerable sobre la tolerancia a 5V de los pines GPIO del ESP8266. Si bien los datasheets de versiones anteriores no eran completamente claros, la evidencia actual y las declaraciones de Espressif sugieren que los pines GPIO sí son tolerantes a 5V cuando funcionan como entradas digitales. Sin embargo, es prudente asumir que no son tolerantes a 5V de forma nativa y tomar precauciones si se conectan señales de este nivel.
La corriente máxima que cada pin GPIO puede proporcionar o absorber cuando actúa como salida es de 12mA. Esto es significativamente menor que la capacidad de muchos modelos de Arduino, que pueden suministrar entre 20-40mA. Si se necesita controlar dispositivos que demandan más corriente, se deberá utilizar un circuito externo con transistores o relés.
Conversor Analógico-Digital (ADC)
El ESP8266 cuenta con un conversor analógico-digital (ADC) de 10 bits de resolución. Este ADC tiene su propio pin dedicado, independiente de los GPIO. El rango de tensión máximo que el ADC puede medir directamente en el chip es de 0 a 1V. Intentar medir tensiones superiores a 1V puede dañar el ADC. Sin embargo, muchas placas de desarrollo incorporan divisores de tensión que extienden este rango a 0-3.3V, permitiendo mediciones más amplias. Siempre se debe verificar el rango de medición específico de la placa que se esté utilizando.
Pines de Control: CHIPEN y EXTRSTB
- El pin CHIP_EN (Chip Enable) controla el encendido y apagado del SoC. El chip está encendido cuando este pin está en estado ALTO (HIGH).
- El pin EXT_RSTB (External Reset) se utiliza para el reinicio del ESP8266. El reinicio se activa cuando este pin está en estado BAJO (LOW).
Modos de Arranque (Boot Modes)
El ESP8266 soporta tres modos de arranque principales, que determinan su comportamiento al encenderse:
- UART Bootloader: Este modo permite subir un programa a la memoria flash a través de la interfaz UART (serial).
- Boot Sketch: En este modo, el ESP8266 ejecuta el último programa que fue cargado en su memoria flash. Este es el modo de operación normal después de haber programado el chip.
- SDIO: Este modo se utiliza para la comunicación a través de la interfaz SDIO, pero generalmente no se emplea cuando se programa con el IDE de Arduino.
La selección del modo de arranque se realiza configurando los estados de los pines GPIO15, GPIO0 y GPIO2 al momento del encendido o reinicio, de acuerdo con la siguiente tabla:
| Modo | GPIO15 | GPIO0 | GPIO2 |
|---|---|---|---|
| UART Bootloader | 0V | 0V | 3.3V |
| Boot normal | 0V | 3.3V | 3.3V |
| SDIO | 3.3V | xx | xx |
(Nota: 'xx' indica que el estado de estos pines no es crítico para este modo en particular)
En la mayoría de las placas de desarrollo, existen sistemas integrados que gestionan automáticamente el estado de estos pines para facilitar el arranque y la programación. Sin embargo, si se utiliza el ESP8266 o el ESP12E de forma independiente, o se desea un control más preciso, es fundamental tener en cuenta las siguientes consideraciones:
- El GPIO15 generalmente está "pulled down" (conectado a tierra a través de una resistencia interna), lo que significa que no se puede usar su resistencia interna de Pull-Up.
- El GPIO0 está configurado como "pulled high" (conectado a 3.3V mediante una resistencia interna) durante el funcionamiento normal.
- El GPIO2 no debe estar en estado BAJO (LOW) durante el arranque si se desea ejecutar el programa cargado en la flash.
Pines GPIO: Disponibilidad y Limitaciones
El ESP8266 cuenta con un total de 17 pines I/O (GPIO - General Purpose Input/Output). Estos pines pueden configurarse como entradas o salidas digitales.
- Como Salida: Pueden proporcionar dos niveles de tensión: 0V (LOW) y 3.3V (HIGH). La corriente máxima que pueden suministrar o absorber es de 12mA.
- Como Entrada: Pueden detectar niveles de tensión de 0V (LOW) o 3.3V (HIGH). Como se mencionó, actualmente se considera que son tolerantes a 5V como entrada digital, aunque se recomienda precaución.
El ESP8266, al igual que Arduino, dispone de resistencias internas de Pull-Up para los pines GPIO0 a GPIO15. El GPIO16, sin embargo, cuenta con una resistencia interna de Pull-Down.
Es importante notar que no todos los 17 GPIO son fácilmente accesibles o utilizables en todas las placas de desarrollo. De hecho, el número de GPIO utilizables puede ser limitado, lo que representa una diferencia notable respecto a la mayor flexibilidad que ofrecen muchas placas Arduino.

Los pines GPIO6 a GPIO11 suelen estar conectados internamente al chip de memoria Flash en la mayoría de las placas ESP8266. Por lo tanto, no se recomienda su uso como pines de propósito general, ya que su manipulación podría interferir con la comunicación de la memoria y causar inestabilidad o impedir el arranque del dispositivo.
Comportamiento de los Pines al Arrancar
Algunos pines del ESP8266 pueden presentar un comportamiento específico al momento del arranque, lo cual puede ser relevante si se conectan periféricos sensibles a estos pines. Ciertos pines pueden emitir una señal de 3.3V al arrancar, mientras que otros pueden emitir una señal de bajo voltaje. Esto puede ser problemático si se conectan directamente relés, transistores u otros componentes que puedan activarse de forma inesperada en este estado transitorio.
Los pines resaltados en amarillo en los diagramas de pinout de las placas de desarrollo indican aquellos que pueden usarse, pero requieren atención especial debido a su comportamiento potencial al arrancar. Los pines resaltados en rojo generalmente no se recomiendan para uso como entradas o salidas.
Salidas Analógicas (PWM)
A diferencia de Arduino, el ESP8266 no implementa PWM (Pulse Width Modulation) por hardware. En su lugar, emula la generación de señales PWM mediante software. La ventaja de este enfoque es que la funcionalidad PWM puede aplicarse a todos los pines GPIO (GPIO0 a GPIO15). La frecuencia por defecto de esta PWM por software es de 1kHz, pero puede ser ajustada. Sin embargo, esta emulación por software consume recursos del procesador, lo que podría afectar el rendimiento en aplicaciones que requieren una generación de PWM muy precisa o de alta frecuencia.
Entradas Analógicas (ADC)
Como se mencionó, el ESP8266 tiene un ADC de 10 bits. El pin ADC0 es el único pin dedicado a la entrada analógica. El rango de entrada nativo es de 0-1V. Algunas placas de desarrollo incluyen circuitos divisores de tensión para ampliar este rango a 0-3.3V, lo cual es útil para leer sensores analógicos que operan en ese rango.
Comunicación
El ESP8266 ofrece varios protocolos de comunicación integrados:
- Serial (UART): Dispone de dos interfaces UART por hardware.
- UART0: Utiliza los pines TX0 (GPIO1) y RX0 (GPIO3). También se puede acceder a través de los pines RTS0 y CTS0 (GPIO15 y GPIO13 respectivamente), aunque esto es menos común.
- UART1: Utiliza los pines TX1 (GPIO2) y RX1 (GPIO8). Sin embargo, el pin GPIO8 se emplea internamente para la comunicación con la memoria flash. Por lo tanto, en la práctica, el UART1 solo puede utilizarse para transmitir datos (TX1), no para recibir.
- Bus I2C: El ESP8266 no tiene hardware dedicado para I2C. La comunicación I2C se implementa mediante software (emulación). Esto significa que se puede utilizar casi cualquier pin GPIO como SDA (Data) o SCL (Clock). Por defecto, la librería I2C de Arduino para ESP8266 suele usar los pines GPIO4 (SDA) y GPIO5 (SCL). La velocidad máxima típica para I2C por software es de 450kHz, y al igual que con la PWM, la emulación por software consume recursos del procesador.
- Bus SPI: El ESP8266 cuenta con dos interfaces SPI por hardware. Sin embargo, una de ellas se utiliza internamente para la comunicación con la memoria flash externa. Por lo tanto, solo una interfaz SPI (SPI0) está disponible para uso general, típicamente empleando pines como GPIO9 (MISO), GPIO10 (MOSI) y GPIO11 (CLK).
PROTOCOLOS: UART - I2C - SPI - Comunicación Serie #001
Pines Específicos y su Comportamiento
- GPIO0: Es un pin crítico para el modo de arranque. Si se mantiene en LOW durante el arranque, el ESP8266 entra en modo bootloader para cargar firmware. Normalmente, está en HIGH durante la operación normal.
- GPIO2: Este pin también tiene relevancia durante el arranque. No debe estar en LOW al iniciar si se desea que el chip ejecute el programa de la flash.
- GPIO16: Este pin tiene una funcionalidad especial relacionada con el modo de "deep sleep" (sueño profundo). Puede utilizarse para despertar el ESP8266 de este estado de bajo consumo. Para lograrlo, GPIO16 debe estar conectado al pin RST (Reset).
- LEDs Integrados: Muchas placas de desarrollo del ESP8266, como el NodeMCU, incluyen LEDs integrados conectados a GPIO2 o GPIO16. Estos LEDs suelen funcionar con lógica invertida, es decir, un
HIGHen el pin puede apagarlos y unLOWencenderlos. Es importante consultar la documentación específica de la placa para confirmar esto.
La versatilidad del ESP8266, combinada con su bajo costo y su capacidad Wi-Fi, lo ha convertido en un componente esencial para makers, estudiantes y profesionales que desean integrar conectividad en sus proyectos electrónicos. Comprender el funcionamiento de sus pines GPIO y sus particularidades es el primer paso para desbloquear todo su potencial.