ESP-01 com Arduino: comandos AT, programação e relé
Ligue o ESP-01 (ESP8266) ao Arduino: 8 pinos, alimentação de 3,3 V, Wi-Fi com comandos AT, programação com GPIO0 no GND, o módulo relé ESP-01S e os erros mais comuns.
O ESP-01 é um módulo minúsculo (24,8 × 14,3 mm) e muito barato, construído em torno do chip Wi-Fi ESP8266. Ao ligar o ESP-01 a um Arduino, você adiciona Wi-Fi a uma placa sem conexão sem fio, como um Uno ou um Nano, com apenas alguns fios. O módulo vem de fábrica com o firmware de comandos AT: o Arduino envia pela serial comandos de texto curtos como “AT+CWJAP”, e o ESP-01 se conecta à rede, envia e recebe dados. Se preferir, você também pode programar o ESP-01 como um microcontrolador independente, sem Arduino nenhum; o processador dele é muito mais rápido que o do Uno.
Neste guia você vai aprender os 8 pinos do ESP-01, por que ele precisa obrigatoriamente de uma alimentação de 3,3 V forte, como usar comandos AT com um Arduino Uno, como criar uma página web que liga um LED pelo celular, como programar o módulo direto com um adaptador USB-TTL (o método do GPIO0 no GND), como controlar uma lâmpada com o módulo relé ESP-01S e como usá-lo com um Raspberry Pi Pico. No final, você encontra as soluções para os erros mais comuns e quando um NodeMCU ou um ESP32 é a melhor escolha.

