Guías · 19 min de lectura

ESP32 no se conecta a WiFi: códigos WiFi.status() y soluciones

¿Tu ESP32 no se conecta a WiFi? Códigos WiFi.status() y reason, red de 2,4 GHz, errores de contraseña, brownout, setTxPower, reconexión, IP estática y eduroam.

¿Tu ESP32 no se conecta a WiFi y el monitor serie solo muestra puntos sin fin? Casi nunca la culpa es de una placa averiada. Los sospechosos habituales son: intentar conectarse a una red de 5 GHz, una pequeña errata en el nombre de la red o en la contraseña, una fuente de alimentación débil cuya tensión se hunde en cuanto se activa el WiFi, la configuración de seguridad y de canal del router, o una red corporativa del instituto o del trabajo. La buena noticia es que el ESP32 ya te dice qué ha fallado. Solo tienes que saber leer el valor de WiFi.status() y el código reason (motivo) que informa cuando se corta la conexión.

En esta guía verás primero los pasos que sigue el ESP32 para unirse a una red y qué código de estado devuelve en cada uno. Después vienen un sketch de diagnóstico que imprime los códigos de estado y de motivo, un escáner que lista las redes a tu alrededor, la obligación de usar 2,4 GHz y los routers de doble banda, el brownout y la solución con setTxPower, un sketch de reconexión que se recupera solo, la IP estática, la conexión WPA2-Enterprise para redes escolares y la prueba con el punto de acceso del móvil, que en pocos minutos te dice si el problema está en el router o en la placa. Los sketches funcionan con las versiones 2.x y 3.x del core ESP32 para el Arduino IDE, y al final también hay un script de prueba para la Raspberry Pi Pico W y MicroPython.

Placa de desarrollo ESP32 con antena PCB
Placa de desarrollo ESP32: la pista en zigzag del extremo del módulo con blindaje metálico es la antena PCB. Si pones metal, una batería o cables encima o justo al lado de esta zona, la conexión se debilita notablemente.

¿Cómo se conecta el ESP32 a una red WiFi?

Cuando llamas a WiFi.begin(), el ESP32 realiza cuatro pasos en segundo plano. Primero recorre los canales buscando una red con el nombre (SSID) que le has dado. Si la encuentra, se autentica y se asocia con el router. En las redes WPA2 llega después el handshake de 4 vías, el momento en que se comprueba si la contraseña es correcta. Por último, pide una dirección IP al servidor DHCP del router. WiFi.status() solo devuelve WL_CONNECTED cuando también ha terminado este último paso. Si sabes en qué paso se atasca, sabrás en gran parte la causa:

Paso¿Qué ocurre?Estado y motivo si se atasca
1. EscaneoEl ESP32 busca el nombre de la red en los canales de 2,4 GHzWL_NO_SSID_AVAIL (1), reason 201
2. Autenticación y asociaciónEl router acepta o rechaza al ESP32WL_CONNECT_FAILED (4) o WL_DISCONNECTED (6), reason 202 o 203
3. Handshake de 4 víasSe comparan las claves derivadas de la contraseñaWL_DISCONNECTED (6) con reason 15; con reason 204, WL_CONNECTION_LOST (5)
4. DHCPEl router asigna una dirección IP al ESP32Se queda en WL_IDLE_STATUS (0)
Tras conectarseEl router envía paquetes beacon con regularidadSi dejan de llegar: WL_CONNECTION_LOST (5), reason 200

Qué significan los códigos de WiFi.status()

WiFi.status() devuelve un valor de tipo wl_status_t. Si lo imprimes directamente en el monitor serie solo ves un número. La tabla siguiente muestra qué significa cada número en el core Arduino del ESP32. Ojo: los valores del 0 al 6 tienen los mismos nombres que en la antigua biblioteca WiFi de Arduino, pero en el ESP32 aparecen en situaciones algo distintas. Por ejemplo, justo después de WiFi.begin() el estado es 6, no 0; pasa a 0 cuando la placa ya se ha unido al router y espera una IP, y a 3 cuando la obtiene.

CódigoConstanteSignificadoQué revisar primero
0WL_IDLE_STATUSUnido al router, pero aún sin dirección IPNormal durante unos segundos; si dura más, el DHCP
1WL_NO_SSID_AVAILNo se encontró ninguna red con ese nombreNombre de la red, banda de 2,4 GHz, distancia
2WL_SCAN_COMPLETEDHa terminado un escaneo de redesNo tiene que ver con la conexión
3WL_CONNECTEDConectado y con dirección IPTodo correcto
4WL_CONNECT_FAILEDEl router rechazó la conexiónContraseña, modo de seguridad, filtro MAC
5WL_CONNECTION_LOSTSe cortó una conexión ya establecidaIntensidad de señal, alimentación, antena
6WL_DISCONNECTEDNo conectado; el intento sigue en curso o ha falladoEl código reason
254WL_STOPPEDLa estación WiFi está detenida (core 3.x)Llamar a WiFi.mode(WIFI_STA)
255WL_NO_SHIELDEl WiFi aún no se ha iniciado (core 2.x)Llamar a WiFi.mode() o WiFi.begin()
Con una contraseña incorrecta casi todo el mundo espera WL_CONNECT_FAILED (4), pero el ESP32 muestra a menudo WL_DISCONNECTED (6) y sigue reintentando en segundo plano. Se debe a que muchos routers simplemente dejan que el handshake caduque cuando la contraseña es errónea (reason 15). Otro error clásico es llamar a WiFi.begin() una y otra vez dentro del bucle de espera: cada llamada reinicia el intento en curso y la placa a menudo no llega a conectarse nunca. Llama a begin() una sola vez y después limítate a leer el estado.

Sketch de diagnóstico: imprime el estado y el código reason en el monitor serie

El siguiente sketch intenta conectarse durante 20 segundos, imprime el código de estado con su nombre cada vez que cambia y muestra el código reason de ESP-IDF cada vez que se corta la conexión. Si se conecta, imprime la dirección IP, la puerta de enlace, la intensidad de la señal (RSSI) y el canal; en cualquier caso muestra también la dirección MAC de la placa. Sustituye el nombre de la red y la contraseña por los tuyos, sube el sketch y abre el monitor serie a 115200 baudios. Si el sketch ni siquiera se sube, lee primero la guía de errores al subir código.

