Guia Completo: Dispositivo IoT com ESP8266-01 e Arduino Nano
Componentes e Materiais
| Arduino Nano R3 | 1 |
| Módulo ESP8266 ESP-01 | 1 |
| Módulo Relé 2 Canais | 1 |
| LEDs | 2 |
| Protoboard | 1 |
| Jumpers | 1 set |
| Resistores 1kΩ (2x), 2.2kΩ (1x) | 3 |
| PCB Personalizada (PCBWay) | 1 (opcional) |
Ferramentas Necessárias
- Ferro de solda
- Solda sem chumbo
- Fluxo de solda
Aplicações e Serviços Online
- Arduino IDE
- VS Code (opcional)
- Autodesk Eagle (opcional, para PCB)
Sobre o Projeto
Introdução
Vamos construir um dispositivo que conecta à internet e permite controle remoto de eletrodomésticos via Wi-Fi. Usaremos Arduino Nano com módulo ESP8266-01.
Cenário de Funcionamento
Painel de Controle (Web): Página web simples (HTML, CSS, jQuery) com botões para ligar/desligar cargas.
Hardware Embarcado: A página envia comandos ao ESP8266-01 (servidor web) que repassa ao Arduino via serial. O Arduino aciona relés.
Primeiros Passos com ESP8266-01
O Arduino Nano não tem Wi-Fi nativo. O ESP8266-01 adiciona essa capacidade via comunicação serial. É barato (~US$ 1,50), tem comunidade forte, MCU integrado (pode operar sozinho) e 2 GPIOs.
Pinout do ESP8266-01
- VCC: 3.3V (nunca 5V!)
- GND: Terra
- CH_PD: Enable do chip (HIGH para boot)
- RST: Reset (LOW ativo)
- GPIO0, GPIO2: I/O de propósito geral
- Tx: Conecta ao Rx do Arduino
- Rx: Conecta ao Tx do Arduino
Configuração do ESP8266-01
O ESP comunica via serial (pinos 0/1 do Arduino), mas esses pinos são necessários para debug. Solução: biblioteca SoftwareSerial nos pinos 2/3.
Problema: ESP vem de fábrica a 115.200 baud, muito alto para SoftwareSerial. Precisamos reconfigurar para 9600 baud usando AT Commands.
Alterando a Velocidade de Comunicação
- Carregue sketch vazio no Arduino
- Conecte ESP8266 aos pinos 0/1 (Hardware Serial) temporariamente
- Serial Monitor a 115.200 baud, "Both NL & CR"
- Envie
AT→ deve responderOK - Envie
AT+UART_DEF=9600,8,1,0,0(ouAT+CIOBAUD=9600) - Resposta
OKconfirma mudança - Altere Serial Monitor para 9600 baud e teste
ATnovamente
Conectando ao Wi-Fi
AT+CWJAP="SEU_SSID","SUA_SENHA"
Sucesso retorna WIFI CONNECTED e WIFI GOT IP.
Conceitos Básicos: Internet, Cliente/Servidor
Internet = fio (fibra, cobre, satélite). Dois computadores conectados comunicam-se. Servidor conectado diretamente (IP fixo, ex: 172.217.171.228 = google.com). Cliente conectado via ISP.
Nosso caso: Navegador (Cliente) → Requisição HTTP → ESP8266 (Servidor) → Arduino → Ação.
Construindo a Página Web
Estrutura (HTML)
<!DOCTYPE html>
<html>
<head>
<title>Smart Home Control Panel</title>
</head>
<body style="background-color: seagreen; color: seashell; text-align: center;">
<h1>Smart Home Control Panel</h1>
<h4>Sorry But I'm a Meme Addict!</h4>
<img src="dogMeme.jpg" width="400" height="400">
<br>
<button id="111" class="button">LAMP ON</button>
<br>
<button id="110" class="button">LAMP OFF</button>
</body>
</html>
Estilo (CSS)
Incluído inline no <body> e <button> (margem 10px).
Funcionalidade (jQuery)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script>
$(".button").click(function() {
var p = $(this).attr('id'); // pega id do botão (111 ou 110)
$.get("https://192.168.1.4:80/", { pin: p }); // GET para o ESP
// IMPORTANTE: Substitua pelo IP do seu ESP8266!
});
</script>
Lógica dos IDs: 111 = pino 11, estado 1 (ON); 110 = pino 11, estado 0 (OFF). O Arduino separa: pinNumber = 11, pinState = 1/0.
Conectando a Carga (Teste com LEDs)
LED no pino 11 (ânodo) via resistor 1kΩ ao GND. Teste antes de usar relés.
Código do Arduino
#include <SoftwareSerial.h>
SoftwareSerial esp8266(2, 3); // Rx=2, Tx=3
#define SERIAL_SPEED 9600
#define DEBUG true
int redLED = 12;
int blueLED = 11;
void setup() {
pinMode(redLED, OUTPUT);
pinMode(blueLED, OUTPUT);
digitalWrite(redLED, LOW);
digitalWrite(blueLED, HIGH);
Serial.begin(SERIAL_SPEED);
esp8266.begin(SERIAL_SPEED);
InitWifiModule();
digitalWrite(blueLED, LOW);
}
void loop() {
if (esp8266.available()) {
if (esp8266.find("+IPD,")) {
delay(1000);
int connectionId = esp8266.read() - 48;
esp8266.find("pin=");
int pinNumber = (esp8266.read() - 48) * 10;
pinNumber += (esp8266.read() - 48);
int statusLed = (esp8266.read() - 48);
digitalWrite(pinNumber, statusLed);
Serial.println(connectionId);
Serial.print(pinNumber); Serial.print(" "); Serial.println(statusLed);
String closeCommand = "AT+CIPCLOSE=";
closeCommand += connectionId;
closeCommand += "\r\n";
sendData(closeCommand, 1000, DEBUG);
}
}
}
String sendData(String command, const int timeout, boolean debug) {
String response = "";
esp8266.print(command);
long int time = millis();
while ((time + timeout) > millis()) {
while (esp8266.available()) {
char c = esp8266.read();
response += c;
}
}
if (debug) Serial.print(response);
return response;
}
void InitWifiModule() {
sendData("AT+RST\r\n", 2000, DEBUG);
sendData("AT+CWJAP=\"SEU_SSID\",\"SUA_SENHA\"\r\n", 2000, DEBUG);
delay(3000);
sendData("AT+CWMODE=1\r\n", 1500, DEBUG);
delay(1000);
sendData("AT+CIFSR\r\n", 1500, DEBUG);
delay(1000);
sendData("AT+CIPMUX=1\r\n", 1500, DEBUG);
delay(1000);
sendData("AT+CIPSERVER=1,80\r\n", 1500, DEBUG);
}
Não esqueça: Coloque seu SSID e senha na linha do AT+CWJAP.
Como Funciona
- Carregue o código no Arduino
- Abra Serial Monitor: verifique "OK" (conectado) ou "FAIL/ERRO" (verifique credenciais)
- Abra a página web e controle os LEDs
Controlando Cargas de Alta Tensão (Relés)
Relé é chave mecânica acionada por sinal de baixa potência (5V/0V) para comutar circuitos de alta potência. Módulo 2 canais: IN1/IN2 nos pinos 11/12 do Arduino. COM do relé num lado da carga; outro lado em NO (normalmente aberto) ou NC (normalmente fechado).
Página Web Atualizada (2 Cargas)
<button id="111" class="button">Blue LED ON</button>
<button id="110" class="button">Blue LED OFF</button>
<br>
<button id="121" class="button">Red LED ON</button>
<button id="120" class="button">Red LED OFF</button>
IDs: 11x = pino 11, 12x = pino 12; último dígito = estado.
Tornando Profissional: PCB
Projetado no Autodesk Eagle. Arquivos open-source: PCBWay Project. Peça sua PCB clicando "Add to cart".
Solução de Problemas
- Verifique porta 80 no jQuery:
https://IP:80/ - PC e ESP na mesma rede Wi-Fi
- IP correto do ESP no código jQuery
- Cargas nos pinos 11 e 12 do Arduino
- Salve e recarregue a página web após alterações
Conclusão
Aprendemos: página web (HTML/CSS/jQuery), controle wireless de carga AC via painel web, uso do ESP8266-01 com Arduino. Mais tutoriais em makesomestuff.org.
Códigos Completos
Página Web (HTML)
<!DOCTYPE html> <html> <head> <title>Smart Home System</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> </head>
<body style="background-color: seagreen; color: seashell; text-align: center;">
<h1> Smart Home Control Panel</h1> <h4>Sorry But I'm a Meme Addict!</h4>
<img src="dogMeme.jpg" width="400" height="400"> <br>
<button style="margin: 10px;" id="111" class="button">Blue LED ON</button>
<button id="110" class="button">Blue LED OFF</button> <br>
<button style="margin:10px;" id="121" class="button"> Red LED ON</button>
<button id="120" class="button">Red LED OFF</button>
<script> $(".button").click(function () { var p = $(this).attr('id'); $.get("https://192.168.1.4:80/", { pin: p }); }); </script> </body> </html>
Código Final do Arduino
#include <SoftwareSerial.h>
SoftwareSerial esp8266(2,3);
#define serialCommunicationSpeed 9600
#define DEBUG true
int redLED =12; int blueLED =11;
void setup() {
pinMode(redLED,OUTPUT); pinMode(blueLED,OUTPUT);
digitalWrite(redLED,LOW); digitalWrite(blueLED,HIGH);
Serial.begin(serialCommunicationSpeed);
esp8266.begin(serialCommunicationSpeed);
InitWifiModule(); digitalWrite(blueLED,LOW);
}
void loop() {
if(esp8266.available()) {
if(esp8266.find("+IPD,")) {
delay(1000);
int connectionId = esp8266.read()-48;
esp8266.find("pin=");
int pinNumber = (esp8266.read()-48)*10;
pinNumber += (esp8266.read()-48);
int statusLed = (esp8266.read()-48);
digitalWrite(pinNumber, statusLed);
Serial.println(connectionId); Serial.print(pinNumber); Serial.print(" "); Serial.println(statusLed);
String closeCommand = "AT+CIPCLOSE="; closeCommand+=connectionId; closeCommand+="\r\n";
sendData(closeCommand,1000,DEBUG);
}
}
}
String sendData(String command, const int timeout, boolean debug) {
String response = ""; esp8266.print(command);
long int time = millis();
while((time+timeout) > millis()) {
while(esp8266.available()) { char c = esp8266.read(); response+=c; }
}
if(debug) Serial.print(response); return response;
}
void InitWifiModule() {
sendData("AT+RST\r\n",2000,DEBUG);
sendData("AT+CWJAP=\"SEU_SSID\",\"SUA_SENHA\"\r\n",2000,DEBUG); delay(3000);
sendData("AT+CWMODE=1\r\n",1500,DEBUG); delay(1500);
sendData("AT+CIFSR\r\n",1500,DEBUG); delay(1500);
sendData("AT+CIPMUX=1\r\n",1500,DEBUG); delay(1500);
sendData("AT+CIPSERVER=1,80\r\n",1500,DEBUG);
}
Esquemáticos
Disponíveis na seção de esquemáticos do projeto original (duas imagens).
Processo de manufatura
- Detector de Idiomas TinyML com Edge Impulse no Arduino Nano 33 BLE Sense
- Construa um Jogo em Tempo Real com Giroscópio: Arduino Nano + Sensor MPU-6050
- Dados Digital com Arduino: Gere Números Aleatórios 1-6 em LCD 16x2
- Construa um Dispositivo de Levitação Ultrassônica com Arduino – Guia Passo a Passo
- Construa um Voltímetro Inteligente com Arduino e Smartphone – Projeto DIY Fácil
- Monitor de Frequência Cardíaca IoT em Tempo Real com Arduino e MAX30100
- Construa um Pote Inteligente IoT com ESP8266, Arduino e Sensor Ultrassônico – Monitoramento em Tempo Real
- Medição de Distância em Tempo Real com Sonar Arduino e Visualização no Processing
- Controle Suave de Brilho de LED com Bolt IoT e Arduino UNO
- Controle sua TV com Alexa via Arduino IoT Cloud – Guia Passo a Passo