O que é o ESP-01 e como ele funciona?
O ESP-01 é o primeiro e menor módulo que a Ai-Thinker projetou em torno do chip ESP8266EX. A placa traz o chip, um cristal de 26 MHz, a memória flash que guarda o programa e as configurações e uma antena de PCB em zigue-zague; não há porta USB, regulador de tensão nem botão. Por isso o ESP-01 não pode ser ligado direto ao computador: você mesmo precisa fornecer a alimentação e a conexão serial. Dá para usar o módulo de duas formas: como modem Wi-Fi (o firmware AT está instalado e o Arduino envia comandos) ou como microcontrolador independente (você carrega seu próprio programa pela Arduino IDE e o firmware AT é apagado). A maioria dos módulos vendidos hoje é a versão preta, o ESP-01S.
| Característica | Valor |
|---|---|
| Chip | ESP8266EX (Tensilica L106, 32 bits) |
| Velocidade do clock | 80 MHz (pode subir para 160 MHz) |
| Memória flash | ESP-01: 512 KB, ESP-01S: 1 MB |
| RAM | Cerca de 80 KB de RAM de dados; ~50 KB livres para o seu programa com o Wi-Fi conectado |
| Wi-Fi | 802.11 b/g/n, apenas 2,4 GHz, antena de PCB |
| Tensão de operação | 3,0–3,6 V (recomendado 3,3 V) |
| Corrente | 70–80 mA em média conectado, ~170 mA transmitindo, picos acima de 300 mA |
| Corrente em deep sleep | Cerca de 20 µA (chip) |
| GPIO utilizáveis | 4: GPIO0, GPIO2, GPIO1 (TX), GPIO3 (RX) |
| Entrada analógica | Nenhuma (o pino do ADC não está disponível na barra) |
| Tamanho | 24,8 × 14,3 mm |
| Firmware de fábrica | Firmware de comandos AT (geralmente 115200 baud) |
ESP-01 ou ESP-01S: as diferenças
| Característica | ESP-01 | ESP-01S |
|---|---|---|
| Cor da placa | Geralmente azul | Preta |
| Memória flash | 512 KB (1 MB nas versões pretas mais recentes) | 1 MB |
| LED de alimentação | Vermelho, sempre aceso | Não tem |
| LED azul | Na linha TX (GPIO1), pisca quando há envio de dados | No GPIO2, acende quando o pino está em LOW |
| Pinagem | 8 pinos | Os mesmos 8 pinos, totalmente compatível |
| Consumo | Alguns mA a mais por causa do LED de alimentação | Menor, melhor para projetos com bateria |
Pinagem do ESP-01: a função dos 8 pinos
O ESP-01 tem 8 pinos em uma barra 2×4, e só quatro deles podem ser usados como entradas e saídas. Nem toda placa tem os nomes dos pinos impressos, então compare seu módulo com a pinagem do vendedor antes de ligá-lo: inverter VCC e GND queima o módulo em segundos. Veja a função de cada pino e como ele é ligado na operação normal:
| Pino | Função | Ligação na operação normal |
|---|---|---|
| VCC | Entrada de alimentação de 3,3 V | Uma fonte de 3,3 V forte (pelo menos 300 mA) |
| GND | Terra | GND comum com o Arduino e a fonte |
| TX (GPIO1) | Saída de dados serial | Na linha RX do Arduino |
| RX (GPIO3) | Entrada de dados serial | Na linha TX do Arduino (com divisor de tensão em placas de 5 V) |
| EN (CH_PD) | Habilita o chip | No 3,3 V (direto ou com 10 kΩ) |
| RST | Reinicia o chip quando em LOW | Desconectado ou puxado para 3,3 V com 10 kΩ |
| GPIO0 | Seleciona o modo de inicialização, depois E/S de uso geral | HIGH (desconectado) na inicialização; GND durante a gravação |
| GPIO2 | E/S de uso geral (LED azul no ESP-01S) | Precisa ficar em HIGH na inicialização |
Consumo de corrente: por que o pino 3,3 V do Arduino não basta
A maioria dos problemas que queimam o ESP-01 ou o deixam reiniciando sem parar vem da alimentação. Conectado ao Wi-Fi, o módulo consome em média 70–80 mA e cerca de 170 mA transmitindo; picos curtos na inicialização e na conexão à rede podem passar de 300 mA. Já o pino 3,3 V do Arduino Uno é especificado oficialmente para apenas 50 mA. Um ESP-01 alimentado por esse pino muitas vezes responde ao comando “AT”, mas no momento em que tenta se conectar a uma rede a tensão despenca e o módulo reinicia, o que parece um bug de software. A solução é um regulador AMS1117-3.3 (1 A) alimentado com 5 V, mais um capacitor eletrolítico de 100–470 µF entre os pinos VCC e GND do módulo. Você vê como os reguladores funcionam no artigo sobre o regulador de tensão 7805.
| Fonte de alimentação | Serve? | Observação |
|---|---|---|
| Pino 3,3 V do Arduino Uno | Não | Oficialmente 50 mA; o módulo reinicia ao se conectar ao Wi-Fi |
| Pino 3,3 V de um adaptador USB-TTL | Geralmente não | O regulador interno do chip costuma fornecer 50–100 mA |
| Regulador AMS1117-3.3 (entrada de 5 V) | Sim | Até 1 A; 10 µF na saída, 100–470 µF perto do módulo |
| Adaptador USB para ESP-01 | Sim | Tem um CH340 e um AMS1117; o módulo encaixa direto |
| 2 pilhas AA (3 V) | No limite | Conforme as pilhas descarregam, a tensão cai abaixo de 3 V e o módulo fica instável |
| Bateria Li-ion de uma célula (3,7–4,2 V) | Não diretamente | Passa do limite de 3,6 V; precisa de um regulador de 3,3 V de baixa queda (LDO) |
Ligando o ESP-01 ao Arduino Uno (para comandos AT)
A única porta serial de hardware do Arduino Uno (D0 e D1) é compartilhada com a conexão USB. Por isso o jeito mais prático é ligar o ESP-01 aos pinos D2 e D3 com a biblioteca SoftwareSerial: você não precisa desconectar o ESP-01 ao carregar código no Uno, e o Monitor Serial fica livre para depuração. O Raspberry Pi Pico já funciona com 3,3 V, então não precisa de divisor:
| Pino do ESP-01 | Arduino Uno | Raspberry Pi Pico | Observação |
|---|---|---|---|
| VCC | Saída do AMS1117-3.3 | AMS1117-3.3 ou 3V3(OUT) | O pino 3,3 V do Uno não basta; a saída 3V3 do Pico é recomendada até 300 mA |
| GND | GND | GND | Regulador, placa e módulo com GND comum |
| TX | D2 | GP1 (UART0 RX) | Ligação direta |
| RX | D3 (com divisor de 1 kΩ / 2 kΩ) | GP0 (UART0 TX) | No Pico não precisa de divisor |
| EN (CH_PD) | 3,3 V | 3,3 V | Direto ou com 10 kΩ |
| RST | Desconectado | Desconectado | Se quiser, puxe para 3,3 V com 10 kΩ |
| GPIO0 | Desconectado | Desconectado | Não ligue ao GND na operação normal |
| GPIO2 | Desconectado | Desconectado | Precisa ficar em HIGH na inicialização |
Para baixar o sinal de 5 V que sai do pino D3 do Uno, ligue um resistor de 1 kΩ do D3 ao RX do ESP-01 e um resistor de 2 kΩ do RX do ESP-01 ao GND. A saída fica em 5 × 2 / (1 + 2) = 3,33 V; com 2,2 kΩ no lugar de 2 kΩ você obtém 3,44 V, e as duas opções são seguras. Você pode calcular outros valores de resistor com a ferramenta Divisor de tensão. No sentido contrário não precisa de divisor: os 3,3 V do pino TX do ESP-01 ficam acima do limiar de 3 V que o Uno lê como HIGH. Explicamos os fundamentos da comunicação serial em detalhes no artigo sobre comunicação serial UART.
Primeiro teste: enviando comandos AT pelo Monitor Serial
- Carregue no Uno o sketch de ponte abaixo; na primeira tentativa, defina ESP_BAUD como 115200, porque a maioria dos módulos vem com essa velocidade (os mais antigos podem usar 9600).
- Abra o Monitor Serial em 115200 baud e defina o final de linha como Ambos, NL e CR; sem isso o módulo nunca sabe que o comando terminou.
- Digite AT e envie; você deve ver OK. Se aparecerem caracteres estranhos, as velocidades não estão batendo.
- A SoftwareSerial não consegue ler de forma confiável a 115200, então baixe a velocidade do módulo para 9600 de forma permanente com AT+UART_DEF=9600,8,1,0,0. Mesmo que a resposta pareça embaralhada, o comando costuma chegar.
- Mude ESP_BAUD no sketch para 9600, carregue de novo e repita o comando AT; a resposta OK agora deve aparecer limpa.
- Confirme que o módulo está funcionando bem lendo a versão do firmware com AT+GMR e listando as redes Wi-Fi próximas com AT+CWLAP.
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}Os comandos AT mais úteis do ESP-01
| Comando | O que faz | Exemplo de resposta |
|---|---|---|
| AT | Testa a conexão | OK |
| AT+RST | Reinicia o módulo | OK ... ready |
| AT+GMR | Mostra a versão do firmware | AT version:... SDK version:... OK |
| AT+UART_DEF=9600,8,1,0,0 | Muda o baud rate de forma permanente | OK |
| AT+CWMODE=1 | Modo estação; 2 = ponto de acesso, 3 = os dois | OK |
| AT+CWLAP | Lista as redes Wi-Fi próximas | +CWLAP:(3,"AgAdi",-58,...) |
| AT+CWJAP="AgAdi","Sifre123" | Conecta a uma rede Wi-Fi | WIFI CONNECTED, WIFI GOT IP, OK |
| AT+CIFSR | Mostra o endereço IP recebido | +CIFSR:STAIP,"192.168.1.45" |
| AT+CIPMUX=1 | Ativa múltiplas conexões (obrigatório para servidor) | OK |
| AT+CIPSERVER=1,80 | Inicia um servidor TCP na porta 80 | OK |
| AT+CIPSTART=0,"TCP","192.168.1.10",80 | Conecta a um servidor pela conexão 0 | 0,CONNECT e OK |
| AT+CIPSEND=0,20 | Envia 20 bytes pela conexão 0 | > ... SEND OK |
| AT+CIPCLOSE=0 | Fecha a conexão 0 | 0,CLOSED e OK |
Controlando um LED pelo celular com Arduino Uno e ESP-01
Agora vamos transformar os comandos AT em um programa. O sketch abaixo conecta o ESP-01 à sua rede, abre um pequeno servidor web na porta 80 e mostra o endereço IP no Monitor Serial. Quando você digita esse endereço no navegador de um celular conectado ao mesmo Wi-Fi, abre uma página com dois botões; eles ligam e desligam o LED integrado no pino 13 do Uno. Ligue um módulo relé no lugar do LED e o mesmo método controla uma lâmpada. Antes de carregar, confira se você ajustou a velocidade do módulo para 9600 no passo anterior.
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}Veja como o código funciona: quando um navegador se conecta, o ESP-01 repassa a requisição ao Arduino como +IPD,0,384:GET /on HTTP/1.1, em que 0 é o número da conexão e 384 é a quantidade de bytes recebidos. O Arduino procura “GET /on” ou “GET /off” nessa linha e ajusta o LED. Quando chega a linha em branco que marca o fim da requisição, ele informa quantos bytes vai enviar com AT+CIPSEND=0,tamanho, envia a página assim que o módulo mostra o sinal “>” e fecha a conexão com AT+CIPCLOSE depois da resposta “SEND OK”. Deixamos a página curta de propósito: os 2 KB de RAM do Uno não dão conta de textos HTML longos, e um único CIPSEND envia no máximo 2048 bytes. Em projetos mais complexos, uma biblioteca como a WiFiEspAT poupa você de gerenciar os comandos AT por conta própria.
Programando o ESP-01 diretamente: o método do GPIO0 no GND
O ESP8266 dentro do ESP-01, com seu processador de 32 bits a 80 MHz, é muito mais potente que um Arduino Uno. Se o seu projeto tem só um relé, um sensor ou um LED, você não precisa de Arduino nenhum: basta carregar o programa direto no ESP-01. Ao inicializar, o ESP8266 verifica os níveis de GPIO0, GPIO2 e GPIO15 para decidir o que fazer. Na placa do ESP-01, o GPIO15 já está ligado ao GND e o GPIO2 precisa ficar em HIGH, então só o GPIO0 define o modo de inicialização:
| GPIO0 | GPIO2 | GPIO15 | Modo de inicialização | Mensagem de inicialização a 74880 baud |
|---|---|---|---|---|
| HIGH (desconectado) | HIGH | LOW | Execução normal: o programa da flash é iniciado | boot mode:(3,x) |
| LOW (GND) | HIGH | LOW | Modo de programação (download por UART) | boot mode:(1,x) e waiting for host |
| Pino do ESP-01 | Ligação | Observação |
|---|---|---|
| VCC | Saída do regulador de 3,3 V | O pino 3,3 V do adaptador USB-TTL geralmente não basta |
| GND | GND do USB-TTL e GND do regulador | Tudo com terra comum |
| TX | RXD do USB-TTL | Ligação cruzada |
| RX | TXD do USB-TTL | O jumper precisa estar em 3,3 V |
| EN (CH_PD) | 3,3 V | Direto ou com 10 kΩ |
| RST | Desconectado (rapidamente no GND para reiniciar) | Se quiser, puxe para 3,3 V com 10 kΩ |
| GPIO0 | GND | Só durante o carregamento; desconecte depois |
| GPIO2 | Desconectado | Precisa ficar em HIGH na inicialização |
- Na Arduino IDE, abra Arquivo > Preferências e adicione https://arduino.esp8266.com/stable/package_esp8266com_index.json ao campo “URLs do Gerenciador de Placas Adicionais”.
- No Gerenciador de Placas, busque esp8266 e instale o pacote ESP8266 Community.
- Escolha Generic ESP8266 Module em Ferramentas > Placa. Defina Flash Size como 1MB (FS:64KB OTA:~470KB) para o ESP-01S, ou uma das opções de 512KB para o antigo ESP-01 azul.
- Coloque o jumper do adaptador USB-TTL em 3,3 V, ligue o módulo conforme a tabela acima e mantenha o GPIO0 conectado ao GND.
- Corte a alimentação do módulo e ligue de novo, ou encoste rapidamente o RST no GND; agora o módulo inicializa no modo de programação.
- Selecione a porta do adaptador USB-TTL em Ferramentas > Porta e carregue o sketch. Arquivo > Exemplos > ESP8266 > Blink é um bom primeiro teste; no ESP-01S o LED azul fica no GPIO2.
- Quando aparecer “Hard resetting via RTS pin...”, desconecte o GPIO0 do GND e reinicie o módulo. Se o GPIO0 continuar no GND, seu programa não roda e o módulo inicializa de novo no modo de programação.
Controle de relé com GPIO0 e GPIO2: o módulo relé ESP-01S
Os pinos de uso geral do ESP-01 são o GPIO0 e o GPIO2, mas os dois precisam estar em HIGH durante a inicialização. Então, o que você ligar neles não pode puxar o pino para LOW enquanto a placa inicia. A solução mais segura é uma ligação ativa em LOW: o pino está em HIGH na inicialização, então o relé fica desligado, e quando seu programa coloca o pino em LOW o relé liga. O módulo relé ESP-01S pronto foi projetado exatamente assim: funciona com 5 V, o regulador da placa gera 3,3 V para o ESP-01S e o GPIO0 aciona, por meio de um transistor, um relé com contatos de 10 A 250 V AC. Nas placas v4.0 e posteriores, o relé liga quando o GPIO0 está em LOW; as placas antigas v1.0 podem precisar de uma pequena modificação para funcionar com o ESP-01S, então confira a versão da sua placa.

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}Depois de carregar o sketch no ESP-01S com o método acima, encaixe o módulo na placa de relé e alimente a placa com 5 V. Você pode ler o endereço IP no Monitor Serial enquanto o adaptador USB-TTL estiver conectado, ou encontrá-lo na lista de dispositivos conectados do roteador; em um computador com suporte a mDNS, http://esp01.local também funciona. Se quiser adicionar uma entrada, como um botão, o melhor pino é o GPIO3 (RX), porque o nível dele não importa na inicialização. Nesse caso, use Serial.begin(115200, SERIAL_8N1, SERIAL_TX_ONLY) para abrir a porta serial só no modo de transmissão.
ESP-01 com o Raspberry Pi Pico (MicroPython)
Você também pode adicionar conexão sem fio a um Raspberry Pi Pico sem Wi-Fi usando um ESP-01. Como o Pico funciona com 3,3 V, não precisa de divisor de tensão: o RX do ESP-01 vai no GP0 (UART0 TX) e o TX vai no GP1 (UART0 RX). A UART de hardware do Pico lê 115200 baud com tranquilidade, então você também não precisa mudar a velocidade do módulo; se já tiver baixado para 9600 na parte do Uno, defina baudrate como 9600 no código também. Rode o código MicroPython abaixo no Thonny; o módulo se conecta à sua rede, mostra o endereço IP e lista as redes próximas a cada 30 segundos. Se você tiver um Pico W, o Wi-Fi integrado é mais fácil de usar; veja o artigo sobre o servidor web Wi-Fi com Pico W.
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 ou ESP32?
| Característica | ESP-01 | NodeMCU (ESP8266) | ESP32 DevKit |
|---|---|---|---|
| Chip | ESP8266 | ESP8266 | ESP32 (dual-core) |
| GPIO utilizáveis | 4 (dois são TX/RX) | Cerca de 11 | Cerca de 25 |
| Entrada analógica | Nenhuma | 1 (A0) | 18 canais, 12 bits |
| Programação por USB | Não, precisa de adaptador USB-TTL | Sim | Sim |
| Alimentação | Apenas 3,3 V | USB 5 V ou VIN | USB 5 V ou VIN |
| Bluetooth | Não | Não | Sim (Classic e BLE) |
| Tamanho | 24,8 × 14,3 mm | Placa que encaixa na protoboard | Placa que encaixa na protoboard |
| Melhor para | Adicionar Wi-Fi a um Arduino, um único relé ou sensor | Começar com Wi-Fi, alguns sensores | Projetos com muitos pinos e Bluetooth |
As maiores vantagens do ESP-01 são o tamanho e o preço; ele é ideal para adicionar Wi-Fi a um projeto Arduino que já existe ou deixar sem fio um único relé ou sensor. Mas, como não tem USB, trocar fios, montar um regulador e ligar o GPIO0 no GND a cada carregamento fica cansativo. Ele não tem entrada analógica e, como o GPIO16 não está disponível na barra, o despertar temporizado do deep sleep não funciona a menos que você solde um fio fino em um dos pinos do chip. Se estiver planejando um projeto alimentado por bateria, coloque a corrente média na calculadora Autonomia da bateria para ver quantos dias ela vai durar. Se você ainda está aprendendo ou precisa de mais de três pinos, o NodeMCU ESP8266 oferece o mesmo chip com USB e regulador. Se precisar de Bluetooth, mais pinos e mais poder de processamento, o ESP32 é a escolha certa; comparamos as placas em Arduino ou ESP32?
Ideias de projetos com o ESP-01
- Tomada inteligente Wi-Fi: ligue e desligue uma lâmpada pelo celular com o módulo relé ESP-01S e o sketch acima; adicione um temporizador para que ela acenda sozinha à noite.
- Sensor de temperatura sem fio: ligue um sensor DS18B20 ao GPIO2; o resistor de pull-up de 4,7 kΩ na linha de dados também garante o nível HIGH necessário na inicialização.
- Monitor de umidade e temperatura: mostre as leituras de um DHT11 em uma página web que você abre no celular.
- Alerta de movimento: ligue um sensor PIR ao GPIO3 e envie uma mensagem no Telegram quando houver movimento; o método é muito parecido com o do artigo sobre o bot do Telegram com ESP32.
- Wi-Fi para um projeto Arduino: envie as leituras de uma estação meteorológica feita com um Uno para um programa no seu computador ou para um servidor usando comandos AT.
- Controle de portão de garagem: ligue os contatos do relé em paralelo com o botão do motor do portão e abra o portão pelo celular.
Erros comuns e como resolvê-los
| Sintoma | Causa provável | Solução |
|---|---|---|
| "Failed to connect to ESP8266: Timed out waiting for packet header" (falha ao conectar ao ESP8266) | O módulo não está no modo de programação, ou TX e RX estão invertidos | Ligue o GPIO0 ao GND, desligue e religue a alimentação do módulo, ligue TX no RXD e RX no TXD |
| Caracteres estranhos no Monitor Serial | Baud rate diferente; as mensagens de inicialização saem a 74880 baud | Teste 115200 e 9600; escolha 74880 para ver a mensagem de inicialização |
| Nenhuma resposta ao AT | Final de linha errado, TX e RX invertidos ou EN desconectado | Escolha Ambos, NL e CR, cruze as linhas, ligue o EN no 3,3 V |
| O módulo reinicia sem parar, cai ao se conectar ao Wi-Fi | Corrente insuficiente | Use um AMS1117-3.3 separado e um capacitor de 100–470 µF, encurte os fios |
| Resposta "busy p..." (ocupado) | Um novo comando foi enviado antes de o anterior terminar | Espere OK ou ERROR depois de cada comando |
| +CWJAP:3 e FAIL | Rede não encontrada (rede de 5 GHz ou nome errado) | Use uma rede de 2,4 GHz e preste atenção em maiúsculas e minúsculas |
| O módulo esquenta muito, o LED não acende | 5 V aplicados no VCC, ou VCC e GND invertidos | Corte a alimentação imediatamente; o módulo muito provavelmente está danificado |
| O módulo não inicializa com o relé conectado | O circuito no GPIO0 ou GPIO2 puxa o pino para LOW na inicialização | Use uma ligação ativa em LOW ou passe a entrada para o GPIO3 |
| O módulo relé de 5 V nunca desliga | Um HIGH de 3,3 V não desliga totalmente o optoacoplador do módulo de 5 V | Use um módulo relé compatível com 3,3 V ou um driver com transistor |
| Os comandos AT param de funcionar depois de carregar pela Arduino IDE | Seu programa substituiu o firmware AT | Grave de novo o firmware AT da Espressif com o esptool ou o Flash Download Tool |
Apesar do tamanho pequeno, o ESP-01 é um ótimo módulo para aprender todos os conceitos básicos de Wi-Fi: endereços IP, conexões TCP, servidores web e comunicação serial. Se algo não funcionar, verifique primeiro a alimentação, depois as linhas TX-RX e o nível do GPIO0; a grande maioria dos problemas se resume a esses três pontos. No app BlueGrays você encontra projetos como conexão Wi-Fi, servidor web, mDNS, atualização sem fio (OTA) e iluminação inteligente com relé, com esquemas do circuito e códigos passo a passo.
Perguntas frequentes
O ESP-01 funciona com 5V?
Não. O ESP-01 funciona entre 3,0 e 3,6 V, e ligar 5 V no pino VCC pode danificá-lo de forma permanente. Se quiser alimentá-lo com o 5 V do Arduino, coloque um regulador como o AMS1117-3.3 no meio e baixe o sinal de 5 V da linha TX do Uno para 3,3 V com um divisor de tensão.
Posso alimentar o ESP-01 pelo pino 3.3V do Arduino?
Não é recomendado. O pino 3,3 V do Uno é especificado oficialmente para 50 mA, enquanto o ESP-01 consome 170 mA transmitindo e mais de 300 mA em picos curtos. Mesmo que o módulo responda aos comandos AT, ele reinicia ao se conectar à rede; use um regulador de 3,3 V separado que forneça pelo menos 300–500 mA.
Por que meu ESP-01 não responde aos comandos AT?
As causas mais comuns são baud rate errado, final de linha do Monitor Serial diferente de Ambos, NL e CR, TX e RX não cruzados e o pino EN (CH_PD) desconectado do 3,3 V. Se algum programa já foi carregado no módulo pela Arduino IDE, o firmware AT foi apagado e você precisa gravá-lo de novo.
Carregar código pela Arduino IDE apaga o firmware AT do ESP-01?
Sim. O programa que você carrega pela Arduino IDE é gravado na flash no lugar do firmware AT, e o módulo deixa de entender comandos AT. Para voltar ao modo AT, grave o firmware ESP8266 AT da Espressif com o esptool ou o Flash Download Tool, nos endereços que correspondem ao tamanho da flash do seu módulo.
Qual é a diferença entre o ESP-01 e o ESP-01S?
O chip e a pinagem são os mesmos. O ESP-01S geralmente é preto, tem 1 MB de flash, não tem LED de alimentação e o LED azul fica no GPIO2. O antigo ESP-01 azul tem 512 KB de flash, um LED vermelho de alimentação sempre aceso e um LED azul na linha TX.
Qual é o baud rate padrão do ESP-01?
A maioria dos módulos com firmware AT atual vem com 115200 baud; os mais antigos podem usar 9600 ou 57600. Já as primeiras mensagens mostradas na inicialização saem a 74880 baud. Se você usa SoftwareSerial em um Arduino Uno, baixar a velocidade para 9600 de forma permanente com AT+UART_DEF=9600,8,1,0,0 deixa a comunicação confiável.
Projetos para montar depois desta leitura
Ver todos os projetos
Conexão Wi-Fi STA com ESP32 e display LCD
Neste projeto, conectamos o ESP32 à rede Wi-Fi de casa no modo estação (STA), de forma segura e tolerante a falhas. Guardamos o SSID e a senha em um arquivo secrets.h separado para evitar que sejam expostos no Git, configuramos um mecanismo de reconexão automática e exibimos o nível de sinal RSSI e o endereço IP em um display LCD I2C. O LED integrado funciona como indicador de status. É um gerenciador de conexão pronto para uso em produção.

