注:使用VSCode中的ESP-IDF插件进行开发,笔记基于B站UP主艾谷科技的视频教程

ESP32S3+ESPIDF入门教程 程序纯手打 手把手教学 中文字幕 持续更新中_哔哩哔哩_bilibili


目录

一、WIFI简介

WIFI简介

拓扑简介

常见网络名词

二、ESP32S3—WIFI功能简介

三、WIFI工作流程

nvs_flash_init(void);        

esp_netif_init(void);

esp_event_loop_create_default(void);

esp_event_handler_register(esp_event_base_t event_base, int32_t event_id,esp_event_handler_t event_handler, void* event_handler_arg);

esp_netif_create_default_wifi_sta(void);

esp_wifi_init(const wifi_init_config_t *config);

esp_wifi_set_mode(wifi_mode_t mode);

esp_wifi_set_config(wifi_interface_t interface, wifi_config_t *conf);

esp_wifi_start(void);

esp_wifi_connect(void);

esp_wifi_stop(void);

六、建立工程项目

    (1).复制工程文件夹

        (2).在VSCode中打开新的工程文件夹

        (3).在components中的CMakeList文件中添加WIFISTA文件路径

        (4).编写WIFISTA.c文件

        (5).编写WIFISTA.h文件

        (6).编写main.c文件

        (7).编译

        (8).连接电路

        (9).下载并运行


一、WIFI简介

WIFI简介

  • WIFI是无线局域网(WLAN)的商用俗称。无线局域网(Wireless Local Area Network,WLAN)是基于IEEE 802.11系列标准制定的无线联网技术。
  • WIFI的工作模式:STA(站点模式)、AP(接入点模式)、AP+STA(混合模式)
  • 按照频段分类:
    •  2.4GHz频段:国际标准频率范围2.400GHz~2.4835GHz
    • 5GHz频段:国际标准频率范围5.150GHz~5.825GHz
  • 按照IEEE 802.11标准号分类: 

        802.11b、802.11g、802.11n、802.11ac、802.11ax、802.11be

  

拓扑简介

  • 网络拓扑指计算机网络中节点(如计算机、服务器、路由器等)与通信链路(如电缆、无线连接等)的物理或逻辑排列方式。
  • 网络拓扑决定了数据在网络中的传输路径、效率和可靠性。
  • 在嵌入式领域,星型拓扑是最常用、最主流的拓扑结构。

  

  

常见网络名词

  • 客户端:客户端是指向服务器请求服务或资源的终端设备或软件。常见的客户端包括浏览器、移动应用、桌面程序等。客户端通常负责用户交互,向服务器发送请求并接收响应。
  • 服务端:服务端是为客户端提供数据、资源或计算服务的设备或软件。它接收客户端的请求,处理逻辑(如数据库查询、文件传输等),并返回结果。常见的服务端包括Web服务器(如Nginx、Apache)、数据库服务器(如MySQL)等。
  • 路由器:路由器是网络设备,负责在不同网络之间转发数据包。它通过路由表确定数据的最佳传输路径,实现局域网(LAN)与广域网(WAN)的互联。现代路由器通常兼具防火墙、NAT(网络地址转换)等功能。
  • IP地址:IP地址是互联网协议地址,用于唯一标识网络中的设备。分为IPv4(如192.168.1.1)和IPv6(如2001:0db8::1)两种格式。IP地址分为公网地址(全球唯一)和私有地址(局域网内使用,如10.0.0.0/8)。
  • LWIP协议栈:LWIP(Lightweight IP)是一个轻量级的TCP/IP协议栈,专为嵌入式系统设计。它支持IPv4/IPv6、TCP、UDP、DHCP等协议,占用资源少,适合内存受限的设备(如单片机)。广泛应用于物联网(IoT)和实时操作系统(如FreeRTOS)。

二、ESP32S3—WIFI功能简介

  • ESP32S3内部集成了无线局域网(WALN)模块;
  • 工作频段:仅支持2.4GHz
  • 标准:符合802.11b/g/n标准(即仅支持WIFI4及以下的标准)
  • 工作模式:STA(站点模式)、AP(接入点模式)、STA+AP(混合模式)

三、WIFI工作流程

nvs_flash_init(void);        

  • 该函数没有参数,且为通用步骤,可以放在main函数中执行,注意包含"nvs_flash.h"头文件
  • 该函数用于初始化NVS

esp_netif_init(void);

  • 该函数没有参数
  • 该函数用于初始化LWIP协议栈

esp_event_loop_create_default(void);

  • 该函数没有参数
  • 该函数用于创建循环事件组