Arduino (C++)
1#include <WiFi.h>
2
3const char* WIFI_ADI   = "EvAgi_2G";    // Wi-Fi adı, büyük-küçük harfe duyarlı / network name, case-sensitive
4const char* WIFI_SIFRE = "sifre1234";   // Wi-Fi şifresi / Wi-Fi password
5
6// Durum kodunu adına çevir / turn the status code into its name
7const char* durumAdi(wl_status_t durum) {
8  switch (durum) {
9    case WL_IDLE_STATUS:     return "WL_IDLE_STATUS";
10    case WL_NO_SSID_AVAIL:   return "WL_NO_SSID_AVAIL";
11    case WL_SCAN_COMPLETED:  return "WL_SCAN_COMPLETED";
12    case WL_CONNECTED:       return "WL_CONNECTED";
13    case WL_CONNECT_FAILED:  return "WL_CONNECT_FAILED";
14    case WL_CONNECTION_LOST: return "WL_CONNECTION_LOST";
15    case WL_DISCONNECTED:    return "WL_DISCONNECTED";
16    default:                 return "WL_NO_SHIELD / WL_STOPPED";
17  }
18}
19
20// Bağlantı her koptuğunda sebep kodunu yaz / print the reason code on every disconnect
21void koptugunda(arduino_event_id_t olay, arduino_event_info_t bilgi) {
22  Serial.printf("Koptu / Disconnected, reason: %d\n", (int)bilgi.wifi_sta_disconnected.reason);
23}
24
25void setup() {
26  Serial.begin(115200);
27  delay(1000);
28  WiFi.onEvent(koptugunda, ARDUINO_EVENT_WIFI_STA_DISCONNECTED);
29  WiFi.mode(WIFI_STA);                         // istasyon modu / station mode
30  WiFi.begin(WIFI_ADI, WIFI_SIFRE);            // begin() yalnızca bir kez / call begin() only once
31
32  wl_status_t onceki = WL_NO_SHIELD;
33  unsigned long baslangic = millis();
34  while (WiFi.status() != WL_CONNECTED && millis() - baslangic < 20000) {
35    wl_status_t simdi = WiFi.status();
36    if (simdi != onceki) {                     // yalnızca değişince yaz / print only when it changes
37      Serial.printf("Durum / Status: %d %s\n", (int)simdi, durumAdi(simdi));
38      onceki = simdi;
39    }
40    delay(500);
41  }
42
43  if (WiFi.status() == WL_CONNECTED) {
44    Serial.print("Bagli / Connected, IP: ");
45    Serial.println(WiFi.localIP());
46    Serial.print("Ag gecidi / Gateway: ");
47    Serial.println(WiFi.gatewayIP());
48    Serial.printf("RSSI: %d dBm, kanal / channel: %d\n", (int)WiFi.RSSI(), (int)WiFi.channel());
49  } else {
50    wl_status_t son = WiFi.status();
51    Serial.printf("Baglanamadi / Failed, son durum / last status: %d %s\n", (int)son, durumAdi(son));
52  }
53  Serial.print("MAC: ");
54  Serial.println(WiFi.macAddress());           // MAC filtresi için / for MAC filtering
55}
56
57void loop() {}

Es normal ver primero Durum / Status: 6 WL_DISCONNECTED. Si la conexión tiene éxito, el estado pasa brevemente a 0 y luego a 3. Si se queda en 1, la red no se ha encontrado nunca; si aparecen una y otra vez líneas como Koptu / Disconnected, reason: 15, lo más probable es que la contraseña sea incorrecta. Para obtener aún más detalle, pon Herramientas > Core Debug Level en Warn o Info en el Arduino IDE: el core escribirá también el nombre del motivo en cada desconexión, por ejemplo Reason: 201 - NO_AP_FOUND. Estos son los códigos reason que verás con más frecuencia:

ReasonNombre¿Qué significa?Solución
2AUTH_EXPIRELa autenticación caducóSeñal débil o router saturado; acércate, reinicia el router
5ASSOC_TOOMANYEl router ha alcanzado su límite de dispositivosDesconecta dispositivos sin uso o aumenta el límite
8ASSOC_LEAVEEl propio ESP32 abandonó la redTu código llama a WiFi.disconnect(); es normal
154WAY_HANDSHAKE_TIMEOUTEl handshake de la contraseña no se completóCasi siempre contraseña incorrecta; revísala junto con el modo de seguridad
200BEACON_TIMEOUTDejaron de llegar beacons del routerSeñal débil o caída de tensión; antena, alimentación, setTxPower
201NO_AP_FOUNDNo se encontró ninguna red con este nombreOrtografía del SSID, red de 5 GHz, distancia, red oculta, canales 12 y 13
202AUTH_FAILSe rechazó la autenticaciónContraseña o un modo de seguridad incompatible, como Enterprise
203ASSOC_FAILEl router rechazó la asociaciónFiltro MAC o un modo inalámbrico como solo 802.11ax
204HANDSHAKE_TIMEOUTEl handshake superó el tiempo de esperaContraseña incorrecta o señal muy débil
210, 211NO_AP_FOUND_W_COMPATIBLE_SECURITY, NO_AP_FOUND_IN_AUTHMODE_THRESHOLDRed encontrada, pero con un modo de seguridad incompatible o por debajo del mínimo permitido (core 3.x)Pon el router en WPA2-Personal (AES) o baja el mínimo con WiFi.setMinSecurity()

Solo 2,4 GHz: el ESP32 no ve redes de 5 GHz

El ESP32 clásico, el ESP32-S2, el ESP32-S3, el ESP32-C3 y el ESP32-C6 solo funcionan en la banda de 2,4 GHz. Nunca ven en el escaneo una red que emite en 5 GHz, y el resultado siempre es WL_NO_SSID_AVAIL. La mayoría de los routers domésticos emiten en las dos bandas. Si tu router usa un nombre distinto para cada banda (por ejemplo MiWiFi y MiWiFi_5G), dale siempre al ESP32 el nombre de la de 2,4 GHz. Si las dos bandas comparten el mismo nombre (Smart Connect, band steering o sistemas mesh), el ESP32 suele unirse sin problema a la parte de 2,4 GHz, porque de todos modos no ve la señal de 5 GHz. Los problemas aparecen cuando la banda de 2,4 GHz está desactivada o el router intenta empujar a los clientes hacia 5 GHz: el ESP32 se conecta, se cae a los pocos segundos y el ciclo se repite. En ese caso, separa las bandas en la configuración del router o crea una red de invitados que solo emita en 2,4 GHz.

