Modulo IOT Preparação
Vamos a nossa primeira etapa!
Vamos preparar o ambiente de desenvolvimento:
Instalação da IDE
Baixe a ide do Arduino neste link: ArduinoIDE na publicação deste post a versão era 2.3.4.
Instalação das placas
Abra a ide o Arduino, clique em Arquivo depois em Preferências.

Clique sobre o icone marcado e adicione estas duas URL’s. Importante, como a propria IDE avisa, uma por linha.
https://arduino.esp8266.com/stable/package_esp8266com_index.json
https://dl.espressif.com/dl/package_esp32_index.json
Após inserir as duas clique em OK nas duas janelas.
Agora clique no icone do Board Manager ou Gerenciador de placas:

Na caixa de pesquisa, digite esp8266 e instale a versão, na data do post era a 3.2.1:

No caso da sua ide estará escrito instalar, preferencialmente use a mesma versão que estou usando, este processo demora um pouco.
Após a finalização vamos instalar a placa esp32:
Na caixa de pesquisa, digite esp32 e instale a versão, na data do post era a 3.1.1, instale a versão esp32 por Espressid Systems:

Novamente espere até finalizar, este demora um pouco mais que a anterior.
Instalação das bibliotecas
Para desenvolver este projeto vamos necessitar de algumas bibliotecas externas, porem elas estão na ide disponiveis para baixar.
Clique sobre o Icone do gerenciador de Bibliotecas:

ESPAsyncWebServer V3.7.2
Na caixa de pesquisa digite: ESPAsyncWebServer, no momento deste post esta na versão 3.7.2.

Baixe a versão por ESP32Async.
A biblioteca ESPAsyncWebServer é uma ferramenta poderosa e eficiente para desenvolvedores que trabalham com microcontroladores ESP32 e ESP8266. Ela permite a criação de servidores web assíncronos, o que significa que o servidor é capaz de lidar com múltiplas conexões simultaneamente sem bloquear a execução de outras tarefas no dispositivo. Isso é especialmente útil em aplicações IoT, onde o microcontrolador precisa gerenciar requisições HTTP enquanto realiza outras operações, como leitura de sensores ou controle de atuadores.
Principais características:
- Assíncrono: Não bloqueia a execução do código principal, permitindo multitarefas.
- Suporte a WebSockets: Facilita a comunicação bidirecional em tempo real entre o cliente e o servidor.
- Fácil integração com o ESPAsyncTCP (ESP8266) e AsyncTCP (ESP32): Bibliotecas que gerenciam a conexão TCP de forma assíncrona.
- Rotas dinâmicas: Permite definir rotas para diferentes URLs e métodos HTTP (GET, POST, etc.).
- Suporte a upload de arquivos: Ideal para aplicações que necessitam de atualizações de firmware ou envio de dados.
Em resumo, a ESPAsyncWebServer é uma escolha excelente para projetos que exigem um servidor web robusto e responsivo em dispositivos com recursos limitados, como os microcontroladores da família ESP.
ESPAsyncTCP V2.0.0
Na caixa de pesquisa digite: ESPAsyncTCP , no momento deste post esta na versão 2.0.0.

Baixe a versão por ESP32Async.
A biblioteca ESPAsyncTCP é uma implementação assíncrona do protocolo TCP para microcontroladores ESP8266, projetada para trabalhar em conjunto com outras bibliotecas, como a ESPAsyncWebServer. Ela permite que o dispositivo gerencie conexões de rede de forma não bloqueante, ou seja, sem parar a execução de outras tarefas enquanto espera por dados ou processa requisições. Isso é fundamental para aplicações que exigem alta responsividade e multitarefa, como em sistemas IoT.
Principais características:
- Assíncrona: Gerência as conexões TCP sem bloquear o loop principal do programa, permitindo que o dispositivo execute outras operações simultaneamente.
- Eficiente: Ideal para dispositivos com recursos limitados, como o ESP8266, pois consome menos memória e processamento em comparação com implementações síncronas.
- Integração com bibliotecas de alto nível: Funciona como base para bibliotecas como a ESPAsyncWebServer, que dependem de comunicação TCP assíncrona para criar servidores web robustos.
- Suporte a eventos: Permite a execução de callbacks para eventos como recebimento de dados, desconexão de clientes e erros de conexão.
Em resumo, a ESPAsyncTCP é uma biblioteca essencial para desenvolvedores que precisam de comunicação TCP eficiente e não bloqueante em projetos com ESP8266, especialmente quando combinada com outras bibliotecas assíncronas para criar soluções IoT avançadas e responsivas.
AsyncTCP V3.3.7
Na caixa de pesquisa digite: AsyncTCP, no momento deste post esta na versão 3.3.7.

