No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Conexión WiFi con ESP32

26/30
Recursos

Aportes 4

Preguntas 4

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

La linea que se debe de agregar en CMakeList.txt, es el que se encuentra a nivel raiz del proyecto.

set(EXTRA_COMPONENT_DIRS $ENV{IDF_PATH}/examples/common_components/protocol_examples_common)

Muestro :
IP obtenida
Netmask
Gateway
.
.

#include <stdio.h>
#include "esp_wifi.h"
#include "nvs_flash.h"
#include "protocol_examples_common.h"

esp_netif_ip_info_t ip_info;
esp_netif_t* netif = NULL;

void app_main(void)
{
    nvs_flash_init();

    esp_netif_init();

    esp_event_loop_create_default();
 
    example_connect();

    netif = esp_netif_get_handle_from_ifkey("WIFI_STA_DEF");

    if (netif == NULL)
    {
        printf("No hay interfaz\n");
    }
    else 
    {
        esp_netif_get_ip_info(netif, &ip_info);
        printf("************************************************************\n");
        printf("IP       : %d.%d.%d.%d\n ", IP2STR(&ip_info.ip));
        printf("Net mask : %d.%d.%d.%d\n ", IP2STR(&ip_info.netmask));
        printf("Gateway  : %d.%d.%d.%d\n ", IP2STR(&ip_info.gw));
    };
     
}

.
.
El resultado es:
.

I (5587) example_common: Connected to example_netif_sta
I (5597) example_common: - IPv4 address: 192.168.26.252,
I (5597) example_common: - IPv6 address: fe80:0000:0000:0000:daa0:1dff:fe42:d550, type: ESP_IP6_ADDR_IS_LINK_LOCAL
************************************************************
IP       : 192.168.26.252
 Net mask : 255.255.255.0
 Gateway  : 192.168.26.225
 I (5627) main_task: Returned from app_main()
I (420797) wifi:<ba-add>idx:1 (ifx:0, a6:d0:ad:16:81:5f), tid:6, ssn:2, winSize:64

.
.
Este es resultado del comando ping:
.

/Dropbox/cursos/notebooks/programacion_de_nicrocontroladores_esp32/wifi  ping 192.168.26.252  
PING 192.168.26.252 (192.168.26.252) 56(84) bytes of data.
64 bytes from 192.168.26.252: icmp_seq=1 ttl=255 time=714 ms
64 bytes from 192.168.26.252: icmp_seq=2 ttl=255 time=123 ms
64 bytes from 192.168.26.252: icmp_seq=3 ttl=255 time=157 ms
64 bytes from 192.168.26.252: icmp_seq=4 ttl=255 time=60.9 ms
^C
--- 192.168.26.252 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3005ms
rtt min/avg/max/mdev = 60.933/263.532/713.528/262.071 ms

