第四十九章 WiFi路由实验
本章节实验作者把ESP32-S3配置为STA模式,即连接附近的热点。STA模式相关知识请读者查看上一章节的内容。 本章分为如下几个小节: 49.1 硬件设计 49.2 软件设计 49.3 下载验证
49.1 硬件设计 1. 例程功能 本章实验功能简介:扫描附近的WIFI信号,并连接到一个真实存在的 WIFI 热点。 2. 硬件资源 1)LED灯 LED-IO1 2)XL9555 IIC_INT-IO0(需在P5连接IO0) IIC_SDA-IO41 IIC_SCL-IO42 3)SPILCD CS-IO21 SCK-IO12 SDA-IO11 DC-IO40(在P5端口,使用跳线帽将IO_SET和LCD_DC相连) PWR- IO1_3(XL9555) RST- IO1_2(XL9555) 4)ESP32-S3内部WiFi 3. 原理图 本章实验使用的WiFi为ESP32-S3的片上资源,因此并没有相应的连接原理图。 49.2 软件设计 49.2.1 程序流程图 程序流程图能帮助我们更好的理解一个工程的功能和实现的过程,对学习和设计工程有很好的主导作用。下面看看本实验的程序流程图: 图49.2.1.1 程序流程图 49.2.2 程序解析 在本章节实验中,我们只关心main.c文件内容即可,该文件内容如下: i2c_obj_t i2c0_master; /* 链接wifi名称 */ #define DEFAULT_SSID "123" /* wifi密码 */ #define DEFAULT_PWD "aa1234567" /* 事件标志 */ static EventGroupHandle_t wifi_event; #define WIFI_CONNECTED_BIT BIT0 #define WIFI_FAIL_BIT BIT1 static const char *TAG = "static_ip"; char lcd_buff[100] = {0}; /* WIFI默认配置 */ #define WIFICONFIG() { \ .sta = { \ .ssid = DEFAULT_SSID, \ .password = DEFAULT_PWD, \ .threshold.authmode = WIFI_AUTH_WPA2_PSK, \ }, \ } /** * @param flag:2->链接;1->链接失败;0->再链接中 * @retval 无 */ void connet_display(uint8_t flag) { if(flag == 2) { lcd_fill(0,90,320,240,WHITE); sprintf(lcd_buff, "ssid:%s",DEFAULT_SSID); lcd_show_string(0, 90, 240, 16, 16, lcd_buff, BLUE); sprintf(lcd_buff, "psw:%s",DEFAULT_PWD); lcd_show_string(0, 110, 240, 16, 16, lcd_buff, BLUE); } else if (flag == 1) { lcd_show_string(0, 90, 240, 16, 16, "wifi connecting fail", BLUE); } else { lcd_show_string(0, 90, 240, 16, 16, "wifi connecting......", BLUE); } } /** * @brief WIFI链接糊掉函数 * @param arg:传入网卡控制块 * @param event_base:WIFI事件 * @param event_id:事件ID * @param event_data:事件数据 * @retval 无 */ static void wifi_event_handler(void *arg, esp_event_base_t event_base, int32_t event_id, void *event_data) { static int s_retry_num = 0; /* 扫描到要连接的WIFI事件 */ if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START) { connet_display(0); esp_wifi_connect(); } /* 连接WIFI事件 */ else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_CONNECTED) { connet_display(2); } /* 连接WIFI失败事件 */ else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_DISCONNECTED) { /* 尝试连接 */ if (s_retry_num < 20) { esp_wifi_connect(); s_retry_num++; ESP_LOGI(TAG, "retry to connect to the AP"); } else { xEventGroupSetBits(wifi_event, WIFI_FAIL_BIT); } ESP_LOGI(TAG,"connect to the AP fail"); } /* 工作站从连接的AP获得IP */ 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, "static ip:" IPSTR, IP2STR(&event->ip_info.ip)); s_retry_num = 0; xEventGroupSetBits(wifi_event, WIFI_CONNECTED_BIT); } } /** * @brief WIFI初始化 * @param 无 * @retval 无 */ void wifi_sta_init(void) { static esp_netif_t *sta_netif = NULL; wifi_event= xEventGroupCreate(); /* 创建一个事件标志组 */ /* 网卡初始化 */ ESP_ERROR_CHECK(esp_netif_init()); /* 创建新的事件循环 */ ESP_ERROR_CHECK(esp_event_loop_create_default()); sta_netif= esp_netif_create_default_wifi_sta(); assert(sta_netif); wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); 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) ); ESP_ERROR_CHECK(esp_wifi_init(&cfg)); wifi_config_t wifi_config = WIFICONFIG(); 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()); /* 等待链接成功后、ip生成 */ EventBits_t bits = xEventGroupWaitBits(wifi_event, WIFI_CONNECTED_BIT | WIFI_FAIL_BIT, pdFALSE, pdFALSE, portMAX_DELAY); /* 判断连接事件 */ if (bits & WIFI_CONNECTED_BIT) { ESP_LOGI(TAG, "connected to ap SSID:%s password:%s", DEFAULT_SSID, DEFAULT_PWD); } else if (bits & WIFI_FAIL_BIT) { connet_display(1); } else { ESP_LOGE(TAG, "UNEXPECTED EVENT"); } vEventGroupDelete(wifi_event); } /** * @brief 程序入口 * @param 无 * @retval 无 */ void app_main(void) { /* 省略代码...... */ wifi_sta_init(); while (1) { LED_TOGGLE(); vTaskDelay(500); } } 从上述源码中,作者首先创建了事件组、WiFi事件回调函数,并配置WiFi为STA模式。当系统搜索到可连接的热点时,它会尝试与该热点建立连接。如果连接成功,则会在LCD上显示连接信息,并发送一个连接事件标志。如果连接失败,系统会尝试发送20次连接请求,直到没有收到任何连接回复为止。此时,会发送一个连接失败事件标志。通过查看这些连接事件标志,我们可以确定热点是否成功连接。 49.3 下载验证 程序下载成功后,需要利用手机或其他设备创建一个WiFi热点。在创建热点时,需要注意提供正确的账号名和密码,以确保程序能够成功连接。同时,确保程序中要连接的热点账号与密码与所创建的热点一致。当LCD显示热点的账号名和密码时,此时ESP32-S3设备已经与热点连接成功了,否则,LCD提示连接失败,如下图所示: 图49.3.1 SPILCD显示效果图
|