注意大小写,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
cs
#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(); //连接WiFi
printf("WiFi连接断开,正在重新连接...\n");
}
else if(event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) {
// WiFi station got IP address
printf("获取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-configuration
esp_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(); //启动wifi
printf("WIFI启动完成!\n");
}
三、WIFI.h
cs
#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
cs
# components/WIFI/CMakeLists.txt
idf_component_register(
SRCS "WIFI.c"
INCLUDE_DIRS "."
REQUIRES
esp_wifi
esp_event
esp_netif
nvs_flash
esp_system
OLED
)
五、说明
①
cs
在 C/C++ 中
#pragma once
和
#ifndef ... #define ... #endif
作用一样。后者兼容性高且通用,前者方便