PlacaBanda WiFiNota
ESP32 (WROOM-32, DevKit), ESP32-S2, ESP32-S3Solo 2,4 GHz802.11 b/g/n
ESP32-C3Solo 2,4 GHzLas placas Super Mini baratas pueden necesitar menos potencia de transmisión
ESP32-C6Solo 2,4 GHzAdmite Wi-Fi 6 (802.11ax), pero igualmente solo en 2,4 GHz
ESP32-C52,4 GHz y 5 GHzEl primer chip de doble banda de Espressif
ESP8266 (NodeMCU, Wemos D1 mini, ESP-01)Solo 2,4 GHz802.11 b/g/n
Raspberry Pi Pico W y Pico 2 WSolo 2,4 GHzChip inalámbrico CYW43439
Arduino Uno R4 WiFiSolo 2,4 GHzEl ESP32-S3 de la placa se encarga del WiFi

Si la banda es la correcta y aun así no encuentra la red, revisa la configuración de canal y de modo del router. Con la configuración regional por defecto del ESP32, los canales del 1 al 11 se escanean de forma activa, mientras que los canales 12 y 13 solo se escuchan de forma pasiva. Las redes visibles en esos canales suelen encontrarse igualmente, pero el ESP32 no encontrará una red oculta (con la difusión del SSID desactivada) en el canal 12 o 13. Lo más seguro es pasar el canal de automático a un valor fijo: 1, 6 u 11. El ESP32 clásico, el S2, el S3 y el C3 no pueden conectarse a un router configurado solo en 802.11ax (Wi-Fi 6); cambia el modo a b/g/n o al mixto b/g/n/ax. En seguridad, las opciones más compatibles son WPA2-Personal (AES) o el modo mixto WPA2/WPA3. Por defecto, el core de Arduino rechaza todo lo que esté por debajo de WPA2 (WEP y el antiguo WPA-TKIP); si de verdad necesitas unirte a una red muy antigua, añade WiFi.setMinSecurity(WIFI_AUTH_WEP) antes de begin(). Antes de cambiar ningún ajuste, comprueba con este escáner lo que el ESP32 ve realmente:

Arduino (C++)
1#include <WiFi.h>
2
3// Güvenlik türünü yazıya çevir / turn the security type into text
4const char* guvenlikAdi(wifi_auth_mode_t tur) {
5  switch (tur) {
6    case WIFI_AUTH_OPEN:          return "Acik / Open";
7    case WIFI_AUTH_WEP:           return "WEP";
8    case WIFI_AUTH_WPA_PSK:       return "WPA";
9    case WIFI_AUTH_WPA2_PSK:      return "WPA2";
10    case WIFI_AUTH_WPA_WPA2_PSK:  return "WPA/WPA2";
11    case WIFI_AUTH_WPA3_PSK:      return "WPA3";
12    case WIFI_AUTH_WPA2_WPA3_PSK: return "WPA2/WPA3";
13    default:                      return "Diger / Other (Enterprise)";
14  }
15}
16
17void setup() {
18  Serial.begin(115200);
19  WiFi.mode(WIFI_STA);
20  WiFi.disconnect();                            // temiz tarama için bağlantıyı kes / disconnect for a clean scan
21  delay(100);
22}
23
24void loop() {
25  Serial.println("Taraniyor / Scanning...");
26  int adet = WiFi.scanNetworks();               // engelleyen tarama, 2-4 sn / blocking scan, 2-4 s
27  if (adet <= 0) {
28    Serial.println("Ag bulunamadi / No networks found");
29  }
30  for (int i = 0; i < adet; i++) {
31    Serial.printf("%2d | %-32s | %4d dBm | kanal/ch %2d | %s\n",
32                  i + 1, WiFi.SSID(i).c_str(), (int)WiFi.RSSI(i),
33                  (int)WiFi.channel(i), guvenlikAdi(WiFi.encryptionType(i)));
34  }
35  WiFi.scanDelete();                            // sonuçları bellekten sil / free the results
36  Serial.println();
37  delay(10000);                                 // 10 sn sonra yeniden tara / scan again in 10 s
38}

Si el nombre de tu red no aparece en la lista, el problema está antes de tu código: la red es de 5 GHz, está oculta o el ESP32 está demasiado lejos. Si el nombre aparece, fíjate en su RSSI: de -30 a -60 dBm es excelente y de -60 a -70 dBm es bueno; entre -70 y -80 dBm se conecta pero puede cortarse, y por debajo de -80 dBm no esperes una conexión fiable. Si ves el mismo nombre varias veces, tu router o tu sistema mesh tiene más de un punto de acceso. Con el escaneo rápido por defecto, el ESP32 se une a la primera coincidencia que encuentra; si quieres que elija la señal más fuerte, añade WiFi.setScanMethod(WIFI_ALL_CHANNEL_SCAN) antes de begin(). Copiar el nombre tal cual aparece en el escaneo y pegarlo en tu sketch acaba de raíz con las erratas.

Errores en el nombre de red (SSID) y en la contraseña

Si el sketch de diagnóstico devuelve reason 201 o 15, el problema suele estar en dos líneas de tu código. Un SSID puede tener hasta 32 bytes, una contraseña WPA2 entre 8 y 63 caracteres, y ambos distinguen entre mayúsculas y minúsculas. Estos son los errores que más se pasan por alto:

  • Mayúsculas y minúsculas: No puedes unirte a una red que en el router aparece como MiWiFi escribiendo miwifi. La misma regla vale para la contraseña.
  • Espacios invisibles: Un espacio al final del nombre de la red o de la contraseña, o un carácter oculto que se cuela al copiarlo de algún sitio, impide que coincidan.
  • Eñes y tildes: Letras como ñ, á o é en el nombre de la red pueden guardarse en el router con otra codificación. Cambiar el nombre a letras y números sin acentos es la solución más segura.
  • Apóstrofo curvo: En el iPhone, el nombre del punto de acceso es el nombre del teléfono, y suele llevar un apóstrofo curvo ’ en lugar del recto ' del teclado, así que el nombre de tu código no coincide.
  • Barra invertida y comillas: Si la contraseña contiene \ o ", escríbelas como \\ y \" en la cadena de C++; si no, el compilador cambia la contraseña o el sketch no compila.
  • Red abierta: Para una red sin contraseña, no pongas el parámetro de contraseña; basta con WiFi.begin(nombre). Si das una contraseña para una red abierta, el core busca WPA2 y no encuentra la red.
  • Red oculta: Puedes unirte a redes con la difusión del SSID desactivada escribiendo el nombre exacto, pero no aparecen en los escaneos; si tienes problemas, activa la difusión mientras haces pruebas.
