Componentes · 13 min de lectura

ESP-01 con Arduino: comandos AT, programación y control de relé

Conecta el ESP-01 (ESP8266) a Arduino: 8 pines, alimentación de 3,3 V, Wi-Fi por comandos AT, programación con GPIO0 a GND, relé ESP-01S y errores comunes.

El ESP-01 es un módulo diminuto (24,8 × 14,3 mm) y muy barato que lleva el chip Wi-Fi ESP8266. Al conectar el ESP-01 a Arduino puedes añadir Wi-Fi con unos pocos cables a una placa sin conexión inalámbrica, como el Uno o el Nano. El módulo viene de fábrica con un firmware de comandos AT: el Arduino envía por el puerto serie comandos de texto cortos como "AT+CWJAP", y el ESP-01 se conecta a la red, envía y recibe datos. Si lo prefieres, también puedes programar el ESP-01 como un microcontrolador independiente, sin ningún Arduino; su procesador es mucho más rápido que el del Uno.

En esta guía aprenderás los 8 pines del ESP-01 y por qué necesita sí o sí una alimentación de 3,3 V potente. Después verás paso a paso los comandos AT con un Arduino Uno, una página web que enciende un LED desde el móvil, la programación directa con un adaptador USB-TTL (el método de GPIO0 a GND), el control de una lámpara con el módulo relé ESP-01S y su uso con una Raspberry Pi Pico. Al final encontrarás las soluciones a los errores más comunes y cuándo conviene más un NodeMCU o un ESP32.

Módulo Wi-Fi ESP-01 ESP8266
Módulo Wi-Fi ESP-01: el chip ESP8266EX, la memoria flash, una antena en la PCB y 8 pines en un conector de 2×4, todo en una placa pequeña.

¿Qué es el ESP-01 y cómo funciona?

El ESP-01 es el primer y más pequeño módulo que Ai-Thinker diseñó alrededor del chip ESP8266EX. La placa lleva el chip, un cristal de 26 MHz, la memoria flash donde se guardan el programa y la configuración, y una antena serpenteante impresa en la PCB; no tiene puerto USB, regulador de voltaje ni botones. Por eso el ESP-01 no se puede enchufar directamente al ordenador: la alimentación y la conexión serie las tienes que montar tú. Puedes usar el módulo de dos formas: como módem Wi-Fi (con el firmware AT instalado, el Arduino envía comandos) o como microcontrolador independiente (subes tu propio programa desde el Arduino IDE y el firmware AT se borra). La mayoría de los módulos que se venden hoy son la versión negra ESP-01S.

CaracterísticaValor
ChipESP8266EX (Tensilica L106, 32 bits)
Velocidad de reloj80 MHz (se puede subir a 160 MHz)
Memoria flashESP-01: 512 KB, ESP-01S: 1 MB
RAMUnos 80 KB de RAM de datos; con Wi-Fi conectado quedan ~50 KB para tu programa
Wi-Fi802.11 b/g/n, solo 2,4 GHz, antena en la PCB
Voltaje de funcionamiento3,0–3,6 V (recomendado 3,3 V)
Consumo70–80 mA de media conectado, ~170 mA al transmitir, picos de más de 300 mA
Consumo en deep sleepUnos 20 µA (chip)
GPIO utilizables4: GPIO0, GPIO2, GPIO1 (TX), GPIO3 (RX)
Entrada analógicaNinguna (el pin del ADC no está accesible)
Tamaño24,8 × 14,3 mm
Firmware de fábricaFirmware de comandos AT (normalmente a 115200 baudios)

Diferencias entre ESP-01 y ESP-01S

CaracterísticaESP-01ESP-01S
Color de la placaNormalmente azulNegra
Memoria flash512 KB (1 MB en versiones negras posteriores)1 MB
LED de alimentaciónRojo, siempre encendidoNo tiene
LED azulEn la línea TX (GPIO1), parpadea al enviar datosEn GPIO2, se enciende cuando el pin está en LOW
Distribución de pines8 pinesLos mismos 8 pines, totalmente compatible
ConsumoUnos mA más por el LED de alimentaciónMenor, mejor para proyectos con pilas

Pines del ESP-01: para qué sirve cada uno

El ESP-01 tiene 8 pines en un conector de 2×4, y solo cuatro de ellos se pueden usar como entradas y salidas. No todas las placas llevan los nombres de los pines impresos, así que compara tu módulo con el esquema del vendedor antes de cablearlo: invertir VCC y GND quema el módulo en segundos. Estas son las funciones de los pines y su conexión en funcionamiento normal:

PinFunciónConexión en funcionamiento normal
VCCEntrada de alimentación de 3,3 VUna fuente de 3,3 V potente (al menos 300 mA)
GNDTierraGND común con el Arduino y la fuente
TX (GPIO1)Salida de datos serieA la línea RX del Arduino
RX (GPIO3)Entrada de datos serieA la línea TX del Arduino (con divisor de tensión en placas de 5 V)
EN (CH_PD)Activa el chipA 3,3 V (directo o con 10 kΩ)
RSTReinicia el chip cuando está en LOWAl aire o a 3,3 V con 10 kΩ
GPIO0Elige el modo de arranque, luego entrada/salidaEn HIGH (al aire) al arrancar; a GND para programar
GPIO2Entrada/salida (LED azul en el ESP-01S)Debe estar en HIGH al arrancar
El ESP-01 funciona solo con 3,3 V; el límite superior de funcionamiento del chip es 3,6 V. Conectar los 5 V del Arduino al pin VCC puede dañar el módulo para siempre. El pin TX del Arduino Uno también da una señal de 5 V; no lo conectes directamente al pin RX del ESP-01, usa un divisor de tensión o un convertidor de nivel lógico.

