martes, 29 de octubre de 2024

código test cómo conectarse a una red WiFi con el ESP32

código test cómo conectarse a una red WiFi con el ESP32

En algunos casos algunas versiones de esp suelen tener problemas de conexión, dejare dos imágenes de esp que encontraran en la red, el ESP32 con puerto usb tiene unos componentes extra por la configuracion que requiere el puerto pero funciona igual que el micro usb

Modulo ESP32 DevKit V1 – Micro USB

este modulo por lo comun al subir el archivo al esp no requiere presionar el boton BOOT y es el modulo mas tipico en el mercado (en algunas versiones suele tener problemas para conexion a wifi, mas abajo explico como solucionarlo)


Modulo ESP32 DevKit – USB Tipo-C







La biblioteca incorporada WiFi.h  permitirá utilizar las funciones WiFi de la placa ESP32 fácilmente.

El ESP32 tiene 2 modos WiFi: en el curso de IOT de este canal miramos en el primer video el tema, en resumen:

  • ESTACIÓN ( WIFI_STA ) : El modo Estación (STA) se utiliza para conectar el módulo ESP32 a un punto de acceso WiFi. El ESP32 se comporta como un ordenador que está conectado a nuestro router.

  • AP (Access Point) ( WIFI_AP): En el modo Access Point, el ESP32 se comporta como una red WiFi (un poco como un router): otros dispositivos pueden conectarse a él. En este modo, el ESP32 no está conectado a ninguna otra red y, por lo tanto, no está conectado a Internet. Este modo requiere más recursos computacionales y de energía (la placa del ESP32 se calentará), ya que el ESP32 tiene que simular un router WiFi completo (Soft AP). 

  • El ESP32 está, por defecto, en modo ESTACIÓN.

El código para testear su ESP32 para verificar si el modulo esta bueno y se conecta correctamente, caba resaltar que si despues de subir el codigo continua sin conectarse debe verificar varias item

1. revisar que el cable usb conectado PC a ESP32 sea de datos y sea de la mejor calidad ya que el esp en el momento de trabajar consume buena corriente y el voltaje debe ser estable, preferiblemente conectelo a usb 3

2. Si el cable esta bien y persiste el problema revice que el led de power ilumine correctamente y solo ensaye el ESP32 solo, no conecte nada mas, en su defecto conecte lo entre VCC y GND un capacitor de 470uF o 1000Uf/16v para estabilizar el voltaje y ayudar al inicio del ESP32

3. Revise que el esp32 este bien y tenga actualizado las bibliotecas y la version de tarejetas del ESP32

#include <WiFi.h>

const char* ssid = "nombre de su red wifi";
const char* password = "clave de su red wifi de casa o celular";

void setup(){
    Serial.begin(115200);//configura la velocidad de configuración del monitor serial
    delay(1000);//tiempo de  espera

    WiFi.mode(WIFI_STA); //garantiza que el esp32 se conectara en modo estacion
    WiFi.begin(ssid, password);//inicia el modelo wifi con la red y clave
    Serial.println("\n ...Connecting...");//mensaje conectando

    while(WiFi.status() != WL_CONNECTED){
        Serial.print(".");//sacara un punto hasta que se conecte
        delay(100);
    }

    Serial.println("\n conectado a red wifi");
    Serial.print("IP asignada esp32: ");//mensaje
    Serial.println(WiFi.localIP());//imprime la ip asignada
}

void loop(){}
//*****************************************************************************
Si es una red abierta (sin contraseña), use el siguiente código:
#include <WiFi.h>

const char* ssid = "yourNetworkName";

void setup(){
Serial.begin(115200);
delay(1000);
WiFi.begin(ssid);
Serial.println("\nConnecting");

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

Serial.println("\n conectado a red wifi");
Serial.print("IP asignada esp32: ");
Serial.println(WiFi.localIP()); } void loop(){}
//***********************************************************************