esp_event_handler_register(esp_event_base_t event_base, int32_t event_id,esp_event_handler_t event_handler, void* event_handler_arg);

  • 参数
    •  event_base:事件组,WIFI部分的是WIFI_EVENT和IP_EVENT事件组
    • event_id:表示要监听的数据,可以选择其中的其部分进行监听,也可以选择全部监听(由WIFI_EVENT跳转定义可以看到所有的WIFI_EVENT事件) 
    •  event_handler:事件回调函数,当WIFI_EVENT和IP_EVENT事件组中的事件发生时,会调用该函数进行处理
    •  event_handler_arg:事件回调函数中需要传入的参数,该参数会在事件回调函数中使用。
  • 该函数用于向循环事件组中注册要监听的事件组及事件编号,并创建事件函数

esp_netif_create_default_wifi_sta(void);

  • 该函数没有参数
  • 该函数用于将STA模块/AP模块与LWIP协议栈单元连接

esp_wifi_init(const wifi_init_config_t *config);

  • 参数
    •  config:结构体指针,需要创建新的结构体,但此处不需要引出所有成员,官方文件中已经将所有的参数都配置好,调用头文件即可(该宏定义位于wifi_init_config_t 跳转定义后的文件的222行:WIFI_INIT_CONFIG_DEFAULT)
  • 该函数用于初始化与WIFI相关的底层硬件

esp_wifi_set_mode(wifi_mode_t mode);

  • 参数:
    • mode:选择WIFI的工作模式,可以设置为STA模式、AP模式、APSTA模式和NAN模式
  • 该函数用于设置WIFI模块的工作模式

esp_wifi_set_config(wifi_interface_t interface, wifi_config_t *conf);

  • 参数:
    • interface:选择配置哪一个模式的参数
    • conf:结构体,需要创建新的结构体,并引出结构体成员
    • wifi_config_t wifi_config = {

                  .sta = {

                          .ssid = WIFI_SSID,         //设置WIFI名称,可选择在.h文件中宏定义

                          .password = WIFI_PASSWORD,            //WIFI密码

                  }仅需要引出上面的两个结构体成员

          };该结构体成员是一个联合体,同一时间只能配置一个

  • 该函数用于配置STA模式/AP模式的参数

esp_wifi_start(void);

  • 该函数没有参数
  • 该函数用于启动WIFI模块