Consumo: por qué no basta el pin de 3,3 V del Arduino

La mayoría de los problemas que queman el ESP-01 o lo hacen reiniciarse sin parar vienen de la alimentación. Conectado al Wi-Fi, el módulo consume de media 70–80 mA y unos 170 mA al transmitir; en el arranque y al conectarse a la red puede haber picos breves de más de 300 mA. El pin de 3,3 V del Arduino Uno, en cambio, solo da oficialmente 50 mA. Un ESP-01 alimentado desde ese pin suele responder al comando "AT", pero en cuanto intenta conectarse a la red la tensión cae y el módulo se reinicia, algo que parece un fallo de software. La solución es un regulador AMS1117-3.3 (1 A) alimentado con 5 V y un condensador electrolítico de 100–470 µF entre VCC y GND del módulo. En el artículo del regulador de voltaje 7805 explicamos cómo funcionan los reguladores.

Fuente de alimentación¿Sirve?Nota
Pin de 3,3 V del Arduino UnoNoOficialmente 50 mA; el módulo se reinicia al conectarse al Wi-Fi
Pin de 3,3 V de un adaptador USB-TTLCasi nuncaEl regulador interno del chip suele dar 50–100 mA
Regulador AMS1117-3.3 (entrada de 5 V)SíHasta 1 A; 10 µF a la salida y 100–470 µF junto al módulo
Adaptador USB para ESP-01SíLleva un CH340 y un AMS1117; el módulo se conecta directamente
2 pilas AA (3 V)JustoAl descargarse la tensión baja de 3 V y el módulo se vuelve inestable
Batería Li-ion de una celda (3,7–4,2 V)No directamenteSupera el límite de 3,6 V; necesita un regulador LDO de 3,3 V

Cómo conectar el ESP-01 al Arduino Uno (para comandos AT)

El único puerto serie por hardware del Arduino Uno (D0 y D1) se comparte con la conexión USB. Por eso lo más práctico es conectar el ESP-01 a los pines D2 y D3 con la librería SoftwareSerial: no tienes que desconectar el ESP-01 al subir código al Uno y el Monitor Serie queda libre para depurar. La Raspberry Pi Pico ya funciona a 3,3 V, así que no necesita divisor:

Pin del ESP-01Arduino UnoRaspberry Pi PicoNota
VCCSalida del AMS1117-3.3AMS1117-3.3 o 3V3(OUT)El pin de 3,3 V del Uno no basta; para la salida 3V3 de la Pico se recomiendan 300 mA como máximo
GNDGNDGNDRegulador, placa y módulo con GND común
TXD2GP1 (UART0 RX)Conexión directa
RXD3 (con divisor de 1 kΩ / 2 kΩ)GP0 (UART0 TX)En la Pico no hace falta divisor
EN (CH_PD)3,3 V3,3 VDirecto o con 10 kΩ
RSTSin conectarSin conectarOpcional: a 3,3 V con 10 kΩ
GPIO0Sin conectarSin conectarNo lo conectes a GND en funcionamiento normal
GPIO2Sin conectarSin conectarDebe estar en HIGH al arrancar

Para bajar la señal de 5 V que sale del pin D3 del Uno, pon una resistencia de 1 kΩ entre D3 y el RX del ESP-01, y otra de 2 kΩ entre el RX del ESP-01 y GND. La tensión de salida es 5 × 2 / (1 + 2) = 3,33 V; con 2,2 kΩ en lugar de 2 kΩ obtienes 3,44 V, y ambas son seguras. Puedes calcular otros valores con la calculadora de divisor de tensión. En el sentido contrario no hace falta divisor: los 3,3 V del pin TX del ESP-01 superan el umbral de 3 V a partir del cual el Uno lee HIGH. Explicamos a fondo los fundamentos de la comunicación serie en el artículo de comunicación serie UART.

Primera prueba: enviar comandos AT desde el Monitor Serie

  1. Sube al Uno el sketch puente de abajo; en el primer intento pon ESP_BAUD en 115200, porque la mayoría de los módulos vienen a esa velocidad (los antiguos pueden venir a 9600).
  2. Abre el Monitor Serie a 115200 baudios y ajusta el fin de línea en Both NL & CR; sin este ajuste el módulo no sabe que el comando ha terminado.
  3. Escribe AT y envíalo; deberías ver OK. Si aparecen caracteres raros, las velocidades no coinciden.
  4. SoftwareSerial no lee bien a 115200, así que baja la velocidad del módulo de forma permanente a 9600 con AT+UART_DEF=9600,8,1,0,0. Aunque la respuesta salga corrupta, el comando suele llegar.
  5. Cambia ESP_BAUD a 9600 en el sketch, vuelve a subirlo y repite el comando AT; ahora la respuesta OK debería verse limpia.
  6. Comprueba que el módulo funciona bien consultando la versión del firmware con AT+GMR y las redes Wi-Fi cercanas con AT+CWLAP.
