数码之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 85|回复: 3

《DNESP32S3使用指南-IDF版_V1.6》第四十九章 WiFi路由实验

[复制链接]
发表于 昨天 09:08 | 显示全部楼层 |阅读模式
第四十九章 WiFi路由实验

本章节实验作者把ESP32-S3配置为STA模式,即连接附近的热点。STA模式相关知识请读者查看上一章节的内容。
本章分为如下几个小节:
49.1 硬件设计
49.2 软件设计
49.3 下载验证


49.1 硬件设计
1. 例程功能
本章实验功能简介:扫描附近的WIFI信号,并连接到一个真实存在的 WIFI 热点。
2. 硬件资源
1LED
LED-IO1
2XL9555
IIC_INT-IO0(需在P5连接IO0)
IIC_SDA-IO41
IIC_SCL-IO42
3SPILCD
CS-IO21
SCK-IO12
SDA-IO11
DC-IO40(在P5端口,使用跳线帽将IO_SETLCD_DC相连)
PWR- IO1_3XL9555)
RST- IO1_2XL9555)
4ESP32-S3内部WiFi
3. 原理图
本章实验使用的WiFiESP32-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,   \
    },                                              \
}
/**
* @brief       链接显示
* @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事件回调函数,并配置WiFiSTA模式。当系统搜索到可连接的热点时,它会尝试与该热点建立连接。如果连接成功,则会在LCD上显示连接信息,并发送一个连接事件标志。如果连接失败,系统会尝试发送20次连接请求,直到没有收到任何连接回复为止。此时,会发送一个连接失败事件标志。通过查看这些连接事件标志,我们可以确定热点是否成功连接。
49.3 下载验证
程序下载成功后,需要利用手机或其他设备创建一个WiFi热点。在创建热点时,需要注意提供正确的账号名和密码,以确保程序能够成功连接。同时,确保程序中要连接的热点账号与密码与所创建的热点一致。当LCD显示热点的账号名和密码时,此时ESP32-S3设备已经与热点连接成功了,否则,LCD提示连接失败,如下图所示:
49.3.1 SPILCD显示效果图

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
发表于 昨天 09:38 | 显示全部楼层
看不懂,这个广告不合格
回复 支持 反对

使用道具 举报

发表于 昨天 17:10 | 显示全部楼层
隔行如隔山
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 微信登录

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-9-16 00:29 , Processed in 0.109200 second(s), 9 queries , Gzip On, Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

快速回复 返回顶部 返回列表