Antes de ponerte a cambiar la contraseña, averigua si el problema es el nombre o la contraseña. Si recibes reason 201, la red no se encontró nunca y tocar la contraseña no sirve de nada. Si recibes reason 15, 202 o 204, la red se encontró, pero la contraseña o el modo de seguridad no se aceptaron.

Alimentación y brownout: ¿por qué se reinicia la placa al activar el WiFi?

Un módulo ESP32 consume de media unos 80 mA, pero mientras el transmisor WiFi está activo la corriente sube durante un instante a picos de 250–400 mA. Los picos más grandes suelen darse durante la calibración de radio al arrancar y en la primera conexión. Por eso Espressif recomienda una fuente capaz de entregar al menos 500 mA. Si la fuente no puede con esos picos, la línea de 3,3 V cae por un momento, salta el detector de brownout del chip y la placa se reinicia con el mensaje Brownout detector was triggered en el monitor serie. El síntoma es muy conocido: el código funciona bien hasta la línea del WiFi, la placa se reinicia en WiFi.begin() y todo se convierte en un bucle infinito. Explicamos este error en detalle en el artículo sobre los errores Brownout y Guru Meditation del ESP32.

Regulador de tensión AMS1117 de 3,3 V
AMS1117: es el regulador que baja los 5 V a 3,3 V en la mayoría de las placas de desarrollo ESP32. Necesita una diferencia de aproximadamente 1,1–1,3 V entre la entrada y la salida para funcionar correctamente.
Fuente de alimentación¿Sirve?¿Por qué?
Puerto USB trasero del ordenador, cable corto y gruesoNormalmente síUn puerto USB 2.0 da 500 mA; un cable corto reduce la caída de tensión
USB frontal, hub USB o cable largo y finoPuede dar problemasLa resistencia del cable y de los contactos baja la tensión en los picos de corriente
Cargador de móvil de 5 V de al menos 1 ASíDeja mucho margen para los picos de corriente
Pin de 3.3V del Arduino UnoNoEste pin solo puede dar unos 50 mA
Batería Li-ion de 3,7 V conectada directamente al pin 5V de la placaNoPor la caída del AMS1117, la salida baja de 3 V
Batería Li-ion con elevador a 5 V o regulador de 3,3 V de baja caídaSíDa unos 3,3 V estables incluso cuando la batería se descarga
Salida de 3,3 V de un módulo de alimentación MB102 para protoboardCasi siempreAliméntalo con un adaptador con corriente suficiente y añade un condensador
En los proyectos con WiFi, coloca un condensador electrolítico de 100–470 µF entre los pines 3V3 y GND de la placa, lo más cerca posible de ella, y a su lado un condensador cerámico de 100 nF. La pata larga (+) del electrolítico va a 3V3 y el lado con la franja en el cuerpo va a GND; un electrolítico puesto al revés se calienta y puede reventar. Puedes leer cómo funcionan los condensadores en ¿Qué es un condensador? y cómo alimentar bien tu placa en la guía de alimentación de Arduino.

La solución setTxPower: bajar la potencia de transmisión

En algunas placas, aunque la fuente sea buena, el ESP32 ve la red pero no consigue conectarse, o la conexión se corta continuamente. Sobre todo en las placas baratas ESP32-C3 Super Mini y en algunos clones de ESP32, el circuito de antena y el regulador sufren a la máxima potencia de transmisión. Por defecto, el ESP32 transmite a unos 19,5–20 dBm. Bajar esa potencia con WiFi.setTxPower() reduce los picos de corriente y, en estas placas, a menudo arregla la conexión al instante. Llama a la función justo después de WiFi.begin(); si la llamas antes de que el WiFi haya arrancado, es decir, antes de WiFi.mode() o de begin(), no tiene efecto.

ConstantePotencia¿Cuándo usarla?
WIFI_POWER_19_5dBm19,5 dBmCerca del valor por defecto; mayor alcance
WIFI_POWER_15dBm15 dBmPrimer intento ante problemas leves
WIFI_POWER_11dBm11 dBmSuele bastar si el router está en la misma habitación
WIFI_POWER_8_5dBm8,5 dBmEl valor más recomendado para el ESP32-C3 Super Mini
WIFI_POWER_5dBm5 dBmPara pruebas justo al lado del router

Cada reducción de 3 dB divide a la mitad la potencia de transmisión, así que el alcance también disminuye. Empieza con 15 dBm; si el problema continúa, baja a 11 y luego a 8,5 dBm. Si al bajar la potencia la conexión se arregla, la causa real suele ser la fuente o el diseño de la antena, así que a largo plazo añade también una fuente mejor y un condensador. Puedes leer el ajuste actual de la placa con WiFi.getTxPower(); el valor viene en unidades de 0,25 dBm, de modo que 78 equivale a 19,5 dBm.

Sketch de reconexión automática

El ESP32 pierde la conexión cuando el router se reinicia, cuando vuelve la luz tras un corte o cuando la señal se debilita un rato. En el core del ESP32, WiFi.setAutoReconnect(true) está activado por defecto y, tras la mayoría de las desconexiones, la placa se vuelve a conectar sola. Sin embargo, con algunos motivos, como 202 AUTH_FAIL, el core se rinde tras un único intento y la placa se queda sin red hasta que la reinicias. Por eso, en un proyecto que tenga que funcionar durante meses, conviene añadir tu propia comprobación. El siguiente sketch no usa delay(): con millis() comprueba la conexión cada 15 segundos, se reconecta si se ha caído y reinicia la placa si pasa 5 minutos sin conseguir conectarse:

Arduino (C++)
1#include <WiFi.h>
2
3const char* WIFI_ADI   = "EvAgi_2G";    // Wi-Fi adı / network name
4const char* WIFI_SIFRE = "sifre1234";   // Wi-Fi şifresi / Wi-Fi password
5
6const unsigned long KONTROL_ARALIGI = 15000;  // 15 sn'de bir kontrol / check every 15 s
7const int EN_FAZLA_DENEME = 20;               // 20 x 15 sn = 5 dk / 20 x 15 s = 5 min
8unsigned long sonKontrol = 0;
9int basarisizSayac = 0;                       // üst üste başarısız kontrol / consecutive failed checks
10
11void wifiBaslat() {
12  WiFi.mode(WIFI_STA);
13  WiFi.setAutoReconnect(true);                // çekirdeğin kendi yeniden bağlanması / core auto-reconnect
14  WiFi.begin(WIFI_ADI, WIFI_SIFRE);
15  WiFi.setTxPower(WIFI_POWER_15dBm);          // gerekirse 8_5dBm'e kadar düşür / lower to 8_5dBm if needed
16  WiFi.setSleep(false);                       // modem uykusunu kapat / disable modem sleep
17}
18
19void setup() {
20  Serial.begin(115200);
21  wifiBaslat();
22}
23
24void loop() {
25  if (millis() - sonKontrol >= KONTROL_ARALIGI) {
26    sonKontrol = millis();
27    if (WiFi.status() == WL_CONNECTED) {
28      basarisizSayac = 0;
29      Serial.printf("Bagli / Connected, IP: %s, RSSI: %d dBm\n",
30                    WiFi.localIP().toString().c_str(), (int)WiFi.RSSI());
31    } else {
32      basarisizSayac++;
33      Serial.printf("Bagli degil / Not connected (%d/%d), yeniden baglaniyor / reconnecting\n",
34                    basarisizSayac, EN_FAZLA_DENEME);
35      WiFi.disconnect();
36      WiFi.reconnect();
37      if (basarisizSayac >= EN_FAZLA_DENEME) {
38        Serial.println("Yeniden baslatiliyor / Restarting");
39        delay(100);
40        ESP.restart();                        // son çare: kartı yeniden başlat / last resort: restart the board
41      }
42    }
43  }
44
45  // Projenin kodu buraya; uzun delay() kullanma / your project code here; avoid long delay()
46}

La línea WiFi.setSleep(false) desactiva el modem sleep, en el que el ESP32 apaga brevemente la radio a intervalos mientras está conectado. Esto reduce los cortes con algunos routers y la latencia del servidor web; a cambio, la placa consume unas decenas de mA más. En proyectos con batería puedes quitar esa línea y calcular cuánto durará la batería con la calculadora de duración de batería. Deja la línea de setTxPower solo si tienes los problemas de la sección anterior. Al añadir el código de tu proyecto en loop(), evita los delay() largos, porque la comprobación de la conexión solo se ejecuta mientras loop() sigue dando vueltas. Si prefieres introducir los datos del WiFi desde el móvil en lugar de dejarlos fijos en el código, echa un vistazo a la biblioteca WiFiManager.

Configurar una IP estática en el ESP32

Normalmente el router asigna al ESP32 por DHCP una dirección que puede cambiar cada vez. Si estás montando un servidor web que siempre abrirás en la misma dirección desde el móvil, o si el DHCP del router da problemas (el estado se queda en 0), una IP estática te facilita la vida. Ten en cuenta tres reglas: WiFi.config() debe llamarse antes de WiFi.begin(); la dirección que elijas debe estar en la red del router pero fuera de su rango DHCP (si el router reparte de 192.168.1.2 a 100, usa algo como 192.168.1.200); y la puerta de enlace es la dirección del propio router. Para saber la dirección de tu router, ejecuta una vez el sketch de diagnóstico con DHCP; también imprime la puerta de enlace.

Arduino (C++)
1#include <WiFi.h>
2
3const char* WIFI_ADI   = "EvAgi_2G";      // Wi-Fi adı / network name
4const char* WIFI_SIFRE = "sifre1234";     // Wi-Fi şifresi / Wi-Fi password
5
6IPAddress sabitIP(192, 168, 1, 200);      // DHCP havuzunun dışında bir adres / an address outside the DHCP pool
7IPAddress agGecidi(192, 168, 1, 1);       // modemin adresi / router address
8IPAddress altAgMaskesi(255, 255, 255, 0); // alt ağ maskesi / subnet mask
9IPAddress dns1(1, 1, 1, 1);               // birinci DNS / primary DNS
10IPAddress dns2(8, 8, 8, 8);               // ikinci DNS / secondary DNS
11
12void setup() {
13  Serial.begin(115200);
14  WiFi.mode(WIFI_STA);
15  // config() mutlaka begin()'den önce / config() must come before begin()
16  if (!WiFi.config(sabitIP, agGecidi, altAgMaskesi, dns1, dns2)) {
17    Serial.println("Statik IP ayarlanamadi / Static IP config failed");
18  }
19  WiFi.begin(WIFI_ADI, WIFI_SIFRE);
20
21  unsigned long baslangic = millis();
22  while (WiFi.status() != WL_CONNECTED && millis() - baslangic < 15000) {
23    delay(500);
24    Serial.print('.');
25  }
26  Serial.println();
27  Serial.print("IP: ");
28  Serial.println(WiFi.localIP());             // 192.168.1.200 olmalı / should be 192.168.1.200
29}
30
31void loop() {}
En el ESP32 el orden de los parámetros es IP, puerta de enlace, máscara de subred, DNS1, DNS2, distinto del de algunas bibliotecas WiFi de Arduino (IP, DNS, puerta de enlace, subred). Si mezclas el orden, el ESP32 se une a la red pero no sale a internet. Te recomendamos rellenar también las direcciones DNS: si el DNS no funciona, el ESP32 aparece en el router pero no puede resolver nombres de dominio, así que no llega a servicios como APIs del tiempo, NTP o Telegram. Dar la misma IP a dos dispositivos hace que ambos pierdan la conexión de forma aleatoria.

Redes de centros educativos y empresas: conexión WPA2-Enterprise (eduroam)

eduroam en las universidades, las redes de empresa y algunas redes escolares usan WPA2-Enterprise (802.1X), que da a cada usuario su propio nombre de usuario y contraseña en lugar de una contraseña compartida. Un WiFi.begin(nombre, contraseña) normal siempre falla en estas redes, y en el escáner su tipo de seguridad aparece como Diger / Other (Enterprise). Las versiones 2.x y 3.x del core Arduino del ESP32 ofrecen una variante de begin() lista para PEAP, el método más extendido:

Arduino (C++)
1#include <WiFi.h>
2
3const char* AG_ADI        = "eduroam";               // kurum ağının adı / enterprise network name
4const char* EAP_KIMLIK    = "[email protected]";   // kimlik, çoğu zaman kullanıcı adıyla aynı / identity, usually same as username
5const char* EAP_KULLANICI = "[email protected]";   // kullanıcı adı / username
6const char* EAP_SIFRE     = "kurum_sifren";          // kurum şifresi / enterprise password
7
8void setup() {
9  Serial.begin(115200);
10  WiFi.disconnect(true);                              // önceki bağlantıyı kapat / close any previous connection
11  WiFi.mode(WIFI_STA);
12  // PEAP (MSCHAPv2) ile bağlan, CA doğrulaması yok / connect with PEAP (MSCHAPv2), no CA check
13  WiFi.begin(AG_ADI, WPA2_AUTH_PEAP, EAP_KIMLIK, EAP_KULLANICI, EAP_SIFRE);
14
15  unsigned long baslangic = millis();
16  while (WiFi.status() != WL_CONNECTED && millis() - baslangic < 30000) {
17    delay(500);
18    Serial.print('.');
19  }
20  Serial.println();
21  if (WiFi.status() == WL_CONNECTED) {
22    Serial.print("Bagli / Connected, IP: ");
23    Serial.println(WiFi.localIP());
24  } else {
25    Serial.printf("Baglanamadi / Failed, durum / status: %d\n", (int)WiFi.status());
26  }
27}
28
29void loop() {}

En la mayoría de las instituciones la identidad (identity) coincide con el nombre de usuario; algunas piden una identidad externa anónima, como [email protected]. Este sketch no valida el certificado del servidor (CA): la conexión funciona, pero un punto de acceso falso podría capturar tu contraseña. Por eso, antes de escribir tu contraseña personal en un ESP32, consulta al departamento de informática y, si es posible, pide una cuenta o una red para dispositivos. Si tu institución exige un certificado, puedes pasar el archivo CA como sexto parámetro de begin(). Las redes que abren una página de inicio de sesión en el navegador (portal cautivo), como las de hoteles, residencias y cafeterías, son otro problema, porque el ESP32 no puede rellenar esa página. Algunos centros también exigen registrar antes la dirección MAC de los dispositivos; envía al departamento de informática la MAC que imprime el sketch de diagnóstico. En estas redes, la solución más práctica es el punto de acceso de tu móvil o un pequeño router de bolsillo.

Prueba con el punto de acceso del móvil: ¿falla el router o el ESP32?

La forma más rápida de acotar la causa es conectar el ESP32 a una red cuya configuración controlas por completo. El punto de acceso de tu móvil es ideal para ello:

  1. Pon al punto de acceso un nombre corto, solo con letras y números sin acentos (por ejemplo esptest), y una contraseña sencilla de al menos 8 caracteres (por ejemplo test12345).
  2. En Android, ajusta la opción de banda en la configuración del punto de acceso móvil (en algunos teléfonos se llama banda AP o Velocidad y compatibilidad) a 2,4 GHz y elige WPA2-Personal como tipo de seguridad.
  3. En el iPhone, ve a Ajustes > Compartir Internet y activa Permitir a otros conectarse. En los modelos recientes, activa también Maximizar compatibilidad; así el punto de acceso pasa a 2,4 GHz. El nombre del punto de acceso es el nombre del teléfono: simplifícalo en Ajustes > General > Información > Nombre y deja abierta la pantalla de Compartir Internet hasta que el ESP32 se conecte.
  4. Sustituye el nombre de la red y la contraseña del sketch de diagnóstico por los del punto de acceso, coloca el móvil a 1–2 metros del ESP32 y sube el sketch.
  5. Lee los códigos de estado y de motivo en el monitor serie y después prueba el mismo sketch con los datos del router de casa.

Interpreta el resultado así: si el ESP32 se conecta al punto de acceso pero no al router de casa, tu código, tu placa y tu alimentación están bien; el problema está en la banda, el canal, la seguridad, el filtro MAC o el límite de dispositivos del router. Si tampoco se conecta al punto de acceso, el problema está en el lado del ESP32: cambia la fuente y el cable, baja la potencia con setTxPower, asegúrate de que no haya metal delante de la antena y revisa de nuevo el código. La prueba del punto de acceso es además la forma más rápida de demostrar que un proyecto que no se conecta en el instituto en realidad funciona.

Prueba de WiFi con la Raspberry Pi Pico W y MicroPython

La Raspberry Pi Pico W y la Pico 2 W también admiten solo 2,4 GHz; todos los consejos de este artículo sobre banda, contraseña, alimentación y punto de acceso valen también para estas placas. En MicroPython, los códigos de estado se leen con constantes del módulo network. El siguiente script funciona sin cambios en Thonny tanto en el ESP32 como en la Pico W. En la Pico W deja de esperar en cuanto no encuentra la red o la contraseña es incorrecta; en el ESP32, MicroPython sigue reintentando con algunos errores, así que el script muestra el último estado al cabo de 20 segundos:

Python
1import network, time
2
3AG_ADI = "EvAgi_2G"       # Wi-Fi adı / network name
4SIFRE = "sifre1234"       # Wi-Fi şifresi / Wi-Fi password
5
6wlan = network.WLAN(network.STA_IF)
7wlan.active(True)
8if wlan.isconnected():
9    wlan.disconnect()     # eski bağlantıyı kapat / close the previous connection
10    time.sleep(1)
11wlan.connect(AG_ADI, SIFRE)
12
13durum = wlan.status()
14for saniye in range(20):  # en fazla 20 sn bekle / wait up to 20 s
15    durum = wlan.status()
16    print(saniye, "durum / status:", durum)
17    if durum in (network.STAT_GOT_IP, network.STAT_NO_AP_FOUND, network.STAT_WRONG_PASSWORD):
18        break             # sonuç belli, beklemeyi bırak / result is known, stop waiting
19    time.sleep(1)
20
21if durum == network.STAT_GOT_IP:
22    print("Bagli / Connected, IP:", wlan.ifconfig()[0])
23    print("RSSI:", wlan.status("rssi"), "dBm")
24elif durum == network.STAT_NO_AP_FOUND:
25    print("Ag bulunamadi / Network not found (SSID, 2.4 GHz)")
26elif durum == network.STAT_WRONG_PASSWORD:
27    print("Sifre yanlis / Wrong password")
28else:
29    print("Baglanamadi / Failed, durum / status:", durum)