C++ (Arduino IDE)
1#include <SoftwareSerial.h>
2
3SoftwareSerial esp(2, 3);          // D2 = RX, D3 = TX (bölücüyle ESP RX'e) / D3 to ESP RX via divider
4
5const long ESP_BAUD = 9600;        // ilk denemede 115200 yap / use 115200 on the first try
6
7void setup() {
8  Serial.begin(115200);            // Seri Monitör hızı / Serial Monitor speed
9  esp.begin(ESP_BAUD);
10  Serial.println("AT komutu yaz / type an AT command");
11}
12
13void loop() {
14  if (esp.available()) {           // ESP-01'den geleni ekrana yaz / ESP-01 -> screen
15    Serial.write(esp.read());
16  }
17  if (Serial.available()) {        // klavyeden yazılanı ESP-01'e gönder / keyboard -> ESP-01
18    esp.write(Serial.read());
19  }
20}

Los comandos AT más usados del ESP-01

ComandoQué haceRespuesta de ejemplo
ATPrueba la conexiónOK
AT+RSTReinicia el móduloOK ... ready
AT+GMRMuestra la versión del firmwareAT version:... SDK version:... OK
AT+UART_DEF=9600,8,1,0,0Cambia la velocidad de forma permanenteOK
AT+CWMODE=1Modo estación; 2 = punto de acceso, 3 = ambosOK
AT+CWLAPLista las redes Wi-Fi cercanas+CWLAP:(3,"AgAdi",-58,...)
AT+CWJAP="AgAdi","Sifre123"Se conecta a una red Wi-FiWIFI CONNECTED, WIFI GOT IP, OK
AT+CIFSRMuestra la dirección IP obtenida+CIFSR:STAIP,"192.168.1.45"
AT+CIPMUX=1Activa conexiones múltiples (obligatorio para un servidor)OK
AT+CIPSERVER=1,80Inicia un servidor TCP en el puerto 80OK
AT+CIPSTART=0,"TCP","192.168.1.10",80Se conecta a un servidor por la conexión 00,CONNECT y OK
AT+CIPSEND=0,20Envía 20 bytes por la conexión 0> ... SEND OK
AT+CIPCLOSE=0Cierra la conexión 00,CLOSED y OK
Si AT+CWJAP falla, el módulo escribe +CWJAP:1 (tiempo agotado), +CWJAP:2 (contraseña incorrecta), +CWJAP:3 (red no encontrada) o +CWJAP:4 (fallo de conexión) y después FAIL. El ESP8266 solo ve redes de 2,4 GHz; si no encuentra tu red, comprueba que la banda de 2,4 GHz esté activada en el router. Escribe los comandos en mayúsculas y pon el nombre de la red y la contraseña entre comillas dobles.

Controlar un LED desde el móvil con Arduino Uno y ESP-01

Ahora convirtamos los comandos AT en un programa. El siguiente código conecta el ESP-01 a tu red, abre un pequeño servidor web en el puerto 80 y muestra la dirección IP en el Monitor Serie. Si escribes esa dirección en el navegador de un móvil conectado al mismo Wi-Fi, se abre una página con dos botones que encienden y apagan el LED integrado en el pin 13 del Uno. Si en lugar del LED conectas un módulo relé, controlarás una lámpara del mismo modo. Antes de subirlo, asegúrate de haber puesto la velocidad del módulo en 9600 en el paso anterior.

