/********************************************************
 * 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
}