Servidor web assíncrono com ESP32 (IP no LCD)
Neste projeto, transformamos o ESP32 em um servidor web assíncrono que você pode controlar pelo celular ou computador na mesma rede Wi-Fi. Com a biblioteca ESPAsyncWebServer, o servidor processa várias requisições ao mesmo tempo (ao contrário do WebServer.h tradicional, que bloqueia a execução ao processar uma requisição). Você poderá abrir o endereço IP do ESP32 no navegador e clicar nos botões ON/OFF (as rotas /on e /off) para ligar e desligar o LED conectado ao GPIO 5.

ESP32 mDNS: acesso via bluegrays-esp.local (com display LCD)
Neste projeto, adicionamos o serviço mDNS (Multicast DNS) ao ESP32 para acessar o dispositivo por um nome de host fácil de ler, como bluegrays-esp.local, em vez de um endereço IP. Mesmo que o IP atribuído pelo DHCP mude, você pode acessar o dispositivo pelo mesmo nome. Também executamos um pequeno servidor web no dispositivo para enviar comandos de controle do LED pelo navegador no endereço http://bluegrays-esp.local/.

Atualização OTA no ESP32 — firmware sem fio (com display LCD)
Neste projeto, você aprende a carregar um novo firmware no ESP32 por Wi-Fi, sem cabo USB. Com a biblioteca ArduinoOTA, o ESP32 fica visível na rede e aparece automaticamente como bluegrays-ota na aba "Porta de rede" do Arduino IDE. A primeira carga é feita por USB, e todas as atualizações seguintes são sem fio — um recurso essencial para dispositivos em campo. O LCD I2C mostra o estado do Wi-Fi, o IP, o nome do host, a porcentagem de envio por OTA e as mensagens de erro em turco e inglês.