C++ (Arduino IDE)
1#include <SoftwareSerial.h>
2
3SoftwareSerial esp(2, 3);              // D2 = RX, D3 = TX (bölücüyle) / D3 via divider
4const int LED_PIN = 13;                // Uno'nun dahili LED'i / Uno onboard LED
5
6const char* WIFI_SSID = "AgAdi";       // Wi-Fi adın / your Wi-Fi name
7const char* WIFI_PASS = "Sifre123";    // Wi-Fi şifren / your Wi-Fi password
8
9bool ledOn = false;
10bool pending = false;                  // cevap bekleyen istek var mı / request waiting for a reply
11int linkId = 0;                        // ESP-01'in bağlantı numarası (0-4) / connection id (0-4)
12char line[64];
13byte lineLen = 0;
14
15// Beklenen yazıyı süre dolana kadar ara / wait until the expected text arrives or time runs out
16bool waitFor(const char* expect, unsigned long timeout) {
17  unsigned long start = millis();
18  size_t idx = 0;
19  size_t len = strlen(expect);
20  while (millis() - start < timeout) {
21    if (esp.available()) {
22      char c = esp.read();
23      Serial.write(c);                 // gelen her şeyi göster / echo everything
24      if (c == expect[idx]) {
25        idx++;
26        if (idx == len) return true;
27      } else {
28        idx = (c == expect[0]) ? 1 : 0;
29      }
30    }
31  }
32  return false;
33}
34
35bool sendAT(const char* cmd, const char* expect, unsigned long timeout) {
36  esp.println(cmd);                    // println sonuna \r\n ekler / println adds \r\n
37  return waitFor(expect, timeout);
38}
39
40void sendPage(int id) {
41  char body[220];
42  snprintf(body, sizeof(body),
43           "<meta name='viewport' content='width=device-width'>"
44           "<h2>LED: %s</h2>"
45           "<a href='/on'><button>AC / ON</button></a> "
46           "<a href='/off'><button>KAPAT / OFF</button></a>",
47           ledOn ? "ACIK / ON" : "KAPALI / OFF");
48  char head[110];
49  snprintf(head, sizeof(head),
50           "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n"
51           "Content-Length: %d\r\nConnection: close\r\n\r\n",
52           (int)strlen(body));
53
54  esp.print("AT+CIPSEND=");            // önce kaç bayt gideceğini söyle / announce the length first
55  esp.print(id);
56  esp.print(',');
57  esp.println(strlen(head) + strlen(body));
58  if (waitFor(">", 2000)) {            // ">" gelince veriyi yolla / send data after ">"
59    esp.print(head);
60    esp.print(body);
61    waitFor("SEND OK", 5000);
62  }
63  esp.print("AT+CIPCLOSE=");           // bağlantıyı kapat / close the connection
64  esp.println(id);
65  waitFor("OK", 2000);
66}
67
68void handleLine() {
69  if (strncmp(line, "+IPD,", 5) == 0) {          // yeni istek / new request: +IPD,0,384:GET /on ...
70    linkId = line[5] - '0';
71    if (strstr(line, "GET /on ")) ledOn = true;
72    else if (strstr(line, "GET /off ")) ledOn = false;
73    digitalWrite(LED_PIN, ledOn ? HIGH : LOW);
74    pending = true;
75  } else if (pending && lineLen == 0) {           // boş satır = isteğin sonu / empty line = end of request
76    pending = false;
77    sendPage(linkId);
78  }
79}
80
81void setup() {
82  pinMode(LED_PIN, OUTPUT);
83  Serial.begin(115200);
84  esp.begin(9600);                     // AT+UART_DEF=9600,8,1,0,0 ile ayarlanmış olmalı / set with AT+UART_DEF
85
86  sendAT("AT+RST", "ready", 5000);     // temiz başlangıç / clean restart
87  sendAT("AT+CWMODE=1", "OK", 2000);   // istemci modu / station mode
88
89  esp.print("AT+CWJAP=\"");            // AT+CWJAP="ad","şifre" / AT+CWJAP="ssid","password"
90  esp.print(WIFI_SSID);
91  esp.print("\",\"");
92  esp.print(WIFI_PASS);
93  esp.println("\"");
94  if (!waitFor("OK", 20000)) {
95    Serial.println(F("\nWi-Fi baglanamadi / Wi-Fi failed"));
96  }
97
98  sendAT("AT+CIPMUX=1", "OK", 2000);         // sunucu için çoklu bağlantı / multiple connections
99  sendAT("AT+CIPSERVER=1,80", "OK", 2000);   // 80 portunda sunucu / server on port 80
100  sendAT("AT+CIFSR", "OK", 2000);            // IP adresini yaz / print the IP address
101}
102
103void loop() {
104  while (esp.available()) {            // ESP-01'den gelenleri satır satır oku / read line by line
105    char c = esp.read();
106    if (c == '\n') {
107      line[lineLen] = '\0';
108      handleLine();
109      lineLen = 0;
110    } else if (c != '\r' && lineLen < sizeof(line) - 1) {
111      line[lineLen++] = c;
112    }
113  }
114}

Así funciona el código: cuando un navegador se conecta, el ESP-01 pasa la petición al Arduino con el formato +IPD,0,384:GET /on HTTP/1.1, donde 0 es el número de conexión y 384 la cantidad de bytes recibidos. El Arduino busca "GET /on" o "GET /off" en esa línea y ajusta el LED. Cuando llega la línea vacía que marca el final de la petición, anuncia con AT+CIPSEND=0,longitud cuántos bytes va a enviar, manda la página cuando el módulo muestra el signo ">" y cierra la conexión con AT+CIPCLOSE tras la respuesta "SEND OK". Hemos hecho la página corta a propósito: los 2 KB de RAM del Uno no dan para textos HTML largos y un solo CIPSEND puede enviar como mucho 2048 bytes. En proyectos más complejos, una librería como WiFiEspAT te evita gestionar los comandos AT a mano.

Programar el ESP-01 directamente: el método de GPIO0 a GND

El ESP8266 que hay dentro del ESP-01, con su procesador de 32 bits a 80 MHz, es mucho más potente que un Arduino Uno. Si tu proyecto solo tiene un relé, un sensor o un LED, no necesitas ningún Arduino: subes el programa directamente al ESP-01. Al arrancar, el ESP8266 mira el nivel de los pines GPIO0, GPIO2 y GPIO15 para decidir qué hacer. En la placa del ESP-01, GPIO15 ya está conectado a GND y GPIO2 debe quedar en HIGH, así que el modo de arranque lo decide solo GPIO0:

GPIO0GPIO2GPIO15Modo de arranqueMensaje de arranque a 74880 baudios
HIGH (al aire)HIGHLOWFuncionamiento normal: arranca el programa de la flashboot mode:(3,x)
LOW (GND)HIGHLOWModo programación (descarga por UART)boot mode:(1,x) y waiting for host
Pin del ESP-01ConexiónNota
VCCSalida del regulador de 3,3 VEl pin de 3,3 V del USB-TTL casi nunca basta
GNDGND del USB-TTL y del reguladorTodo con tierra común
TXRXD del USB-TTLConexión cruzada
RXTXD del USB-TTLEl jumper debe estar en 3,3 V
EN (CH_PD)3,3 VDirecto o con 10 kΩ
RSTSin conectar (a GND un instante para reiniciar)Opcional: a 3,3 V con 10 kΩ
GPIO0GNDSolo durante la carga; luego desconéctalo
GPIO2Sin conectarDebe estar en HIGH al arrancar
  1. En el Arduino IDE abre Archivo > Preferencias y añade https://arduino.esp8266.com/stable/package_esp8266com_index.json en el campo "URLs adicionales de gestor de placas".
  2. En el Gestor de placas busca esp8266 e instala el paquete de ESP8266 Community.
  3. En Herramientas > Placa elige Generic ESP8266 Module. Pon Flash Size en 1MB (FS:64KB OTA:~470KB) para el ESP-01S, o en una de las opciones de 512KB para el antiguo ESP-01 azul.
  4. Pon el jumper del adaptador USB-TTL en 3,3 V, cablea el módulo según la tabla de arriba y deja GPIO0 conectado a GND.
  5. Quita y vuelve a dar alimentación al módulo, o toca un instante RST con GND; el módulo arranca ahora en modo programación.
  6. Elige el puerto del USB-TTL en Herramientas > Puerto y sube el código. Para la primera prueba sirve Archivo > Ejemplos > ESP8266 > Blink; en el ESP-01S el LED azul está en GPIO2.
  7. Cuando aparezca "Hard resetting via RTS pin...", desconecta GPIO0 de GND y reinicia el módulo. Si GPIO0 sigue en GND, tu programa no se ejecuta y el módulo vuelve a arrancar en modo programación.
Para programar más cómodo puedes usar un adaptador USB para ESP-01 con un CH340 y un AMS1117; el módulo se enchufa directamente. Algunos de estos adaptadores tienen un interruptor UART/PROG; en los modelos sin él tendrás que soldar un pulsador o un jumper entre GPIO0 y GND. Si no tienes un USB-TTL, puedes conectar el pin RESET del Arduino Uno a GND y usar el chip USB de la placa como puente; en ese caso se conecta TX con TX y RX con RX, y el nivel de 5 V hay que reducirlo igualmente. Más detalles en el artículo del convertidor USB-TTL.

Control de relé con GPIO0 y GPIO2: el módulo relé ESP-01S

Los pines de uso general del ESP-01 son GPIO0 y GPIO2, pero los dos deben estar en HIGH durante el arranque. Por eso, lo que conectes a ellos no debe tirar del pin a LOW mientras la placa arranca. La solución más segura es una conexión activa en LOW: al arrancar el pin está en HIGH y el relé sigue apagado, y cuando tu programa pone el pin en LOW el relé se activa. El módulo relé ESP-01S que se vende ya montado está diseñado justo así: se alimenta con 5 V, su regulador genera 3,3 V para el ESP-01S y GPIO0 maneja, a través de un transistor, un relé con contactos de 10 A 250 V AC. En las placas v4.0 y posteriores el relé se activa con GPIO0 en LOW; las antiguas v1.0 pueden necesitar una pequeña modificación para funcionar con el ESP-01S, así que comprueba la versión de tu placa.

Módulo relé de 5 V
Un relé permite encender y apagar una lámpara de 230 V con una pequeña señal de control; en la placa de relé ESP-01S ese relé va conectado al pin GPIO0 del ESP-01.
C++ (Arduino IDE)
1#include <ESP8266WiFi.h>
2#include <ESP8266WebServer.h>
3#include <ESP8266mDNS.h>
4
5const char* ssid = "AgAdi";            // Wi-Fi adın / your Wi-Fi name
6const char* password = "Sifre123";     // Wi-Fi şifren / your Wi-Fi password
7
8const int RELAY_PIN = 0;               // ESP-01S röle kartında GPIO0 / GPIO0 on the ESP-01S relay board
9const int RELAY_ON = LOW;              // çoğu kartta LOW = çeker; tersse değiştir / LOW = on, swap if yours is inverted
10const int RELAY_OFF = HIGH;
11
12ESP8266WebServer server(80);
13bool relayOn = false;
14
15void sendPage() {
16  String html = F("<!DOCTYPE html><html><head><meta charset='utf-8'>"
17                  "<meta name='viewport' content='width=device-width,initial-scale=1'>"
18                  "<title>ESP-01</title></head>"
19                  "<body style='font-family:sans-serif;text-align:center'>"
20                  "<h1>ESP-01 Röle / Relay</h1><p><b>");
21  html += relayOn ? "AÇIK / ON" : "KAPALI / OFF";
22  html += F("</b></p><p><a href='/on'><button>AÇ / ON</button></a> "
23            "<a href='/off'><button>KAPAT / OFF</button></a></p></body></html>");
24  server.send(200, "text/html", html);
25}
26
27void setRelay(bool on) {
28  relayOn = on;
29  digitalWrite(RELAY_PIN, on ? RELAY_ON : RELAY_OFF);
30  server.sendHeader("Location", "/");  // ana sayfaya dön / back to the main page
31  server.send(303, "text/plain", "");
32}
33
34void setup() {
35  digitalWrite(RELAY_PIN, RELAY_OFF);  // önce kapalı seviye / off level first
36  pinMode(RELAY_PIN, OUTPUT);
37  Serial.begin(115200);
38
39  WiFi.mode(WIFI_STA);
40  WiFi.begin(ssid, password);
41  while (WiFi.status() != WL_CONNECTED) {
42    delay(500);
43    Serial.print('.');
44  }
45  Serial.println();
46  Serial.println(WiFi.localIP());      // bu adresi tarayıcıda aç / open this address in a browser
47  MDNS.begin("esp01");                 // ya da http://esp01.local / or http://esp01.local
48
49  server.on("/", sendPage);
50  server.on("/on", []() { setRelay(true); });
51  server.on("/off", []() { setRelay(false); });
52  server.begin();
53}
54
55void loop() {
56  server.handleClient();
57  MDNS.update();
58}