esp_wifi_connect(void);

  • 该函数没有参数
  • 该函数用于启动WIFI连接

    esp_wifi_stop(void);

    • 该函数没有参数
    • 该函数用于关闭WIFI模块

    六、建立工程项目

        (1).复制工程文件夹

                    复制SPILCD的工程文件夹,并改名为WIFISTA,在components文件夹下创建新的文件夹并取名WIFISTA,在WIFISTA文件夹中创建相应的WIFISTA.c、WIFISTA.h文件。

            (2).在VSCode中打开新的工程文件夹

                    打开工程文件后,先点击垃圾桶按钮清理之前编译程序产生的中间文件,清理完成后再进行编译。

            (3).在components中的CMakeList文件中添加WIFISTA文件路径

            (4).编写WIFISTA.c文件

    #include "WIFISTA.h"
    #include "esp_wifi.h"
    #include "lcd.h"
    #include "esp_event.h"
    
    void wifista_event_handler(void* event_handler_arg,esp_event_base_t event_base,int32_t event_id,void* event_data)
    {
        if(event_base == WIFI_EVENT ) 
        {
            
            if(event_id == WIFI_EVENT_STA_START)
            {
                esp_wifi_connect();
            }
            else if(event_id == WIFI_EVENT_STA_CONNECTED)
            {
                LCD_ShowString( 1, 1,"connected   ", YELLOW, BLACK, 16, 0);//显示连接状态
    
            }
            else if(event_id == WIFI_EVENT_STA_DISCONNECTED)
            {
                LCD_ShowString( 1, 1,"disconnected", YELLOW, BLACK, 16, 0);
                LCD_ShowString( 0, 16,"                                            ", BLACK, BLACK, 16, 0);
                //可追加额外操作,可以选择断网重新连接
                esp_wifi_connect();
                //esp_wifi_stop();
            }
        }
        else if(event_base == IP_EVENT) 
        {
        	if(event_id == IP_EVENT_STA_GOT_IP)
            {             
                ip_event_got_ip_t *event = (ip_event_got_ip_t *)event_data;
                esp_netif_ip_info_t *ip_info = &event->ip_info;
    
                //esp_netif_ip_info_t *event = (esp_netif_ip_info_t *)event_data;    
                //定义一个结构体指针将返回的参数放入返回函数的参数中,注意此处需要将event_data转换为结构体指针类型
                //返回类型为uint32_t,需要用ESP-IDF提供的宏定义将返回值转换为0.0.0.0的IP地址格式
                //宏定义在IP_EVENT跳转后,再esp_ip4_addr_t跳转声明,在那个文档的50~53的宏定义
                LCD_ShowIntNum(0, 16,  esp_ip4_addr1_16(&ip_info->ip), 3, GREEN, BLACK, 16); 
                LCD_ShowString(24, 16, ".", GREEN, BLACK, 16, 0);
                LCD_ShowIntNum(32, 16, esp_ip4_addr2_16(&ip_info->ip), 3, GREEN, BLACK, 16); 
                LCD_ShowString(56, 16, ".", GREEN, BLACK, 16, 0);
                LCD_ShowIntNum(64, 16,  esp_ip4_addr3_16(&ip_info->ip), 3, GREEN, BLACK, 16); 
                LCD_ShowString(88, 16, ".", GREEN, BLACK, 16, 0);
                LCD_ShowIntNum(96, 16,  esp_ip4_addr4_16(&ip_info->ip), 3, GREEN, BLACK, 16);
            }
        }
    }
    
    void wifista_init(void) 
    {
    	//初始化NVS是通用步骤放在main.c中进行
        esp_netif_init();
        esp_event_loop_create_default();
        esp_event_handler_register(WIFI_EVENT, ESP_EVENT_ANY_ID, &wifista_event_handler, NULL);
        //esp_event_base_t事件组当前需要了解的是WIFI_EVENT和IP_EVENT事件组
        //第二个参数表示要监听的事件,可以选择其中的其部分进行监听,也可以选择全部监听(由WIFI_EVENT跳转定义可以看到所有的WIFI_EVENT事件)
        //跳转到函数声明中可以看到监听全部事件组的宏定义(ESP_EVENT_ANY_BASE表示所有事件组,ESP_EVENT_ANY_ID表示所有事件编号)
        //第三个参数表示事件回调函数,当WIFI_EVENT和IP_EVENT事件组中的事件发生时,会调用该函数进行处理
        //第四个参数表示事件回调函数中需要传入的参数,该参数会在事件回调函数中使用,这里我们传入NULL,表示不传入参数
        esp_event_handler_register(IP_EVENT, IP_EVENT_STA_GOT_IP, &wifista_event_handler, NULL);
        esp_netif_create_default_wifi_sta();//创建默认的WIFI STA接口
    
        wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();  //此处官方已经给这些参数配置好了默认值,只需要调用宏定义即可
        esp_wifi_init(&cfg);//初始化WIFI
    
        esp_wifi_set_mode(WIFI_MODE_STA);//设置为WIFI STA模式
    
        wifi_config_t wifi_config = {
                .sta = {
                        .ssid = WIFI_SSID,                    //设置WIFI名称,可选择在.h文件中宏定义
                        .password = WIFI_PASSWORD,            //WIFI密码
                }
        };
        //wifi_config_t是一个联合体,同一时间只能配置一个,此处配置为STA模式
        esp_wifi_set_config(WIFI_IF_STA, &wifi_config);//设置WIFI配置
        //第一个参数用于选择配置哪一个模式的参数
        //第二个参数用于设置WIFI配置 
        
        esp_wifi_start();//启动WIFI
        
    }

            (5).编写WIFISTA.h文件

    #ifndef _WIFISTA_H
    #define _WIFISTA_H
    
    #define WIFI_SSID "改为需要接入的WIFI的名称"
    #define WIFI_PASSWORD "改为需要接入WIFI的密码"
    
    void wifista_init(void);
    
    #endif
    

            (6).编写main.c文件

    #include <stdio.h>
    #include "freertos/FreeRTOS.h"
    #include "freertos/task.h"
    #include "driver/gpio.h"
    #include "lcd.h"
    #include "lcdinit.h"
    #include "spi.h"
    #include "WIFISTA.h"
    #include "nvs_flash.h"
    
    void app_main(void)
    {
        nvs_flash_init(); //wifi使用第一步是初始化nvs_flash
        LCD_Init();
        LCD_Fill(0, 0, 128, 160, BLACK);
        wifista_init();
    
        while(1) {
            
            vTaskDelay(500);
        }
    }
    

            (7).编译

            (8).连接电路

            (9).下载并运行

                    当成功连接提前设置好的WIFI会在屏幕上显示connected,同时在下一行显示开发板的IP地址;否则显示disconnected

    Logo

    智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

    更多推荐