OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 38|回复: 0

《ESP32-S3使用指南—IDF版 V1.6》第四十九章 WiFi路由实验

[复制链接]

1184

主题

1196

帖子

2

精华

超级版主

Rank: 8Rank: 8

积分
5115
金钱
5115
注册时间
2019-5-8
在线时间
1277 小时
发表于 昨天 09:07 | 显示全部楼层 |阅读模式
本帖最后由 正点原子运营 于 2025-11-18 10:16 编辑

第四十九章 WiFi路由实验

1)实验平台:正点原子DNESP32S3开发板

2)章节摘自【正点原子】ESP32-S3使用指南—IDF版 V1.6

3)购买链接:https://detail.tmall.com/item.htm?&id=768499342659

4)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boards/esp32/ATK-DNESP32S3.html

5)正点原子官方B站:https://space.bilibili.com/394620890

6)正点原子DNESP32S3开发板技术交流群:132780729


2.jpg

3.png

       本章节实验作者把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 程序流程图
       程序流程图能帮助我们更好的理解一个工程的功能和实现的过程,对学习和设计工程有很好的主导作用。下面看看本实验的程序流程图:

第四十九章 WiFi路由实验551.png
图49.2.1.1 程序流程图

       49.2.2 程序解析
       在本章节实验中,我们只关心main.c文件内容即可,该文件内容如下:
  1. i2c_obj_t i2c0_master;
  2. /* 链接wifi名称 */
  3. #define DEFAULT_SSID        "123"
  4. /* wifi密码 */
  5. #define DEFAULT_PWD         "aa1234567"
  6. /* 事件标志 */
  7. static EventGroupHandle_t   wifi_event;
  8. #define WIFI_CONNECTED_BIT  BIT0
  9. #define WIFI_FAIL_BIT       BIT1
  10. static const char *TAG = "static_ip";
  11. char lcd_buff[100] = {0};

  12. /* WIFI默认配置 */
  13. #define WIFICONFIG()   {                            \
  14.     .sta = {                                        \
  15.         .ssid = DEFAULT_SSID,                       \
  16.         .password = DEFAULT_PWD,                    \
  17.         .threshold.authmode = WIFI_AUTH_WPA2_PSK,   \
  18.     },                                              \
  19. }

  20. /**
  21. * @brief       链接显示
  22. * [url=home.php?mod=space&uid=271674]@param[/url]       flag:2->链接;1->链接失败;0->再链接中
  23. * @retval      无
  24. */
  25. void connet_display(uint8_t flag)
  26. {
  27.     if(flag == 2)
  28.     {
  29.         lcd_fill(0,90,320,240,WHITE);
  30.         sprintf(lcd_buff, "ssid:%s",DEFAULT_SSID);
  31.         lcd_show_string(0, 90, 240, 16, 16, lcd_buff, BLUE);
  32.         sprintf(lcd_buff, "psw:%s",DEFAULT_PWD);
  33.         lcd_show_string(0, 110, 240, 16, 16, lcd_buff, BLUE);
  34.     }
  35.     else if (flag == 1)
  36.     {
  37.         lcd_show_string(0, 90, 240, 16, 16, "wifi connecting fail", BLUE);
  38.     }
  39.     else
  40.     {
  41.         lcd_show_string(0, 90, 240, 16, 16, "wifi connecting......", BLUE);
  42.     }
  43. }

  44. /**
  45. * @brief       WIFI链接糊掉函数
  46. * @param       arg:传入网卡控制块
  47. * @param       event_base:WIFI事件
  48. * @param       event_id:事件ID
  49. * @param       event_data:事件数据
  50. * @retval      无
  51. */
  52. static void wifi_event_handler(void *arg, esp_event_base_t event_base,
  53. int32_t event_id, void *event_data)
  54. {
  55.     static int s_retry_num = 0;

  56.     /* 扫描到要连接的WIFI事件 */
  57.     if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START)
  58.     {
  59.         connet_display(0);
  60.         esp_wifi_connect();
  61.     }
  62.     /* 连接WIFI事件 */
  63.     else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_CONNECTED)
  64.     {
  65.         connet_display(2);
  66.     }
  67.     /* 连接WIFI失败事件 */
  68. else if (event_base == WIFI_EVENT &&
  69. event_id == WIFI_EVENT_STA_DISCONNECTED)
  70.     {
  71.         /* 尝试连接 */
  72.         if (s_retry_num < 20)
  73.         {
  74.             esp_wifi_connect();
  75.             s_retry_num++;
  76.             ESP_LOGI(TAG, "retry to connect to the AP");
  77.         }
  78.         else
  79.         {
  80.             xEventGroupSetBits(wifi_event, WIFI_FAIL_BIT);
  81.         }

  82.         ESP_LOGI(TAG,"connect to the AP fail");
  83.     }
  84.     /* 工作站从连接的AP获得IP */
  85.     else if(event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP)
  86.     {
  87.         ip_event_got_ip_t* event = (ip_event_got_ip_t*) event_data;
  88.         ESP_LOGI(TAG, "static ip:" IPSTR, IP2STR(&event->ip_info.ip));
  89.         s_retry_num = 0;
  90.         xEventGroupSetBits(wifi_event, WIFI_CONNECTED_BIT);
  91.     }
  92. }

  93. /**
  94. * @brief       WIFI初始化
  95. * @param       无
  96. * @retval      无
  97. */
  98. void wifi_sta_init(void)
  99. {
  100.     static esp_netif_t *sta_netif = NULL;
  101.     wifi_event= xEventGroupCreate();    /* 创建一个事件标志组 */
  102.     /* 网卡初始化 */
  103.     ESP_ERROR_CHECK(esp_netif_init());
  104.     /* 创建新的事件循环 */
  105.     ESP_ERROR_CHECK(esp_event_loop_create_default());
  106.     sta_netif= esp_netif_create_default_wifi_sta();
  107.     assert(sta_netif);
  108.     wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
  109. ESP_ERROR_CHECK( esp_event_handler_register(WIFI_EVENT, ESP_EVENT_ANY_ID,
  110.                                             &wifi_event_handler, NULL) );
  111. ESP_ERROR_CHECK( esp_event_handler_register(IP_EVENT, IP_EVENT_STA_GOT_IP,
  112.                                             &wifi_event_handler, NULL) );
  113.     ESP_ERROR_CHECK(esp_wifi_init(&cfg));   
  114.     wifi_config_t  wifi_config = WIFICONFIG();
  115.     ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));
  116.     ESP_ERROR_CHECK( esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config) );
  117.     ESP_ERROR_CHECK(esp_wifi_start());

  118.     /* 等待链接成功后、ip生成 */
  119.     EventBits_t bits = xEventGroupWaitBits(wifi_event,
  120.             WIFI_CONNECTED_BIT | WIFI_FAIL_BIT,
  121.             pdFALSE,
  122.             pdFALSE,
  123.             portMAX_DELAY);

  124.     /* 判断连接事件 */
  125.     if (bits & WIFI_CONNECTED_BIT)
  126.     {
  127.         ESP_LOGI(TAG, "connected to ap SSID:%s password:%s",
  128.                  DEFAULT_SSID, DEFAULT_PWD);
  129.     }
  130.     else if (bits & WIFI_FAIL_BIT)
  131.     {
  132.         connet_display(1);
  133.     }
  134.     else
  135.     {
  136.         ESP_LOGE(TAG, "UNEXPECTED EVENT");
  137.     }

  138.     vEventGroupDelete(wifi_event);
  139. }

  140. /**
  141. * @brief       程序入口
  142. * @param       无
  143. * @retval      无
  144. */
  145. void app_main(void)
  146. {
  147.     /* 省略代码...... */
  148.     wifi_sta_init();

  149.     while (1)
  150.     {
  151.         LED_TOGGLE();
  152.         vTaskDelay(500);
  153.     }
  154. }
复制代码
       从上述源码中,作者首先创建了事件组、WiFi事件回调函数,并配置WiFi为STA模式。当系统搜索到可连接的热点时,它会尝试与该热点建立连接。如果连接成功,则会在LCD上显示连接信息,并发送一个连接事件标志。如果连接失败,系统会尝试发送20次连接请求,直到没有收到任何连接回复为止。此时,会发送一个连接失败事件标志。通过查看这些连接事件标志,我们可以确定热点是否成功连接。

       49.3 下载验证
       程序下载成功后,需要利用手机或其他设备创建一个WiFi热点。在创建热点时,需要注意提供正确的账号名和密码,以确保程序能够成功连接。同时,确保程序中要连接的热点账号与密码与所创建的热点一致。当LCD显示热点的账号名和密码时,此时ESP32-S3设备已经与热点连接成功了,否则,LCD提示连接失败,如下图所示:

第四十九章 WiFi路由实验5422.png
图49.3.1 SPILCD显示效果图


回复

使用道具 举报

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

本版积分规则


关闭

原子哥极力推荐上一条 /1 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-11-18 19:12

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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