Después de subir el código al ESP-01S con el método anterior, coloca el módulo en la placa de relé y aliméntala con 5 V. Puedes leer la dirección IP en el Monitor Serie con el USB-TTL conectado o buscarla en la lista de dispositivos de tu router; desde un ordenador compatible con mDNS también funciona http://esp01.local. Si quieres añadir una entrada, como un pulsador, el mejor pin es GPIO3 (RX), porque su nivel no importa en el arranque. En ese caso usa Serial.begin(115200, SERIAL_8N1, SERIAL_TX_ONLY) para abrir el puerto serie solo en modo transmisión.

Si vas a conectar la tensión de red a los contactos del relé, cablea todo sin corriente, no dejes contactos al descubierto y mete el circuito en una caja aislante. Aunque el relé ponga 10 A, las pistas de cobre de las placas pequeñas pueden no soportar esa corriente; no manejes cargas de más de unos cientos de vatios con este módulo. Más detalles en ¿Qué es un módulo relé?

ESP-01 con la Raspberry Pi Pico (MicroPython)

También puedes dar conexión inalámbrica a una Raspberry Pi Pico sin Wi-Fi con un ESP-01. Como la Pico funciona a 3,3 V, no hace falta divisor de tensión: el RX del ESP-01 va a GP0 (UART0 TX) y su TX a GP1 (UART0 RX). La UART por hardware de la Pico lee 115200 baudios sin problema, así que tampoco necesitas cambiar la velocidad del módulo; si ya la bajaste a 9600 en la sección del Uno, pon también baudrate a 9600 en el código. Ejecuta el código MicroPython de abajo con Thonny; el módulo se conecta a la red, muestra su dirección IP y lista las redes cercanas cada 30 segundos. Si tienes una Pico W, es más fácil usar su Wi-Fi integrado; mira el artículo del servidor web Wi-Fi con Pico W.

MicroPython
1from machine import UART, Pin
2import time
3
4# GP0 (TX) -> ESP-01 RX, GP1 (RX) <- ESP-01 TX
5uart = UART(0, baudrate=115200, tx=Pin(0), rx=Pin(1))
6
7def at(cmd, timeout=2000):
8    uart.write(cmd + "\r\n")                   # her komut \r\n ile biter / every command ends with \r\n
9    start = time.ticks_ms()
10    resp = b""
11    while time.ticks_diff(time.ticks_ms(), start) < timeout:
12        if uart.any():
13            resp += uart.read()
14            if b"OK" in resp or b"ERROR" in resp or b"FAIL" in resp:
15                break
16    print(cmd, "->", resp)                     # cevabı göster / show the reply
17    return resp
18
19at("ATE0")                                     # komut yankısını kapat / turn off echo
20at("AT")                                       # OK gelmeli / should answer OK
21at("AT+CWMODE=1")                              # istemci modu / station mode
22at('AT+CWJAP="AgAdi","Sifre123"', 20000)       # Wi-Fi'ye bağlan / join Wi-Fi
23at("AT+CIFSR")                                 # IP adresini sor / ask for the IP
24
25while True:
26    at("AT+CWLAP", 10000)                      # çevredeki ağları tara / scan nearby networks
27    time.sleep(30)

¿ESP-01, NodeMCU o ESP32?

CaracterísticaESP-01NodeMCU (ESP8266)ESP32 DevKit
ChipESP8266ESP8266ESP32 (doble núcleo)
GPIO utilizables4 (dos son TX/RX)Unos 11Unos 25
Entrada analógicaNinguna1 (A0)18 canales, 12 bits
Programación por USBNo, necesita USB-TTLSíSí
AlimentaciónSolo 3,3 VUSB 5 V o VINUSB 5 V o VIN
BluetoothNoNoSí (Classic y BLE)
Tamaño24,8 × 14,3 mmPlaca para protoboardPlaca para protoboard
Ideal paraDar Wi-Fi a un Arduino, un relé o un sensorEmpezar con Wi-Fi, varios sensoresProyectos con muchos pines y Bluetooth

Las grandes ventajas del ESP-01 son su tamaño y su precio; es ideal para añadir Wi-Fi a un proyecto Arduino que ya tienes o para hacer inalámbrico un relé o un sensor. Pero como no tiene USB, cambiar cables, montar un regulador y poner GPIO0 a GND en cada carga resulta pesado. No tiene entrada analógica y, como GPIO16 no está accesible, despertar del deep sleep por temporizador no funciona si no sueldas un cable fino a una patilla del chip. Si planeas un proyecto con pilas, introduce el consumo medio en la calculadora de duración de batería para ver cuántos días aguantará. Si estás aprendiendo o necesitas más de tres pines, el NodeMCU ESP8266 ofrece el mismo chip con USB y regulador. Si necesitas Bluetooth, más pines y más potencia, el ESP32 es la opción correcta; comparamos las placas en ¿Arduino o ESP32?