si estas viendo esto en el 2035 hubo háganos cambios del uso de la de los eventos y actualizaciónes \#include \<stdio.h>#include "nvs\_flash.h"#include "esp\_wifi.h"#include "esp\_event.h"#include "esp\_log.h"#include "esp\_netif.h"#include "driver/gpio.h"#include "freertos/FreeRTOS.h"#include "freertos/task.h" \#define LED\_GPIO GPIO\_NUM\_4 // Conector 4 static const char \*TAG = "wifi\_led";static TaskHandle\_t led\_task\_handle = NULL;static bool wifi\_connected = false; // Tarea para hacer parpadear el LED mientras se conectavoid led\_blink\_task(void \*pvParameter) { while (!wifi\_connected) { gpio\_set\_level(LED\_GPIO, 1); vTaskDelay(pdMS\_TO\_TICKS(300)); gpio\_set\_level(LED\_GPIO, 0); vTaskDelay(pdMS\_TO\_TICKS(300)); } vTaskDelete(NULL); // Tarea termina cuando ya hay conexión} // Manejador de eventosstatic void wifi\_event\_handler(void\* arg, esp\_event\_base\_t event\_base, int32\_t event\_id, void\* event\_data){ if (event\_base == WIFI\_EVENT && event\_id == WIFI\_EVENT\_STA\_START) { esp\_wifi\_connect(); } else if (event\_base == WIFI\_EVENT && event\_id == WIFI\_EVENT\_STA\_DISCONNECTED) { ESP\_LOGI(TAG, "Desconectado. Reintentando..."); wifi\_connected = false; esp\_wifi\_connect(); // Reiniciar tarea de parpadeo si es necesario if (led\_task\_handle == NULL) { xTaskCreate(led\_blink\_task, "led\_blink\_task", 2048, NULL, 5, \&led\_task\_handle); } } else if (event\_base == IP\_EVENT && event\_id == IP\_EVENT\_STA\_GOT\_IP) { ip\_event\_got\_ip\_t\* event = (ip\_event\_got\_ip\_t\*) event\_data; ESP\_LOGI(TAG, "Conectado con IP: " IPSTR, IP2STR(\&event->ip\_info.ip)); wifi\_connected = true; // Encender LED fijo gpio\_set\_level(LED\_GPIO, 1); // Eliminar tarea de parpadeo si sigue corriendo if (led\_task\_handle != NULL) { vTaskDelete(led\_task\_handle); led\_task\_handle = NULL; } }} void app\_main(void){ // Inicializar NVS esp\_err\_t ret = nvs\_flash\_init(); if (ret == ESP\_ERR\_NVS\_NO\_FREE\_PAGES || ret == ESP\_ERR\_NVS\_NEW\_VERSION\_FOUND) { ESP\_ERROR\_CHECK(nvs\_flash\_erase()); ret = nvs\_flash\_init(); } ESP\_ERROR\_CHECK(ret); // Inicializar red y eventos ESP\_ERROR\_CHECK(esp\_netif\_init()); ESP\_ERROR\_CHECK(esp\_event\_loop\_create\_default()); // Configurar GPIO del LED gpio\_config\_t io\_conf = { .pin\_bit\_mask = (1ULL << LED\_GPIO), .mode = GPIO\_MODE\_OUTPUT, .pull\_up\_en = 0, .pull\_down\_en = 0, .intr\_type = GPIO\_INTR\_DISABLE }; gpio\_config(\&io\_conf); gpio\_set\_level(LED\_GPIO, 0); // Apagar inicialmente // Crear interfaz Wi-Fi STA esp\_netif\_create\_default\_wifi\_sta(); // Configurar Wi-Fi wifi\_init\_config\_t cfg = WIFI\_INIT\_CONFIG\_DEFAULT(); ESP\_ERROR\_CHECK(esp\_wifi\_init(\&cfg)); wifi\_config\_t wifi\_config = { .sta = { .ssid = WIFI\_SSID, .password = WIFI\_PASS, }, }; // Registrar eventos ESP\_ERROR\_CHECK(esp\_event\_handler\_register(WIFI\_EVENT, ESP\_EVENT\_ANY\_ID, \&wifi\_event\_handler, NULL)); ESP\_ERROR\_CHECK(esp\_event\_handler\_register(IP\_EVENT, IP\_EVENT\_STA\_GOT\_IP, \&wifi\_event\_handler, NULL)); // Configurar Wi-Fi como estación ESP\_ERROR\_CHECK(esp\_wifi\_set\_mode(WIFI\_MODE\_STA)); ESP\_ERROR\_CHECK(esp\_wifi\_set\_config(ESP\_IF\_WIFI\_STA, \&wifi\_config)); ESP\_ERROR\_CHECK(esp\_wifi\_start()); ESP\_LOGI(TAG, "Wi-Fi inicializado. Conectando a %s...", WIFI\_SSID); // Iniciar tarea de parpadeo xTaskCreate(led\_blink\_task, "led\_blink\_task", 2048, NULL, 5, \&led\_task\_handle);}
# **Conectando nuestra tarjeta de desarrollo a una red Wi-Fi** ## **Requisitos previos** # Antes de comenzar, asegúrate de contar con lo siguiente: * # Un **Access Point** o dispositivo de red con conexión Wi-Fi. * # El **SSID** (nombre de la red) y la **contraseña** para acceder a la red. * # Una **tarjeta de desarrollo** compatible con ESP-IDF, que ya incluye todo lo necesario para conectarse a una red Wi-Fi sin necesidad de dispositivos adicionales. ## **Preparación del entorno** # Trabajaremos en **Visual Studio Code**. En este punto, ya deberíamos tener un proyecto creado y haber realizado la primera compilación. ## **Inclusión de librerías necesarias** ### **1. Conexión a la red Wi-Fi** # #include "esp\_wifi.h" # Esta librería nos permitirá gestionar la conexión a la red Wi-Fi en nuestra tarjeta de desarrollo. ### **2. Almacenamiento de credenciales** # #include "nvs\_flash.h" # Esta función permite la reconexión automática sin necesidad de ingresar nuevamente las credenciales. ### **3. Uso de la librería protocol\_examples\_common.h** # Para simplificar la conexión Wi-Fi, utilizaremos una librería de ejemplo proporcionada por ESP-IDF: # #include "protocol\_examples\_common.h" ## **Agregar la librería al proyecto** ### **3.1 Incluir la librería en CMakeLists.txt** # set(EXTRA\_COMPONENT\_DIRS $ENV{IDF\_PATH}/examples/common\_components/protocol\_examples\_common) ### **3.2 Explicación del código** * # set(EXTRA\_COMPONENT\_DIRS ...) → Define un directorio de componentes adicionales. * # $ENV{IDF\_PATH} → Ubicación donde está instalado el ESP-IDF. * # examples/common\_components/protocol\_examples\_common → Contiene la librería protocol\_examples\_common.h. ### **3.3 Verificación y exploración** # Si deseas entender cómo funciona esta librería: 1. # Ve al directorio especificado. 2. # Explora el código fuente. ## **Importación en nuestro código C** # #include "protocol\_examples\_common.h" # **Explicación del código en app\_main(void)** ## **Código de la función app\_main(void)** # void app\_main(void) # { #   nvs\_flash\_init(); #   esp\_netif\_init(); #   esp\_event\_loop\_create\_default(); #   example\_connect(); #   esp\_netif\_ip\_info\_t ip\_info; #   esp\_netif\_t\* netif = NULL; #   netif = esp\_netif\_get\_handle\_from\_ifkey("WIFI\_STA\_DEF"); # } ### **1. Inicialización del almacenamiento no volátil (NVS)** # nvs\_flash\_init(); # Permite guardar el **SSID** y la **contraseña** de la red Wi-Fi. ### **2. Inicialización de la interfaz de red** # esp\_netif\_init(); # Permite que el dispositivo maneje conexiones de red. ### **3. Creación del *event loop*** # esp\_event\_loop\_create\_default(); # Un *event loop* es un sistema que maneja eventos de conexión y desconexión. ### **4. Establecimiento de la conexión Wi-Fi** # example\_connect(); # Facilita la conexión sin necesidad de programar manualmente los eventos de Wi-Fi. ### **5. Preparación para obtener la dirección IP** #### **5.1 Declaración de una variable para almacenar la IP** # esp\_netif\_ip\_info\_t ip\_info; #### **5.2 Creación de una variable para la interfaz de red** # esp\_netif\_t\* netif = NULL; #### **5.3 Obtener la interfaz de red Wi-Fi** # netif = esp\_netif\_get\_handle\_from\_ifkey("WIFI\_STA\_DEF"); # Accede a la interfaz de red en modo estación. ## **Verificación de la conexión Wi-Fi y obtención de la dirección IP** ### **1. Verificación de la conexión** # if (netif == NULL) { #     printf("No hay interfaz\n"); # } else { #     esp\_netif\_get\_ip\_info(netif, \&ip\_info); #     printf("IP: %d.%d.%d.%d\n", IP2STR(\&ip\_info.ip)); # } # Si netif == NULL, significa que no se obtuvo una interfaz de red. Si la conexión es exitosa, se imprime la dirección **IP**. ### **2. Conversión de la IP a formato de texto** # IP2STR # Convierte la estructura de IP en una cadena legible. ## **Código final completo** # #include \<stdio.h> # #include "esp\_wifi.h" # #include "nvs\_flash.h" # #include "protocol\_examples\_common.h" # void app\_main(void) # { #   nvs\_flash\_init(); #   esp\_netif\_init(); #   esp\_event\_loop\_create\_default(); #   example\_connect(); #   esp\_netif\_ip\_info\_t ip\_info; #   esp\_netif\_t\* netif = NULL; #   netif = esp\_netif\_get\_handle\_from\_ifkey("WIFI\_STA\_DEF"); #   if (netif == NULL) { #     printf("No hay interfaz\n"); #   } else { #     esp\_netif\_get\_ip\_info(netif, \&ip\_info); #     printf("IP: %d.%d.%d.%d\n", IP2STR(\&ip\_info.ip)); #   } # } # **🛠️ Ejemplo listo para ejecución** ## **📡 Configuración de la red Wi-Fi** # Ejecutamos: # idf.py menuconfig # Editamos el **SSID** y la **contraseña**, luego guardamos con **S + Enter** y salimos con **Q**. ## **🔨 Compilación del programa** # idf.py build ## **🚀 Subida del programa a la tarjeta de desarrollo** # idf.py -p COM6 flash # (Sustituye COM6 por el puerto correcto en tu sistema). ## **🔍 Verificación de la conexión en la terminal** # idf.py -p COM6 monitor # La dirección **IP** se imprimirá en la terminal. # **🎉 ¡Felicidades!** # Has logrado: ✅ Configurar la red Wi-Fi en **menuconfig**. ✅ Compilar y cargar el programa en el ESP32. ✅ Verificar la conexión y obtener la dirección **IP** asignada. # 🚀 **Próximos pasos:** * # Utilizar esta conexión para enviar y recibir datos desde Internet. * # Convertir el ESP32 en un **servidor local** para interactuar con otros dispositivos.