Ir para o conteúdo

Exemplos Práticos

Exemplos práticos demonstrando a integração da biblioteca ESP32HTTPClient em dispositivos embarcados e projetos IoT.


1. Estação Meteorológica

Consulta dados meteorológicos em tempo real, como temperatura, umidade relativa do ar e velocidade do vento para uma coordenada geográfica.

API: Open-Meteo (https://api.open-meteo.com/v1/forecast)

Ver Código
#include <Arduino.h>
#include <WiFi.h>
#include "ESP32HTTPClient.h"

const char* ssid     = "SUA_REDE_WIFI";
const char* password = "SUA_SENHA_WIFI";

// --- Assinaturas para lógica de hardware / específica ---
void exibirClima(float temp, int umidade, float vento); // implementação específica

ESP32HTTPClient weatherClient("https://api.open-meteo.com");

void setup() {
    Serial.begin(115200);
    WiFi.begin(ssid, password);
    while (WiFi.status() != WL_CONNECTED) { delay(500); }
}

void loop() {
    float temperatura = 0.0f;
    int umidade = 0;
    float vento = 0.0f;

    weatherClient.get("/v1/forecast")
        .query("latitude", "-23.5505")
        .query("longitude", "-46.6333")
        .query("current", "temperature_2m,relative_humidity_2m,wind_speed_10m")
        .getBody("current.temperature_2m", &temperatura)
        .getBody("current.relative_humidity_2m", &umidade)
        .getBody("current.wind_speed_10m", &vento);

    if (weatherClient.isSuccess()) {
        exibirClima(temperatura, umidade, vento);
    } else {
        Serial.printf("Erro ao consultar clima: %s (HTTP %d)\n",
                      weatherClient.getLastError(), weatherClient.getStatusCode());
    }

    delay(600000); // Consulta a cada 10 minutos
}

2. Terminal Pokémon

Pesquisa informações de um Pokémon pelo nome ou identificador, obtendo atributos como experiência base, peso, altura e tipo através de parâmetros de rota fluentes.

API: PokéAPI (https://pokeapi.co/api/v2/pokemon/{name})

Ver Código
#include <Arduino.h>
#include <WiFi.h>
#include "ESP32HTTPClient.h"

const char* ssid     = "SUA_REDE_WIFI";
const char* password = "SUA_SENHA_WIFI";

// --- Assinaturas para lógica de hardware / específica ---
void desenharCardPokemon(const char* nome, int altura, int peso, int xp); // implementação específica
const char* obterPokemonSelecionado();                                    // implementação específica

ESP32HTTPClient pokeClient("https://pokeapi.co");

void setup() {
    Serial.begin(115200);
    WiFi.begin(ssid, password);
    while (WiFi.status() != WL_CONNECTED) { delay(500); }
}

void loop() {
    const char* pokemonAlvo = obterPokemonSelecionado();

    char nome[32] = {0};
    int altura = 0;
    int peso = 0;
    int xp = 0;

    pokeClient.get("/api/v2/pokemon/{name}")
        .path("name", pokemonAlvo)
        .getBody("name", nome, sizeof(nome))
        .getBody("height", &altura)
        .getBody("weight", &peso)
        .getBody("base_experience", &xp);

    if (pokeClient.isSuccess()) {
        desenharCardPokemon(nome, altura, peso, xp);
    }

    delay(30000);
}

3. Monitor de Repositório GitHub

Monitora métricas públicas de um repositório no GitHub, incluindo número de estrelas, forks e issues abertas.

API: GitHub REST API (https://api.github.com/repos/{owner}/{repo})

Ver Código
#include <Arduino.h>
#include <WiFi.h>
#include "ESP32HTTPClient.h"

const char* ssid     = "SUA_REDE_WIFI";
const char* password = "SUA_SENHA_WIFI";

// --- Assinaturas para lógica de hardware / específica ---
void atualizarPainelStats(int estrelas, int forks, int issues); // implementação específica

ESP32HTTPClient githubClient("https://api.github.com");

void setup() {
    Serial.begin(115200);
    WiFi.begin(ssid, password);
    while (WiFi.status() != WL_CONNECTED) { delay(500); }

    // A API do GitHub exige o cabeçalho User-Agent
    githubClient.header("User-Agent", "ESP32HTTPClient-Monitor");
}

void loop() {
    int estrelas = 0;
    int forks = 0;
    int issues = 0;

    githubClient.get("/repos/{owner}/{repo}")
        .path("owner", "PedroFnseca")
        .path("repo", "esp32-http-client")
        .getBody("stargazers_count", &estrelas)
        .getBody("forks_count", &forks)
        .getBody("open_issues_count", &issues);

    if (githubClient.isSuccess()) {
        atualizarPainelStats(estrelas, forks, issues);
    }

    delay(300000); // Consulta a cada 5 minutos
}

4. Verificador de Releases do GitHub

Verifica periodicamente a versão da última release lançada em um repositório GitHub para detecção de atualizações de firmware (OTA).

API: GitHub REST API (https://api.github.com/repos/{owner}/{repo}/releases/latest)

Ver Código
#include <Arduino.h>
#include <WiFi.h>
#include "ESP32HTTPClient.h"

const char* ssid          = "SUA_REDE_WIFI";
const char* password      = "SUA_SENHA_WIFI";
const char* versaoCorrente = "v1.0.0";

// --- Assinaturas para lógica de hardware / específica ---
void notificarNovaVersao(const char* novaTag, const char* tituloRelease); // implementação específica

ESP32HTTPClient githubClient("https://api.github.com");

void setup() {
    Serial.begin(115200);
    WiFi.begin(ssid, password);
    while (WiFi.status() != WL_CONNECTED) { delay(500); }

    githubClient.header("User-Agent", "ESP32-OTA-Checker");
}

void loop() {
    char tagRecente[32] = {0};
    char titulo[64] = {0};

    githubClient.get("/repos/{owner}/{repo}/releases/latest")
        .path("owner", "PedroFnseca")
        .path("repo", "esp32-http-client")
        .getBody("tag_name", tagRecente, sizeof(tagRecente))
        .getBody("name", titulo, sizeof(titulo));

    if (githubClient.isSuccess()) {
        if (strcmp(tagRecente, versaoCorrente) != 0) {
            Serial.printf("Nova versao encontrada: %s (Atual: %s)\n", tagRecente, versaoCorrente);
            notificarNovaVersao(tagRecente, titulo);
        }
    }

    delay(3600000); // Checa 1 vez por hora
}

5. Rastreador da ISS

Acompanha a trajetória orbital e as coordenadas geográficas (latitude e longitude) da Estação Espacial Internacional em tempo real.

API: Open Notify (http://api.open-notify.org/iss-now.json)

Ver Código
#include <Arduino.h>
#include <WiFi.h>
#include "ESP32HTTPClient.h"

const char* ssid     = "SUA_REDE_WIFI";
const char* password = "SUA_SENHA_WIFI";

// --- Assinaturas para lógica de hardware / específica ---
void plotarPosicaoISS(float latitude, float longitude); // implementação específica

ESP32HTTPClient issClient("http://api.open-notify.org");

void setup() {
    Serial.begin(115200);
    WiFi.begin(ssid, password);
    while (WiFi.status() != WL_CONNECTED) { delay(500); }
}

void loop() {
    float latitude = 0.0f;
    float longitude = 0.0f;

    issClient.get("/iss-now.json")
        .getBody("iss_position.latitude", &latitude)
        .getBody("iss_position.longitude", &longitude);

    if (issClient.isSuccess()) {
        plotarPosicaoISS(latitude, longitude);
    }

    delay(10000); // Atualiza a cada 10 segundos
}

6. Conversor de Moedas

Consulta taxas de câmbio atualizadas em tempo real e calcula conversões monetárias entre pares de moedas (ex: EUR, USD, BRL).

API: Frankfurter API (https://api.frankfurter.app/latest)

Ver Código
#include <Arduino.h>
#include <WiFi.h>
#include "ESP32HTTPClient.h"

const char* ssid     = "SUA_REDE_WIFI";
const char* password = "SUA_SENHA_WIFI";

// --- Assinaturas para lógica de hardware / específica ---
void exibirCotacao(const char* base, const char* destino, float taxa); // implementação específica

ESP32HTTPClient fxClient("https://api.frankfurter.app");

void setup() {
    Serial.begin(115200);
    WiFi.begin(ssid, password);
    while (WiFi.status() != WL_CONNECTED) { delay(500); }
}

void loop() {
    float taxaUSD = 0.0f;
    float taxaBRL = 0.0f;

    fxClient.get("/latest")
        .query("from", "EUR")
        .query("to", "USD,BRL")
        .getBody("rates.USD", &taxaUSD)
        .getBody("rates.BRL", &taxaBRL);

    if (fxClient.isSuccess()) {
        exibirCotacao("EUR", "USD", taxaUSD);
        exibirCotacao("EUR", "BRL", taxaBRL);
    }

    delay(1800000); // Atualiza a cada 30 minutos
}

7. Curiosidades Aleatórias

Busca e exibe fatos e curiosidades aleatórias para displays de mesa, relógios inteligentes ou painéis interativos.

API: Useless Facts API (https://uselessfacts.jsph.pl/api/v2/facts/random)

Ver Código
#include <Arduino.h>
#include <WiFi.h>
#include "ESP32HTTPClient.h"

const char* ssid     = "SUA_REDE_WIFI";
const char* password = "SUA_SENHA_WIFI";

// --- Assinaturas para lógica de hardware / específica ---
void exibirFatoNoDisplay(const char* textoFato); // implementação específica

ESP32HTTPClient factsClient("https://uselessfacts.jsph.pl");

void setup() {
    Serial.begin(115200);
    WiFi.begin(ssid, password);
    while (WiFi.status() != WL_CONNECTED) { delay(500); }
}

void loop() {
    char fato[256] = {0};

    factsClient.get("/api/v2/facts/random")
        .query("language", "en")
        .getBody("text", fato, sizeof(fato));

    if (factsClient.isSuccess()) {
        exibirFatoNoDisplay(fato);
    }

    delay(60000); // Nova curiosidade a cada minuto
}

8. Visualizador de Fotos de Cachorros

Obtém URLs de fotos aleatórias de cachorros a partir de uma API aberta para exibição em telas TFT, LCD ou painéis e-paper.

API: Dog CEO Dog API (https://dog.ceo/api/breeds/image/random)

Ver Código
#include <Arduino.h>
#include <WiFi.h>
#include "ESP32HTTPClient.h"

const char* ssid     = "SUA_REDE_WIFI";
const char* password = "SUA_SENHA_WIFI";

// --- Assinaturas para lógica de hardware / específica ---
void baixarERenderizarImagem(const char* urlImagem); // implementação específica

ESP32HTTPClient dogClient("https://dog.ceo");

void setup() {
    Serial.begin(115200);
    WiFi.begin(ssid, password);
    while (WiFi.status() != WL_CONNECTED) { delay(500); }
}

void loop() {
    char urlImagem[128] = {0};
    char status[16] = {0};

    dogClient.get("/api/breeds/image/random")
        .getBody("message", urlImagem, sizeof(urlImagem))
        .getBody("status", status, sizeof(status));

    if (dogClient.isSuccess() && strcmp(status, "success") == 0) {
        baixarERenderizarImagem(urlImagem);
    }

    delay(30000);
}

9. Foto Astronômica do Dia (NASA)

Consulta metadados da Foto Astronômica do Dia da NASA, incluindo título, data, explicação e a URL direta da imagem.

API: NASA Open APIs (https://api.nasa.gov/planetary/apod)

Ver Código
#include <Arduino.h>
#include <WiFi.h>
#include "ESP32HTTPClient.h"

const char* ssid      = "SUA_REDE_WIFI";
const char* password  = "SUA_SENHA_WIFI";
const char* chaveNasa = "DEMO_KEY"; // Substitua pela sua chave da NASA

// --- Assinaturas para lógica de hardware / específica ---
void exibirApod(const char* titulo, const char* data, const char* url); // implementação específica

ESP32HTTPClient nasaClient("https://api.nasa.gov");

void setup() {
    Serial.begin(115200);
    WiFi.begin(ssid, password);
    while (WiFi.status() != WL_CONNECTED) { delay(500); }
}

void loop() {
    char titulo[128] = {0};
    char data[16]    = {0};
    char url[256]    = {0};

    nasaClient.get("/planetary/apod")
        .query("api_key", chaveNasa)
        .getBody("title", titulo, sizeof(titulo))
        .getBody("date", data, sizeof(date))
        .getBody("url", url, sizeof(url));

    if (nasaClient.isSuccess()) {
        exibirApod(titulo, data, url);
    }

    delay(86400000); // Consulta diária
}

10. Pesquisa de Livros

Consulta o catálogo do Open Library para buscar detalhes de uma publicação através do ISBN ou título (título, autor, número de páginas e ano).

API: Open Library (https://openlibrary.org/api/books)

Ver Código
#include <Arduino.h>
#include <WiFi.h>
#include "ESP32HTTPClient.h"

const char* ssid     = "SUA_REDE_WIFI";
const char* password = "SUA_SENHA_WIFI";

// --- Assinaturas para lógica de hardware / específica ---
void exibirDetalhesLivro(const char* titulo, int paginas, const char* dataPub); // implementação específica

ESP32HTTPClient libraryClient("https://openlibrary.org");

void setup() {
    Serial.begin(115200);
    WiFi.begin(ssid, password);
    while (WiFi.status() != WL_CONNECTED) { delay(500); }
}

void loop() {
    char titulo[64] = {0};
    char dataPub[32] = {0};
    int paginas = 0;

    // Consulta pelo ISBN: 0451526538 (ex: 1984 de George Orwell)
    libraryClient.get("/api/books")
        .query("bibkeys", "ISBN:0451526538")
        .query("format", "json")
        .query("jscmd", "data")
        .getBody("ISBN:0451526538.title", titulo, sizeof(titulo))
        .getBody("ISBN:0451526538.publish_date", dataPub, sizeof(dataPub))
        .getBody("ISBN:0451526538.number_of_pages", &paginas);

    if (libraryClient.isSuccess()) {
        exibirDetalhesLivro(titulo, paginas, dataPub);
    }

    delay(60000);
}

11. Monitor de Planta Inteligente

Realiza a leitura de múltiplos sensores (umidade do solo, temperatura, luminosidade) e envia telemetria via requisição POST JSON para a nuvem.

API: Backend IoT Customizado (https://api.exemplo-iot.com/v1/telemetry)

Ver Código
#include <Arduino.h>
#include <WiFi.h>
#include "ESP32HTTPClient.h"

const char* ssid     = "SUA_REDE_WIFI";
const char* password = "SUA_SENHA_WIFI";

// --- Assinaturas para lógica de hardware / específica ---
float lerSensorUmidadeSolo();   // implementação específica
float lerTemperaturaAmbiente(); // implementação específica
int   lerNivelLuminosidade();   // implementação específica

ESP32HTTPClient iotClient("https://api.exemplo-iot.com");

void setup() {
    Serial.begin(115200);
    WiFi.begin(ssid, password);
    while (WiFi.status() != WL_CONNECTED) { delay(500); }

    iotClient.bearerAuth("TOKEN_SECRETO_DO_DISPOSITIVO");
}

void loop() {
    float umidade = lerSensorUmidadeSolo();
    float temp    = lerTemperaturaAmbiente();
    int luz       = lerNivelLuminosidade();

    bool sucessoEnvio = false;

    iotClient.post("/v1/telemetry")
        .body("deviceId", "planta-sensor-01")
        .body("soilMoisture", umidade)
        .body("temperature", temp)
        .body("lightLevel", luz)
        .getBody("success", &sucessoEnvio);

    if (iotClient.isSuccess() && sucessoEnvio) {
        Serial.println("Telemetria transmitida com sucesso!");
    }

    delay(60000); // Publica a cada 60 segundos
}

12. Sistema de Alertas IoT

Monitora condições críticas de segurança (como vazamento de gás, fumaça ou intrusão) e dispara imediatamente uma notificação de emergência via webhook POST.

API: Webhook / Gateway de Alertas (https://api.exemplo-alertas.com/v1/notify)

Ver Código
#include <Arduino.h>
#include <WiFi.h>
#include "ESP32HTTPClient.h"

const char* ssid     = "SUA_REDE_WIFI";
const char* password = "SUA_SENHA_WIFI";

// --- Assinaturas para lógica de hardware / específica ---
bool checarCondicaoEmergencia(); // implementação específica
void acionarBuzzerLocal();       // implementação específica

ESP32HTTPClient alertClient("https://api.exemplo-alertas.com");

void setup() {
    Serial.begin(115200);
    WiFi.begin(ssid, password);
    while (WiFi.status() != WL_CONNECTED) { delay(500); }
}

void loop() {
    if (checarCondicaoEmergencia()) {
        acionarBuzzerLocal();

        char idIncidente[32] = {0};

        alertClient.post("/v1/notify")
            .header("X-Priority", "High")
            .body("source", "ESP32-Seguranca")
            .body("level", "CRITICAL")
            .body("message", "Concentracao elevada de gas detectada!")
            .getBody("incidentId", idIncidente, sizeof(idIncidente));

        if (alertClient.isSuccess()) {
            Serial.printf("Alerta registrado com sucesso! Incidente: %s\n", idIncidente);
        }
    }

    delay(2000); // Checagem frequente de segurança
}

13. Envio de Dados com Requisição POST

Cria novos registros enviando um payload JSON estruturado via POST para um servidor REST e recebe o ID gerado na resposta.

API: JSONPlaceholder (https://jsonplaceholder.typicode.com/posts)

Ver Código
#include <Arduino.h>
#include <WiFi.h>
#include "ESP32HTTPClient.h"

const char* ssid     = "SUA_REDE_WIFI";
const char* password = "SUA_SENHA_WIFI";

// --- Assinaturas para lógica de hardware / específica ---
void salvarRegistroCriado(int novoId, const char* titulo); // implementação específica

ESP32HTTPClient restClient("https://jsonplaceholder.typicode.com");

void setup() {
    Serial.begin(115200);
    WiFi.begin(ssid, password);
    while (WiFi.status() != WL_CONNECTED) { delay(500); }
}

void loop() {
    int novoId = 0;
    char titulo[64] = "Relatorio Sensor IoT ESP32";

    restClient.post("/posts")
        .body("title", title)
        .body("body", "Dispositivo online com bateria em 98%")
        .body("userId", 42)
        .getBody("id", &novoId);

    if (restClient.isSuccess()) {
        Serial.printf("Recurso criado com sucesso! Novo ID: %d\n", novoId);
        salvarRegistroCriado(novoId, titulo);
    }

    delay(60000);
}

14. Verificador de Status de API Pública

Verifica periodicamente a disponibilidade, latência e código de status HTTP de um serviço ou API pública remota.

API: Public Healthcheck API (https://httpbin.org/status/200)

Ver Código
#include <Arduino.h>
#include <WiFi.h>
#include "ESP32HTTPClient.h"

const char* ssid     = "SUA_REDE_WIFI";
const char* password = "SUA_SENHA_WIFI";

// --- Assinaturas para lógica de hardware / específica ---
void atualizarIndicadorStatus(bool online, int codigoHttp); // implementação específica

ESP32HTTPClient healthClient("https://httpbin.org");

void setup() {
    Serial.begin(115200);
    WiFi.begin(ssid, password);
    while (WiFi.status() != WL_CONNECTED) { delay(500); }

    healthClient.setTimeout(5000); // Timeout de 5s
}

void loop() {
    healthClient.get("/status/200");

    int codigo = healthClient.getStatusCode();
    bool online = healthClient.isSuccess() && (codigo == 200);

    atualizarIndicadorStatus(online, codigo);

    Serial.printf("Status do Servico: %s (HTTP %d)\n", online ? "DISPONIVEL" : "OFFLINE", codigo);

    delay(30000); // Teste a cada 30 segundos
}