Ideas de proyectos con el ESP-01

  • Enchufe inteligente Wi-Fi: enciende y apaga una lámpara desde el móvil con el módulo relé ESP-01S y el código de arriba; añade un temporizador para que se encienda sola por la tarde.
  • Sensor de temperatura inalámbrico: conecta un sensor DS18B20 a GPIO2; la resistencia pull-up de 4,7 kΩ de la línea de datos también da el nivel HIGH que necesita el arranque.
  • Monitor de humedad y temperatura: muestra las lecturas de un DHT11 en una página web que abres en el móvil.
  • Aviso de movimiento: conecta un sensor PIR a GPIO3 y envía un mensaje de Telegram al detectar movimiento; el método es muy parecido al del artículo del bot de Telegram con ESP32.
  • Wi-Fi para un proyecto Arduino: envía con comandos AT las lecturas de una estación meteorológica hecha con el Uno a un programa de tu ordenador o a un servidor.
  • Mando de puerta de garaje: conecta los contactos del relé en paralelo con el pulsador del motor de la puerta y ábrela desde el móvil.

Errores comunes y cómo solucionarlos

SíntomaCausa probableSolución
"Failed to connect to ESP8266: Timed out waiting for packet header"El módulo no está en modo programación o TX y RX están invertidosConecta GPIO0 a GND, quita y vuelve a dar alimentación, conecta TX a RXD y RX a TXD
Caracteres raros en el Monitor SerieLa velocidad no coincide; los mensajes de arranque van a 74880 baudiosPrueba 115200 y 9600; elige 74880 para ver el mensaje de arranque
No responde nada al escribir ATFin de línea incorrecto, TX y RX invertidos o EN sin conectarElige Both NL & CR, cruza las líneas y conecta EN a 3,3 V
El módulo se reinicia sin parar, se cae al conectarse al Wi-FiCorriente insuficienteUsa un AMS1117-3.3 aparte y un condensador de 100–470 µF, acorta los cables
Respuesta "busy p..."Se envió un comando antes de que terminara el anteriorEspera OK o ERROR después de cada comando
+CWJAP:3 y FAILRed no encontrada (red de 5 GHz o nombre incorrecto)Usa una red de 2,4 GHz y cuida mayúsculas y minúsculas
El módulo se calienta mucho y el LED no se enciendeSe aplicaron 5 V a VCC o se invirtieron VCC y GNDCorta la alimentación enseguida; lo más probable es que el módulo esté dañado
El módulo no arranca con el relé conectadoEl circuito de GPIO0 o GPIO2 tira del pin a LOW al arrancarUsa una conexión activa en LOW o pasa la entrada a GPIO3
El módulo relé de 5 V nunca se apagaUn HIGH de 3,3 V no apaga del todo el optoacoplador del módulo de 5 VUsa un módulo relé compatible con 3,3 V o un driver con transistor
Los comandos AT dejan de funcionar tras subir código desde el Arduino IDETu programa sustituyó al firmware ATVuelve a grabar el firmware AT de Espressif con esptool o Flash Download Tool
Para saber si el módulo arranca de verdad, pon el Monitor Serie a 74880 baudios y reinicia el módulo. Si ves boot mode:(3,x) ha arrancado en modo normal; boot mode:(1,x) significa modo programación. Si no ves nada, el problema está en la alimentación, en la conexión de EN o en las líneas TX-RX.

A pesar de su pequeño tamaño, el ESP-01 es un módulo estupendo para aprender todos los conceptos básicos del Wi-Fi: direcciones IP, conexiones TCP, servidores web y comunicación serie. Si algo no funciona, revisa primero la alimentación, luego las líneas TX-RX y el nivel de GPIO0; la gran mayoría de los problemas están en esos tres puntos. En la app BlueGrays encontrarás proyectos como conexión Wi-Fi, servidor web, mDNS, actualización inalámbrica (OTA) e iluminación inteligente con relé, con esquemas y código paso a paso.

Preguntas frecuentes

¿El ESP-01 funciona con 5V?

No. El ESP-01 funciona entre 3,0 y 3,6 V, y conectar 5 V a su pin VCC puede dañarlo para siempre. Si quieres alimentarlo con los 5 V del Arduino, pon en medio un regulador como el AMS1117-3.3 y baja a 3,3 V la señal de 5 V de la línea TX del Uno con un divisor de tensión.

¿Se puede alimentar el ESP-01 con el pin de 3.3V del Arduino?

No es recomendable. El pin de 3,3 V del Uno da oficialmente 50 mA, mientras que el ESP-01 consume 170 mA al transmitir y más de 300 mA en picos breves. Aunque el módulo responda a los comandos AT, se reinicia al conectarse a la red; usa un regulador de 3,3 V aparte que dé al menos 300–500 mA.

¿Por qué mi ESP-01 no responde a los comandos AT?

Las causas más habituales son una velocidad incorrecta, el fin de línea del Monitor Serie sin poner en Both NL & CR, TX y RX sin cruzar y el pin EN (CH_PD) sin conectar a 3,3 V. Si antes se subió un programa al módulo desde el Arduino IDE, el firmware AT se ha borrado y tendrás que volver a grabarlo.

¿Se borra el firmware AT al subir código de Arduino al ESP-01?

Sí. El programa que subes desde el Arduino IDE se escribe en la flash en lugar del firmware AT y el módulo deja de entender los comandos AT. Para volver al modo AT, graba de nuevo el firmware AT para ESP8266 de Espressif con esptool o Flash Download Tool en las direcciones que correspondan al tamaño de flash de tu módulo.

¿Qué diferencia hay entre el ESP-01 y el ESP-01S?

El chip y los pines son los mismos. El ESP-01S suele ser negro, tiene 1 MB de flash, no tiene LED de alimentación y su LED azul está en GPIO2. El antiguo ESP-01 azul tiene 512 KB de flash, un LED rojo de alimentación siempre encendido y un LED azul en la línea TX.