Baixe a versão por ESP32Async.
A biblioteca AsyncTCP é uma implementação assíncrona do protocolo TCP para o ESP32, projetada para permitir comunicações de rede eficientes e não-bloqueantes. Ela serve como base para outras bibliotecas de alto nível, como a ESPAsyncWebServer, garantindo que o microcontrolador possa lidar com múltiplas conexões simultâneas sem travar a execução de outras tarefas. Essa característica é essencial para projetos IoT que exigem multitarefa, como servidores web, clientes de API ou sistemas em tempo real.
Principais características:
- Comunicação não-bloqueante: Opera em segundo plano, liberando o loop principal do ESP32 para outras tarefas enquanto gerencia conexões TCP.
- Alto desempenho: Suporta múltiplas conexões simultâneas com baixo overhead de memória e processamento.
- Suporte a eventos: Utiliza callbacks para notificar sobre eventos como recebimento de dados (
onData
), novas conexões (onClient
) ou erros (onError
), facilitando a programação reativa. - Integração com bibliotecas assíncronas: Funciona como base para bibliotecas como ESPAsyncWebServer e AsyncMQTTClient, habilitando servidores web ou clientes MQTT eficientes.
- Estabilidade: Mais robusta que soluções bloqueantes, evitando travamentos em cenários de alta carga ou conexões instáveis.
Comparação com ESPAsyncTCP:
Enquanto a ESPAsyncTCP é a versão para o ESP8266, a AsyncTCP foi desenvolvida especificamente para o ESP32, aproveitando seu hardware mais potente (como dual-core e maior memória RAM). Ambas seguem o mesmo princípio de operação assíncrona, mas a AsyncTCP é otimizada para as capacidades do ESP32.
ArduinoJson V7.3.0
Na caixa de pesquisa digite: ArduinoJson, no momento deste post esta na versão 7.3.0.