En la Pico W los valores numéricos son distintos: 3 significa conectado con IP, 2 conectado pero esperando IP, -1 error general, -2 red no encontrada y -3 contraseña incorrecta. En el ESP32, en cambio, verás 1001 mientras se conecta, 1010 cuando obtiene la IP y, si algo falla, códigos reason de ESP-IDF como 201 y 202. Para evitar problemas con los canales 12 y 13 en la Pico W, configura el código de país antes de conectarte (rp2.country('ES'), o network.country('ES') en firmwares recientes); si la conexión se corta de vez en cuando, puedes desactivar el ahorro de energía con wlan.config(pm=0xa11140). Para montar un servidor web con la Pico W, consulta el artículo servidor web WiFi con la Pico W, y si eres nuevo en MicroPython, echa un vistazo a la guía de fundamentos de MicroPython.

Errores frecuentes y soluciones

SíntomaCausa probableSolución
Caracteres sin sentido en el monitor serieLa velocidad en baudios no coincidePon el monitor serie a 115200 baudios
Estado 1, reason 201Nombre de red incorrecto, red de 5 GHz o demasiado lejosEjecuta el escáner y copia exactamente el nombre de la red de 2,4 GHz
Estado 6, reason 15 una y otra vezContraseña incorrectaVuelve a escribir la contraseña cuidando mayúsculas y caracteres especiales
Estado 4 o 6; reason 202, 210 o 211Modo de seguridad incompatiblePon el router en WPA2-Personal (AES) o en el modo mixto WPA2/WPA3
Se queda en el estado 0Se unió al router pero no recibe IP por DHCPReinicia el router, amplía el rango DHCP o usa una IP estática
Reinicio en WiFi.begin() con Brownout detector was triggeredLa fuente no aguanta los picos de corrienteCable corto, adaptador de al menos 1 A, 470 µF entre 3V3 y GND
Se conecta y se cae a los pocos minutos (reason 200)Señal débil, modem sleep o problema de alimentaciónsetSleep(false), setTxPower, sketch de reconexión, acercarlo al router
Funciona en la mesa, pero no dentro de la cajaCaja metálica o batería delante de la antenaColoca la antena en el borde de la caja mirando hacia fuera, usa una caja de plástico
Conectado, pero la página web no abre en el móvilEl móvil está en otra red o la red de invitados aísla a los clientesConecta ambos a la misma red y lee la IP en el monitor serie
Los valores de analogRead() fallan con el WiFi activoEl sensor está en un pin ADC2, y el WiFi usa el ADC2Mueve el sensor a los pines ADC1, GPIO 32–39
Alcance de pocos centímetros en un ESP32-CAM o una placa con antena externaLa selección de antena está en externa, pero no hay antena conectadaConecta una antena al conector IPEX o revisa la resistencia de 0 Ω que selecciona la antena
Respeta el orden al buscar el fallo: primero usa la prueba del punto de acceso para saber si el problema está en el router o en la placa, después comprueba con el escáner si la red es visible, luego lee el estado y el código reason del sketch de diagnóstico y, solo al final, pasa a la alimentación y a la configuración del router. Cambia una sola cosa cada vez. Si sospechas de tu elección de pines, puedes ver el mapa de pines de tu placa en la herramienta Pinout; si usas un ESP32-CAM, consulta los detalles de la antena en el artículo ESP32-CAM.

Ya estás conectado: ¿qué puedes construir ahora?

  • Servidor web y panel en vivo: Monta un servidor web ESP32 con WebSocket que muestre los valores de los sensores en el móvil en tiempo real.
  • Reloj por internet: Obtén la hora de un servidor NTP y muéstrala en una pantalla.
  • Pantalla del tiempo: Consulta la temperatura y la humedad de tu ciudad con una API del tiempo.
  • Avisos en el móvil: Envía un mensaje con un bot de Telegram cuando se abra la puerta.
  • Casa inteligente: Conecta el ESP32 a Home Assistant mediante MQTT.
  • Comunicación sin router: Haz que dos ESP32 hablen entre sí con ESP-NOW sin unirse a ninguna red.
  • Carga inalámbrica de código: Cuando la placa ya esté cerrada en su caja, envía el código nuevo por WiFi con una actualización OTA.

Que un ESP32 no se conecte a WiFi desconcierta al principio, pero los códigos de estado y de motivo siempre te dicen en qué paso está el problema: 1 y 201 indican que no se encontró la red, 15 y 202 apuntan a la contraseña o al modo de seguridad, 0 al DHCP, y 200 o los reinicios repentinos a la señal o a la alimentación. Si acabas de conocer el ESP32, encontrarás lo básico en ¿Qué es el ESP32?. En la app BlueGrays también puedes explorar proyectos como la conexión WiFi del ESP32, servidor web, mDNS, reloj NTP, estación meteorológica, actualización OTA y alarma por Telegram, con esquemas de circuito paso a paso y código listo para usar.

Preguntas frecuentes

¿Por qué mi ESP32 no se conecta a WiFi?

Las causas más habituales son intentar conectarse a una red de 5 GHz, una errata en el nombre de la red o en la contraseña, una fuente débil cuya tensión cae al arrancar el WiFi y la configuración de seguridad del router. Imprime el valor de WiFi.status() y el código reason al desconectarse y verás enseguida cuál de ellas es. Si no encuentra la red verás 1 y 201; con una contraseña incorrecta, normalmente 6 y 15.

¿El ESP32 se puede conectar a WiFi de 5 GHz?

El ESP32 clásico, el ESP32-S2, S3, C3 y C6 solo admiten 2,4 GHz y no ven las redes de 5 GHz al escanear. El modelo de doble banda es el ESP32-C5. Si tu router emite las dos bandas con nombres distintos, dale al ESP32 el nombre de la red de 2,4 GHz.

¿Qué significa WiFi.status() 6 en el ESP32?

6 corresponde a WL_DISCONNECTED: la placa no está conectada y el intento de conexión sigue en curso o ha fallado. En el ESP32, una contraseña incorrecta suele dar este valor en lugar de 4 (WL_CONNECT_FAILED). Para ver la causa real, mira el código reason del evento ARDUINO_EVENT_WIFI_STA_DISCONNECTED.

¿Por qué mi ESP32 se desconecta del WiFi constantemente?

Las causas principales de los cortes continuos son una señal débil, una fuente que no aguanta los picos de corriente del WiFi, metal o una batería delante de la antena y la función de band steering del router. Acerca la placa al router, añade un condensador de 100–470 µF entre 3V3 y GND y desactiva el modem sleep con WiFi.setSleep(false). Escribe además tu código para que se recupere solo de una desconexión.

¿Un ESP32 se puede conectar al punto de acceso del móvil?