¿Cuál es la velocidad por defecto del ESP-01?

La mayoría de los módulos con firmware AT actual vienen a 115200 baudios; los antiguos pueden usar 9600 o 57600. Los primeros mensajes del arranque, en cambio, salen a 74880 baudios. Si usas SoftwareSerial en un Arduino Uno, bajar la velocidad de forma permanente a 9600 con AT+UART_DEF=9600,8,1,0,0 hace que la conexión sea fiable.

Ver todos los proyectos
Conexión Wi-Fi STA con ESP32 (con pantalla LCD)
#127Avanzado

Conexión Wi-Fi STA con ESP32 (con pantalla LCD)

En este proyecto, conectamos el ESP32 a la red Wi-Fi doméstica en modo Station (STA) de forma segura y tolerante a fallos. Separamos el SSID y la contraseña en el archivo secrets.h para evitar que se filtren a Git, configuramos un mecanismo de reconexión automática y mostramos el nivel de señal RSSI y la dirección IP en una pantalla LCD I2C. El LED interno actúa como indicador de estado.

4.4(21)
34
Servidor web asíncrono ESP32 (con indicación de IP en la pantalla LCD)
#129Avanzado

Servidor web asíncrono ESP32 (con indicación de IP en la pantalla LCD)

En este proyecto, convertimos el ESP32 en un servidor web asíncrono que puedes controlar desde tu teléfono o tu ordenador, siempre que estén conectados a la misma red Wi-Fi. Gracias a la biblioteca ESPAsyncWebServer, el servidor puede procesar varias solicitudes al mismo tiempo (a diferencia del clásico WebServer.h, que se bloquea con una sola solicitud).

4.8(16)
26
ESP32 mDNS: Acceso al dispositivo mediante bluegrays-esp.local (con pantalla LCD)
#131Avanzado
Premium

ESP32 mDNS: Acceso al dispositivo mediante bluegrays-esp.local (con pantalla LCD)

En este proyecto, al añadir el servicio mDNS (Multicast DNS) al ESP32, permitimos el acceso mediante un nombre de host legible, como bluegrays-esp.local, en lugar de una dirección IP. Aunque la IP asignada por el DHCP cambie, siempre podrás acceder al dispositivo con el mismo nombre. Además, al ejecutar un pequeño servidor web en él, enviamos comandos de control de los LED desde el navegador mediante la dirección http://bluegrays-esp.local/. En la pantalla LCD I2C se muestran el nombre de ho

4.8(14)
23
Actualización OTA del ESP32 — Instalación inalámbrica del firmware (con pantalla LCD)
#132Avanzado
Premium

Actualización OTA del ESP32 — Instalación inalámbrica del firmware (con pantalla LCD)

En este proyecto aprenderás a instalar un nuevo firmware en el ESP32 a través de Wi-Fi, sin necesidad de un cable USB. Con la biblioteca ArduinoOTA, el ESP32 se hace visible en la red y aparece automáticamente como bluegrays-ota en la pestaña «Puerto de red» del IDE de Arduino. La primera instalación se realiza mediante USB; a partir de ahí, todas las actualizaciones se realizan de forma inalámbrica, lo cual es una característica fundamental para los dispositivos de campo. En la pantalla LCD

4.6(14)
22
ESP32: hora real desde Internet con NTP
#128Avanzado
Premium

ESP32: hora real desde Internet con NTP

El ESP32 se conecta a Wi-Fi y obtiene la hora real con precisión de milisegundos desde servidores NTP (Network Time Protocol). Gracias a configTzTime(), se aplica automáticamente la zona horaria de Turquía (TRT, UTC+3) y el cambio DST se gestiona mediante la cadena POSIX TZ. La hora se muestra en el monitor serie y en una pantalla LCD I2C opcional. configTzTime() inicia el servicio SNTP; se realizan resincronizaciones periódicas mientras hay acceso a la red, y el reloj del sistema sigue avan

4.5(13)
21
Iluminación Inteligente ESP32 (PIR + LDR + Relé + OLED)
#141Avanzado
Premium

Iluminación Inteligente ESP32 (PIR + LDR + Relé + OLED)

¡Convierte tu pasillo, baño o despensa en iluminación inteligente con ESP32! Utilizando un sensor de movimiento PIR, un sensor de luz LDR y un módulo de relé, construimos el escenario clásico "la luz se enciende cuando se detecta movimiento en la oscuridad" — si el ambiente ya está iluminado, el movimiento NO activa la luz, ahorrando energía durante el día. La luz permanece encendida durante 30 segundos; si el movimiento continúa, el temporizador se reinicia y la luz permanece encendida más tiem

4.3(6)
11
Encender y apagar una bombilla de 220 V con un botón
#20Avanzado
Premium

Encender y apagar una bombilla de 220 V con un botón

¿Quieres encender y apagar una bombilla de verdad de casa con un pequeño botón? Cada vez que lo pulsas, el Arduino acciona un relé y la bombilla se enciende; si vuelves a pulsar, se apaga. El relé es

4.5(33)
44
Comunicación unidireccional entre 2 Arduino
#57Intermedio
Premium

Comunicación unidireccional entre 2 Arduino

Haces que dos Arduino hablen por un solo cable: pulsas el botón de uno y se enciende el LED del otro, vuelves a pulsar y se apaga. La placa que envía avisa del botón con un mensaje corto, y la que rec

4.4(37)
50