📶 ESP32-S3 Connexió WiFi Completa (Instituts Catalunya)

Aquest exemple detecta connexió WiFi, errors típics i si hi ha portal captatiu o internet real.

🚀 Codi complet ESP32-S3


#include <WiFi.h>
#include <HTTPClient.h>

const char* ssid = "NomXarxa";
const char* password = "ContrasenyaGeneral";

unsigned long timeout = 15000;

// Internet real
bool hasInternet() {
  HTTPClient http;
  http.begin("http://clients3.google.com/generate_204");
  int code = http.GET();
  http.end();
  return (code == 204);
}

// Portal captatiu
bool checkCaptivePortal() {
  HTTPClient http;
  http.begin("http://example.com");
  int code = http.GET();
  http.end();
  return (code != 200 && code != 204);
}

// Connexió WiFi
bool connectWiFi() {
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);

  Serial.print("Connectant");

  unsigned long start = millis();

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");

    if (millis() - start > timeout) {
      Serial.println("\n❌ Timeout WiFi");

      Serial.println("- Contrasenya incorrecta");
      Serial.println("- Filtrat MAC (instituts)");
      Serial.println("- Portal captatiu");
      Serial.println("- Senyal dèbil");

      return false;
    }
  }

  Serial.println("\n✔ Connectat!");
  Serial.println(WiFi.localIP());

  return true;
}

// Diagnòstic
void diagnoseNetwork() {
  Serial.println("\n--- DIAGNOSI ---");

  if (WiFi.status() != WL_CONNECTED) {
    Serial.println("❌ No connectat");
    return;
  }

  if (hasInternet()) {
    Serial.println("✔ Internet OK");
  } else {
    Serial.println("⚠ Sense internet real");

    if (checkCaptivePortal()) {
      Serial.println("🔐 Portal captatiu detectat");
    } else {
      Serial.println("📛 Bloqueig de xarxa");
    }
  }
}

void setup() {
  Serial.begin(115200);

  if (connectWiFi()) {
    diagnoseNetwork();
  }
}

void loop() {}

🔎 Casos típics en instituts

🧠 Resum

Aquest codi detecta automàticament si el problema és WiFi, internet o portal captatiu.