Sí, siempre que el punto de acceso emita en 2,4 GHz. En Android pon la banda del punto de acceso en 2,4 GHz, en el iPhone activa Maximizar compatibilidad y usa un nombre sencillo. La prueba con el punto de acceso es la forma más rápida de saber si el problema está en el router de casa o en el ESP32.

¿Un ESP32 se puede conectar a eduroam o a la red del instituto?

El ESP32 puede unirse a redes WPA2-Enterprise como eduroam con la variante WiFi.begin(nombre, WPA2_AUTH_PEAP, identidad, usuario, contraseña) del core Arduino del ESP32. En cambio, en las redes que abren una página de inicio de sesión en el navegador (portal cautivo), el ESP32 no puede rellenar esa página. Lo mejor es consultar antes al departamento de informática y, si es posible, pedir una cuenta aparte para dispositivos.

Ver todos los proyectos
Conexión Wi-Fi STA con ESP32 (con pantalla LCD)
#127Avanzado
Premium

Conexión Wi-Fi STA con ESP32 (con pantalla LCD)

En este proyecto, conectamos el ESP32 a la red Wi-Fi doméstica en modo Station (STA) de forma segura y tolerante a fallos. Separamos el SSID y la contraseña en el archivo `secrets.h` para evitar que se filtren a Git, configuramos un mecanismo de reconexión automática y mostramos el nivel de señal RSSI y la dirección IP en una pantalla LCD I2C. El LED interno actúa como indicador de estado.

4.4(21)
33
Servidor web asíncrono ESP32 (con indicación de IP en la pantalla LCD)
#129Avanzado
Premium

Servidor web asíncrono ESP32 (con indicación de IP en la pantalla LCD)

En este proyecto, convertimos el ESP32 en un **servidor web asíncrono** que puedes controlar desde tu teléfono o tu ordenador, siempre que estén conectados a la misma red Wi-Fi. Gracias a la biblioteca ESPAsyncWebServer, el servidor puede procesar varias solicitudes al mismo tiempo (a diferencia del clásico `WebServer.h`, que se bloquea con una sola solicitud).

4.8(16)
26
ESP32 mDNS: Acceso al dispositivo mediante bluegrays-esp.local (con pantalla LCD)
#131Avanzado
Premium

ESP32 mDNS: Acceso al dispositivo mediante bluegrays-esp.local (con pantalla LCD)

En este proyecto, al añadir el servicio mDNS (Multicast DNS) al ESP32, permitimos el acceso mediante un nombre de host legible, como `bluegrays-esp.local`, en lugar de una dirección IP. Aunque la IP asignada por el DHCP cambie, siempre podrás acceder al dispositivo con el mismo nombre. Además, al ejecutar un pequeño servidor web en él, enviamos comandos de control de los LED desde el navegador mediante la dirección `http://bluegrays-esp.local/`. En la pantalla LCD I2C se muestran el nombre de ho

4.8(14)
23
ESP32: hora real desde Internet con NTP
#128Avanzado
Premium

ESP32: hora real desde Internet con NTP

El ESP32 se conecta a Wi-Fi y obtiene la hora real con precisión de milisegundos desde servidores NTP (Network Time Protocol). Gracias a `configTzTime()`, se aplica automáticamente la zona horaria de Turquía (TRT, UTC+3) y el cambio DST se gestiona mediante la cadena POSIX TZ. La hora se muestra en el monitor serie y en una pantalla LCD I2C opcional. `configTzTime()` inicia el servicio SNTP; se realizan resincronizaciones periódicas mientras hay acceso a la red, y el reloj del sistema sigue avan

4.5(13)
21
ESP32 HTTPClient + API del tiempo (con pantalla LCD)
#133Avanzado
Premium

ESP32 HTTPClient + API del tiempo (con pantalla LCD)

En este proyecto, utilizamos el ESP32 para realizar una llamada a la API REST de la página web de información meteorológica (wttr.in) a través de Internet, utilizando `HTTPClient.h`. Analizamos la respuesta JSON devuelta con ArduinoJson v7 y mostramos la información sobre la ciudad, la temperatura, la humedad, el tiempo y el viento en una pantalla LCD I2C, tanto en turco como en inglés. wttr.in es gratuito y no requiere clave API: basta con escribir el nombre de cualquier ciudad para obtener su

4.7(13)
20
Actualización OTA del ESP32 — Instalación inalámbrica del firmware (con pantalla LCD)
#132Avanzado
Premium

Actualización OTA del ESP32 — Instalación inalámbrica del firmware (con pantalla LCD)

En este proyecto aprenderás a instalar un nuevo firmware en el ESP32 a través de Wi-Fi, sin necesidad de un cable USB. Con la biblioteca `ArduinoOTA`, el ESP32 se hace visible en la red y aparece automáticamente como `bluegrays-ota` en la pestaña «Puerto de red» del IDE de Arduino. La primera instalación se realiza mediante USB; a partir de ahí, todas las actualizaciones se realizan de forma inalámbrica, lo cual es una característica fundamental para los dispositivos de campo. En la pantalla LCD

4.6(14)
22
Contador ESP32 WebSocket (2 botones + pantalla LCD + web en tiempo real)
#130Avanzado
Premium

Contador ESP32 WebSocket (2 botones + pantalla LCD + web en tiempo real)

En este proyecto, dos botones conectados al ESP32 (GPIO 5 suma, GPIO 4 resta) cambian un contador. El valor se actualiza al instante en una pantalla LCD I2C de 16x2 y, gracias al soporte WebSocket de ESPAsyncWebServer, en todos los navegadores conectados sin recargar la página. En lugar del sondeo HTTP se usa una única conexión persistente y el ESP32 envía el nuevo valor a todos con ws.textAll().

4.5(14)
23
Sistema de Alarma de Movimiento ESP32 (PIR + Buzzer + LED + Telegram)
#145Avanzado
Premium

Sistema de Alarma de Movimiento ESP32 (PIR + Buzzer + LED + Telegram)

Un sistema inteligente de alarma de seguridad que activa el buzzer y el LED cuando el sensor PIR detecta movimiento, y envía simultáneamente una notificación instantánea al propietario vía Telegram. Cuenta con un tiempo de espera de 30 segundos para limitar la frecuencia de las alarmas repetidas; este mecanismo no comprueba la validez de las detecciones del sensor PIR ni elimina las falsas detecciones. Ideal para seguridad del hogar, vigilancia de garajes, almacenes o salas de trabajo. Con ESP32

0.0(0)
8