Depurar problemas de conexión Wi-Fi
Monitorizando el estado de la conexión,Podemos conocer el estado de la
conexión WiFi con la función WiFi.status(). Esta función devuelve
un entero según el estado actual de la conexión.
Los estados posibles son:

WL_IDLE_STATUS:Este es el estado predeterminado antes de intentar
conectarse a una red.
WL_SCAN_COMPLETED:El escaneo de la red WiFi ha finalizado.
WL_NO_SSID_AVAIL:El ESP32 no puede encontrar el nombre de la red WiFi.
La red está demasiado lejos del ESP32 o el nombre (SSID) de la red es incorrecto.
WL_CONNECT_FAILED:El ESP32 no puede conectarse a la red WiFi designada.
WL_CONNECTION_LOST:Se perdió la conexión WiFi a la red. Si este error se repite, puede ser un problema de alimentación del ESP32.
WL_CONNECTED:El ESP32 está conectado a la red WiFi.
WL_DISCONNECTED:El ESP32 está desconectado de la red WiFi.

#include <WiFi.h>

const char* ssid = "yourNetworkName";// Define el nombre de la red WiFi (SSID)
const char* password = "yourNetworkPassword";// Define la contraseña de la red WiFi
// Función para obtener el estado del WiFi en formato de texto
String get_wifi_status(int status){
    switch(status){
        case WL_IDLE_STATUS:// Estado en espera, no conectado aún
        return "WL_IDLE_STATUS";
        case WL_SCAN_COMPLETED:// El escaneo de redes WiFi se completó
        return "WL_SCAN_COMPLETED";
        case WL_NO_SSID_AVAIL:// No se encontró la red (SSID) especificada
        return "WL_NO_SSID_AVAIL";
        case WL_CONNECT_FAILED:
        return "WL_CONNECT_FAILED";// Falló la conexión al intentar conectarse a la red
        case WL_CONNECTION_LOST:
        return "WL_CONNECTION_LOST";// La conexión se perdió después de haber sido establecida
        case WL_CONNECTED:
        return "WL_CONNECTED";// Conectado correctamente a la red WiFi
        case WL_DISCONNECTED:
        return "WL_DISCONNECTED";// El módulo se ha desconectado de la red
    }
}

void setup(){
    Serial.begin(115200);
    delay(1000);
    int status = WL_IDLE_STATUS; // Establece el estado inicial en 'espera'
    Serial.println("\nConnectando");
    Serial.println(get_wifi_status(status));
    WiFi.begin(ssid, password);
    while(status != WL_CONNECTED){// Bucle hasta que se conecte al WiFi
        delay(500);
        status = WiFi.status();// Actualiza el estado del WiFi
        Serial.println(get_wifi_status(status));// Imprime el estado actual del WiFi
    }

    Serial.println("\n conectado a red wifi");
Serial.print("IP asignada esp32: ");
Serial.println(WiFi.localIP()); } void loop(){}// Bucle vacío, no se realizan acciones continuas después de la configuración inicial

Reiniciando el ESP32

Ocasionalmente, el ESP32 puede fallar temporalmente al conectarse al WiFi por razones desconocidas o extrañas. La mejor solución es decir que después de n unos segundos, si el ESP32 aún no se ha conectado al WiFi, reiniciamos el ESP32. Simplemente agregamos un tiempo de espera y usamos la ESP.restart() función para reiniciar el ESP32 desde el código.

Aquí hay un ejemplo que reiniciará el ESP32 después de 10 segundos si aún no está conectado a WiFi.

#include <WiFi.h>

#define CONNECTION_TIMEOUT 10