Baixe a versão por Benoit Blanchon.
A biblioteca ArduinoJson é uma ferramenta extremamente popular e eficiente para manipulação de dados no formato JSON (JavaScript Object Notation) em microcontroladores, como Arduino, ESP32 e ESP8266. JSON é um formato leve e de fácil leitura para troca de dados, amplamente utilizado em aplicações IoT e comunicação com APIs web.
Principais características:
- Leve e eficiente: Projetada para funcionar em dispositivos com recursos limitados, como microcontroladores, sem consumir muita memória ou processamento.
- Fácil de usar: Oferece uma API intuitiva para serialização (conversão de dados em JSON) e desserialização (conversão de JSON em dados utilizáveis no código).
- Suporte a diferentes tipos de dados: Trabalha com strings, números, arrays, objetos aninhados e outros tipos de dados comuns em JSON.
- Compatibilidade com APIs web: Ideal para integrar dispositivos IoT com serviços RESTful, APIs de terceiros ou enviar/receber dados de servidores.
- Documentação extensa: Possui uma documentação clara e exemplos práticos que facilitam a implementação em projetos.
Em resumo, a ArduinoJson é uma biblioteca essencial para desenvolvedores que precisam manipular dados JSON em projetos com microcontroladores, seja para comunicação com APIs, armazenamento de configurações ou troca de informações entre dispositivos. Sua eficiência e facilidade de uso a tornam uma das bibliotecas mais recomendadas para trabalhar com JSON no ecossistema Arduino e ESP.
Finalmente terminamos nosso ambiente de desenvolvimento.
Vamos para o codigo de teste do arduino:
// bibliotecas especificas de cada placa
#ifdef ESP8266
#include <ESP8266WiFi.h>
#include <ESPAsyncTCP.h>
#include <ESP8266mDNS.h>
#include <FS.h>
#elif defined(ESP32)
#include <Arduino.h>
#include <AsyncTCP.h>
#include <WiFi.h>
#include <ESPmDNS.h>
#include "FS.h"
#endif
// bibliotecas globais
#include <ESPAsyncWebServer.h>
#include <LittleFS.h>
#include <ArduinoJson.h>
// Nome do modulo
char hostname[] = "MODULOCURSO";
// instancia o servidor
AsyncWebServer server(80);
// roda uma vez, usado na configuração
void setup() {
// inicializa a serial
Serial.begin(9600);
// seta o modo de operação para estação
WiFi.mode(WIFI_STA);
// seta o nome do dispositivo na rede, fica mais facil para encontrar no roteador
WiFi.setHostname(hostname);
// adiciona a rede e a senha do wifi
WiFi.begin("SUA REDE WIFI", "SUA SENHA DO WIFI");
// debug da conexão de wifi
Serial.println();
Serial.print("Conectando");
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.print(".");
}
Serial.println("Conectado!");
Serial.print("IP:");
Serial.println(WiFi.localIP().toString());
Serial.print("http://");
Serial.print(hostname);
Serial.println(".local");
Serial.print("http://");
Serial.println(WiFi.localIP().toString());
// inicia o sistema de arquivos
LittleFS.begin();
// serve os arquivos estaticos
server.serveStatic("/", LittleFS, "/").setDefaultFile("index.html");
// rota de teste
server.on("/teste", HTTP_GET, [](AsyncWebServerRequest* request) {
request->send(200, "text/html", "<h1>Rota teste funciona!</h1>");
});
// rota de teste do json
server.on("/testejson", HTTP_GET, [](AsyncWebServerRequest* request) {
AsyncResponseStream* response = request->beginResponseStream("application/json");
JsonDocument json;
json["message"] = "Rota testejson funciona!";
serializeJson(json, *response);
request->send(response);
});
// usando o nome do dispositivo para o mDNS
MDNS.begin(hostname);
// adiciona o serviço disponivel
MDNS.addService("http", "tcp", 80);
// inicia o servidor
server.begin();
}
// função main do programa, o loop principal
void loop() {
MDNS.update();
}
Salve este arquivo com o nome que desejar, depois dentro da pasta dele crie uma pasta com o nome de data, assim mesmo, minusculo.
Crie um arquivo index.html e cole este conteudo dentro dele:
<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Pagina de teste</title>
</head>
<body>
<h1>Funciona!</h1>
</body>
</html>
Para enviar este arquivo html para a placa devemos baixar um plugin para a ide do Arduino arduino-littlefs-upload, o manual de instalação esta aqui, resumindo, dentro da pasta do seu usuário, encontre a pasta .arduinoIDE, C:\Users\<username>\.arduinoIDE\plugins\, troque o <username> pelo seu nome de usuário e caso não exista a pasta plugins crie ela e cole o arquivo baixado, após este procedimento deve-se reiniciar a IDE do arduino para que ela encontre o plugin.
Comando para enviar o arquivo html: [Ctrl]
+ [Shift]
+ [P]
, digite na caixa que abriu “Upload LittleFS to Pico/ESP8266/ESP32
“, clique sobre ele ou ENTER para que ele comece a enviar o arquivo, caso de um erro de permissão ou porta ocupada feche o terminal serial e refaça o processo.
Com este exemplo podemos testar se as bibliotecas estão funcionando.