Hora exata pela internet com ESP32 e NTP
O ESP32 se conecta ao Wi-Fi e obtém a hora exata com precisão de milissegundos de servidores NTP (Network Time Protocol). Com a função configTzTime(), o fuso horário configurado (TRT, UTC+3 neste exemplo) é aplicado automaticamente, e as mudanças nos países que adotam horário de verão são gerenciadas automaticamente por uma string POSIX TZ. A hora é exibida tanto no Monitor Serial quanto em um LCD I2C opcional.

Iluminação inteligente com ESP32 (PIR + LDR + relé + OLED)
Transforme a iluminação do corredor, banheiro ou despensa em iluminação inteligente com ESP32! Com um sensor de movimento PIR, um sensor de luz LDR e um módulo relé, montamos o cenário clássico de "acender a luz ao detectar movimento no escuro" — se o ambiente já estiver claro, o movimento NÃO aciona a luz, economizando energia durante o dia. A luz fica acesa por 30 segundos; se o movimento continuar, o temporizador reinicia e a luz permanece acesa por mais tempo.

Ligar e desligar uma lâmpada de 220V com botão
Quer ligar e desligar uma lâmpada de casa com um pequeno botão? Ao pressionar o botão, o Arduino aciona um relé e a lâmpada acende; ao pressionar novamente, ela apaga. O relé funciona como intermediár

Comunicação unidirecional entre 2 Arduinos
Faça dois Arduinos conversarem por um único fio: ao pressionar o botão de um, o LED do outro acende; ao pressionar de novo, ele apaga. A placa transmissora informa que o botão foi pressionado com uma
Mais artigos
App BlueGrays
Monte este circuito passo a passo pelo celular
Esquema do circuito, código e lista de componentes em uma só tela. Mais de 200 projetos com Arduino, ESP32 e Pico prontos para montar.
Escaneie com seu celular
Aponte a câmera para o código para abrir a loja de aplicativos do seu celular.
ou abrir a loja

