注意大小寫,wsl(也就是linux環境)嚴格區分大小寫。有幫助記得訂閱專欄+點贊,當前不定期持續更新。
一、文件夾格式
oled1/ # 項目根目錄
├─ main/ # 主程序文件夾
│ ├─ main.c # 主函數文件(包含 app_main)
│ └─ CMakeLists.txt # main 組件的編譯配置
├─ components/ # 自定義組件目錄(與 main 同級)
│ └─ WIFI/ # WIFI 組件
│ ├─ WIFI.c # WIFI 功能實現
│ ├─ WIFI.h # WIFI 頭文件(聲明函數、宏等)
│ └─ CMakeLists.txt # WIFI 組件的編譯配置
├─ CMakeLists.txt # 項目根目錄編譯配置(指定項目名稱、依賴等)
├─ sdkconfig # ESP-IDF 配置文件(由 menuconfig 生成)
└─ partitions.csv # 分區表配置文件(可選,默認使用 ESP-IDF 自帶)
二、WIFI.c
#include "WIFI.h"void my_esp_event(void* event_handler_arg, esp_event_base_t event_base,int32_t event_id, void* event_data)
{if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_DISCONNECTED) {esp_wifi_connect(); //連接WiFiprintf("WiFi連接斷開,正在重新連接...\n");}else if(event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) {// WiFi station got IP addressprintf("獲取IP地址成功!\n");ip_event_got_ip_t* event = (ip_event_got_ip_t*) event_data; char ip_str[16];sprintf(ip_str, IPSTR, IP2STR(&event->ip_info.ip)); //獲取ip地址printf("IP的地址是: %s\n", ip_str);}
}void init_Wifi()
{//一、初始化nvs_flash_init();esp_netif_init(); //初始化nvs和網絡接口esp_event_loop_create_default(); //創建事件循環(接收wifi信號變化,獲取ip啥的,都需要在事件循環里處理)esp_netif_create_default_wifi_sta(); //創建按wifi station(工作站)模式的網絡接口printf("WIFI初始化結束!\n");//二、注冊wifi和ip的事件回調//wifi事件回調esp_event_handler_instance_t wifi_event_handler;esp_event_handler_instance_register(WIFI_EVENT, //wifi事件 ESP_EVENT_ANY_ID, //任何wifi事件都觸發下面的回調函數&my_esp_event, //回調函數NULL, //用戶數據&wifi_event_handler); //事件回調句柄//ip事件回調esp_event_handler_instance_t ip_event_handler;esp_event_handler_instance_register(IP_EVENT, //ip事件IP_EVENT_STA_GOT_IP, //只關注獲取ip的事件&my_esp_event, //回調函數NULL, //數據&ip_event_handler); //事件回調句柄printf("WIFI和IP事件注冊回調完成!\n");//wifi配置與啟動//配置wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); //默認配置 cfg-configurationesp_wifi_init(&cfg);esp_wifi_set_mode(WIFI_MODE_STA);wifi_interface_t interface = WIFI_IF_STA; //設置wifi接口為工作站模式wifi_config_t wifi_sta_config = {.sta = {.ssid = User_Wifi_SSID, //替換為你的WiFi SSID.password = User_Wifi_PassWord, //替換為你的WiFi密碼.threshold.authmode = WIFI_AUTH_WPA2_PSK, //認證方式},};//wifi配置,wifi_sta_config是工作站模式的配置,sta_config是配置wifi賬號、密碼,和wifi的認證方式esp_wifi_set_config(interface, &wifi_sta_config); esp_wifi_start(); //啟動wifiprintf("WIFI啟動完成!\n");
}
三、WIFI.h
#pragma once#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "esp_log.h"
#include "esp_wifi.h"
#include "esp_event.h"
#include "nvs_flash.h"
#include "esp_netif.h" #include "OLED.h"#define User_Wifi_SSID "QL.ql" //你的wifi名字(建議英文),建議使用2.4G頻段,不然可能連接不上
#define User_Wifi_PassWord "Ql.qlGood" //你的wifi密碼void init_Wifi();
四、CMakeList.txt
# components/WIFI/CMakeLists.txt
idf_component_register(SRCS "WIFI.c"INCLUDE_DIRS "."REQUIRES esp_wifi esp_event esp_netifnvs_flashesp_systemOLED
)
五、說明
①
在 C/C++ 中
#pragma once
和
#ifndef ... #define ... #endif
作用一樣。后者兼容性高且通用,前者方便
②需要更改成自己wifi賬號密碼的去修改WIFI.h的宏定義,有備注
③WIFI用到的官方組件比較多,注意CMakeList.txt的組件依賴聲明和WIFI.h的引用頭文件。如果直接引用庫但是沒有包含依賴,會報錯。
六、參考
esp32-s3 IDF 連接wifi_嗶哩嗶哩_bilibili