const char* ssid = "yourNetworkName";
const char* password = "yourNetworkPassword";

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

    WiFi.mode(WIFI_STA); //Optional
    WiFi.begin(ssid, password);
    Serial.println("\nConnecting");
    int timeout_counter = 0;

    while(WiFi.status() != WL_CONNECTED){
        Serial.print(".");
        delay(200);
        timeout_counter++;
        if(timeout_counter >= CONNECTION_TIMEOUT*5){
        ESP.restart();
        }
    }

    Serial.println("\nConnected to the WiFi network");
    Serial.print("Local ESP32 IP: ");
    Serial.println(WiFi.localIP());
}

void loop(){}

//*****************************************************************************

Ejemplo de aplicación: escaneo de Wi-Fi

Aquí tienes una aplicación concreta que te permite escanear las redes WiFi que hay a tu alrededor:

#include "WiFi.h"

String get_encryption_type(wifi_auth_mode_t encryptionType) {
    switch (encryptionType) {
        case (WIFI_AUTH_OPEN):
            return "Open";
        case (WIFI_AUTH_WEP):
            return "WEP";
        case (WIFI_AUTH_WPA_PSK):
            return "WPA_PSK";
        case (WIFI_AUTH_WPA2_PSK):
            return "WPA2_PSK";
        case (WIFI_AUTH_WPA_WPA2_PSK):
            return "WPA_WPA2_PSK";
        case (WIFI_AUTH_WPA2_ENTERPRISE):
            return "WPA2_ENTERPRISE";
    }
}

void setup(){
    Serial.begin(115200);
    WiFi.mode(WIFI_STA);
}

void loop() {
    Serial.println("uPesy WiFi Scan Demo");
    Serial.println("[*] Scanning WiFi network");

        // WiFi.scanNetworks will return the number of networks found
        int n = WiFi.scanNetworks();
        Serial.println("[*] Scan done");
        if (n == 0) {
            Serial.println("[-] No WiFi networks found");
        } else {
            Serial.println((String)"[+] " + n + " WiFi networks found\n");
            for (int i = 0; i < n; ++i) {
                // Print SSID, RSSI and WiFi Encryption for each network found
                Serial.print(i + 1);
                Serial.print(": ");
                Serial.print(WiFi.SSID(i));
                Serial.print(" (");
                Serial.print(WiFi.RSSI(i));
                Serial.print(" dB) [");
                Serial.print(get_encryption_type(WiFi.encryptionType(i)));
                Serial.println("]");
                delay(10);
            }
        }
        Serial.println("");

        // Wait a bit before scanning again
        delay(5000);
}

Ahorrar energía

Si estás usando un ESP32 en un proyecto que necesariamente debe usar WiFi para funcionar, es una buena idea configurar el ESP32 en modo de suspensión profunda en caso de falla de conexión para minimizar el consumo de energía. Esto es similar al código ESP32 que se queda en modo de suspensión durante 10 segundos entre cada intento.

Código que permite poner el ESP32 en Deep Sleep entre 2 intentos

#include <WiFi.h>
#include <esp_wifi.h>

//Time in seconds
#define CONNECTION_TIMEOUT 5
#define DEEP_SLEEP_DURATION 10

const char* ssid = "yourNetworkName";
const char* password = "yourNetworkPassword";

void setup(){
    Serial.begin(115200);
    WiFi.begin(ssid, password);
    Serial.println("\nConnecting");
    int timeout_counter = 0;

    while(WiFi.status() != WL_CONNECTED){
        Serial.print(".");
        delay(100);
        timeout_counter++;
            if(timeout_counter >= CONNECTION_TIMEOUT*10){
                Serial.println("\nCan't establish WiFi connexion");
                //Setup timer
                esp_sleep_enable_timer_wakeup(DEEP_SLEEP_DURATION * 1000000);
                //Start deep sleep
                esp_deep_sleep_start();
            }
    }
    Serial.println("\nConnected to the WiFi network");
    Serial.print("Local ESP32 IP: ");
    Serial.println(WiFi.localIP());
}

void loop(){}
fuente: https://www.upesy.com/blogs/tutorials/how-to-connect-wifi-acces-point-with-esp32#

No hay comentarios: