/********************************************************
* CANAL INTERNET E COISAS
* youtube.com/@internetecoisas
* ESP32/ESP8266 - Identificando endereço IP externo
* API disponibilizada por MyIP.com
* 07/2025 - André Michelon
*/
// Bibliotecas ------------------------------------------
#ifdef ESP32
// Bibliotecas para ESP32
#include <WiFi.h>
#include <HTTPClient.h>
#elif defined ESP8266
// Biblioteca para ESP8266
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#else
#error Placa inválida // Erro, placa incorreta
#endif
const char* platform() {
#if defined(__AVR_ATmega328P__)
return "UNO/NANO";
#elif defined(__AVR_ATmega2560__)
return "MEGA";
#elif defined(__AVR_ATmega32U4__)
return "LEONARDO/MICRO";
#elif defined(ARDUINO_BOARD)
return ARDUINO_BOARD;
#else
return "DESCONHECIDO";
#endif
}
#include <ArduinoJson.h>
// Wi-Fi ------------------------------------------------
const char* SSID = "Wokwi-GUEST";
const char* PASSWORD = "";
// API MyIP.com -----------------------------------------
const char* MYIP_API = "http://api.myip.com";
// Setup ------------------------------------------------
void setup() {
// Incializa
#ifdef ESP32
Serial.begin(115200); // Velocidade padrão para ESP32
#else
Serial.begin(74880); // Velocidade padrão para ESP8266
#endif
delay(1000); // Aguarda estabilização da serial
Serial.println("\n\n*** CANAL INTERNET E COISAS ***\n"
"Lendo endereço IP externo");
// Conecta Wi-Fi
Serial.print("Conectando WiFi");
WiFi.begin(SSID, PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi conectado");
Serial.println("Verificando endereços IP...");
// Exibe IP iterno
Serial.print("IP interno: "); Serial.println(WiFi.localIP());
// Efetua requisição à API MyIP.com
WiFiClient wifi;
HTTPClient http;
http.begin(wifi, MYIP_API);
byte i = http.GET();
if (i == HTTP_CODE_OK) {
// Sucesso - processa JSON recebido
JsonDocument json;
DeserializationError erro = deserializeJson(json, http.getString());
if (erro) {
Serial.print("Retorno inválido: "); Serial.println(erro.f_str());
}
// Exibe IP externo
String ipExt = json["ip"];
Serial.println("IP externo: " + ipExt);
Serial.print(" - Tipo: IP v"); Serial.println(ipExt.length() > 15 ? "6" : "4" );
Serial.print(" - País: "); Serial.println(json["country"].as<const char*>());
} else {
// Falha - exibe mensagem de erro
Serial.println("Erro obtendo IP externo: " + String(i) + " " + http.errorToString(i));
}
//DETECÇÃO DA PLACA EM USO
Serial.println();
Serial.print(F("Placa detectada: "));
Serial.println(platform()); // Exibe a plataforma
}
void loop() {
// Nada a fazer
}