diff --git a/README.md b/README.md index f64eefb..39579e8 100644 --- a/README.md +++ b/README.md @@ -45,36 +45,36 @@ ### 当前进度: -| 章节 | 教程 | 文字教程 | 视频教程 | 配套代码 | 完成日期 | -| -------------- | -------------------- | :----------: | :--: | :--: | ---------- | -| 一、认识ESP32 | 1.1 ESP32介绍 | ✔ | ✔ | 无 | 2025/1/3 | -| 一、认识ESP32 | 1.2 ESP32开发环境搭建 | ✔ | ✔✔✔ | 无 | 2025/1/4-6 | -| 一、认识ESP32 | 1.3 idf.py的基本使用 | ✔ | ✔ | 无 | 2025/1/7 | -| 二、IDF基础与工具使用 | 2.1 ESP32工程结构及构建 | ✔ | ✔ | ✔ | 2025/1/9 | -| 二、IDF基础与工具使用 | 2.2 ESP-IDF项目配置 | ✔ | ✔ | ✔ | 2025/1/21 | -| 二、IDF基础与工具使用 | 2.3 ESP-IDF自定义组件 | ✔ | ✔ | ✔ | 2025/1/22 | -| 二、IDF基础与工具使用 | 2.4 ESP-IDF组件管理器 | ✔ | ✔ | ✔ | 2025/1/24 | -| 三、FreeRTOS基础 | 3.1 FreeRTOS概述 | ⏳ | ⏳ | 无 | | -| 三、FreeRTOS基础 | 3.2 FreeRTOS多任务与任务管理 | ⏳ | | | | -| 三、FreeRTOS基础 | 3.3 FreeRTOS任务看门狗 | ⏳ | | | | -| 四、外设学习 | 4.1.1 GPIO入门 | ✔ | | | | -| 四、外设学习 | 4.1.2 UART串口通信 | ✔ | | | | -| 四、外设学习 | 4.1.3 硬件定时器 | ✔ | | | | -| 四、外设学习 | 4.1.4 ADC模数转换 | ✔ | | | | -| 四、外设学习 | 4.1.5 DAC数模转换 | ✔ | | | | -| 四、外设学习 | 4.1.6 LED PWM控制 | ✔ | | | | -| 四、外设学习 | 4.1.7 I2C通信 | ✔(新版I2C暂未更新) | | | | -| 四、外设学习 | 4.1.8 SPI通信 | ⏳ | | | | -| 四、外设学习 | 4.2.1 分区表设计 | ✔ | | | | -| 四、外设学习 | 4.2.2 非易失性存储 | ✔ | | | | -| 四、外设学习 | 4.2.3 FAT文件系统 | ✔ | | | | -| 四、外设学习 | 4.2.4 SPIFFS文件系统 | ✔ | | | | -| 五、FreeRTOS进阶 | 5.1 FreeRTOS队列使用教程 | ✔ | | | | -| 五、FreeRTOS进阶 | 5.2 FreeRTOS信号量教程 | ✔ | | | | -| 五、FreeRTOS进阶 | 5.3 FreeRTOS互斥量教程 | ✔ | | | | -| 五、FreeRTOS进阶 | 5.4 FreeRTOS事件组教程 | ✔ | | | | -| 五、FreeRTOS进阶 | 5.5 FreeRTOS任务通知教程 | ✔ | | | | -| 五、FreeRTOS进阶 | 5.6 FreeRTOS软件定时器教程 | ✔ | | | | +| 章节 | 小节内容 | 📄文字教程 | 📺视频教程 | 💾配套代码 | 完成日期 | +| ------------ | -------------------- | :----------: | :----: | :----: | ---------- | +| 一、认识ESP32 | 1.1 ESP32介绍 | ✔ | ✔ | 无 | 2025/1/3 | +| 一、认识ESP32 | 1.2 ESP32开发环境搭建 | ✔ | ✔✔✔ | 无 | 2025/1/4-6 | +| 一、认识ESP32 | 1.3 idf.py的基本使用 | ✔ | ✔ | 无 | 2025/1/7 | +| 二、IDF基础与工具使用 | 2.1 ESP32工程结构及构建 | ✔ | ✔ | ✔ | 2025/1/9 | +| 二、IDF基础与工具使用 | 2.2 ESP-IDF项目配置 | ✔ | ✔ | ✔ | 2025/1/21 | +| 二、IDF基础与工具使用 | 2.3 ESP-IDF自定义组件 | ✔ | ✔ | ✔ | 2025/1/22 | +| 二、IDF基础与工具使用 | 2.4 ESP-IDF组件管理器 | ✔ | ✔ | ✔ | 2025/1/24 | +| 三、FreeRTOS基础 | 3.1 FreeRTOS概述 | ⏳ | ⏳ | 无 | | +| 三、FreeRTOS基础 | 3.2 FreeRTOS多任务与任务管理 | ⏳ | | | | +| 三、FreeRTOS基础 | 3.3 FreeRTOS任务看门狗 | ⏳ | | | | +| 四、外设学习 | 4.1.1 GPIO入门 | ✔ | | | | +| 四、外设学习 | 4.1.2 UART串口通信 | ✔ | | | | +| 四、外设学习 | 4.1.3 硬件定时器 | ✔ | | | | +| 四、外设学习 | 4.1.4 ADC模数转换 | ✔ | | | | +| 四、外设学习 | 4.1.5 DAC数模转换 | ✔ | | | | +| 四、外设学习 | 4.1.6 LED PWM控制 | ✔ | | | | +| 四、外设学习 | 4.1.7 I2C通信 | ✔(新版I2C暂未更新) | | | | +| 四、外设学习 | 4.1.8 SPI通信 | ⏳ | | | | +| 四、外设学习 | 4.2.1 分区表设计 | ✔ | | | | +| 四、外设学习 | 4.2.2 非易失性存储 | ✔ | | | | +| 四、外设学习 | 4.2.3 FAT文件系统 | ✔ | | | | +| 四、外设学习 | 4.2.4 SPIFFS文件系统 | ✔ | | | | +| 五、FreeRTOS进阶 | 5.1 FreeRTOS队列使用教程 | ✔ | | | | +| 五、FreeRTOS进阶 | 5.2 FreeRTOS信号量教程 | ✔ | | | | +| 五、FreeRTOS进阶 | 5.3 FreeRTOS互斥量教程 | ✔ | | | | +| 五、FreeRTOS进阶 | 5.4 FreeRTOS事件组教程 | ✔ | | | | +| 五、FreeRTOS进阶 | 5.5 FreeRTOS任务通知教程 | ✔ | | | | +| 五、FreeRTOS进阶 | 5.6 FreeRTOS软件定时器教程 | ✔ | | | |
@@ -110,27 +110,27 @@ 本节主要介绍ESP32的基本概念,包括其硬件特点、应用场景及功能优势。通过本节内容,初学者可以快速了解ESP32的核心能力以及在物联网开发中的广泛应用。 -- 在线文字教程:[ESP32介绍.md](docs/01.认识ESP32/1.1-ESP32介绍/ESP32介绍.md) -- 在线视频教程:[ESP32介绍](https://www.bilibili.com/video/BV1u861YHEso/?spm_id_from=333.1007.top_right_bar_window_history.content.click&vd_source=ef5a0ab0106372751602034cdd9ab98e) +- 📄在线文字教程:[ESP32介绍.md](docs/01.认识ESP32/1.1-ESP32介绍/ESP32介绍.md) +- 📺在线视频教程:[ESP32介绍](https://www.bilibili.com/video/BV1u861YHEso/?spm_id_from=333.1007.top_right_bar_window_history.content.click&vd_source=ef5a0ab0106372751602034cdd9ab98e) ### 1.2 ESP32开发环境搭建 本节将详细讲解如何在不同操作系统(Windows/Linux/Mac)上搭建ESP-IDF开发环境,涵盖工具链安装、环境变量配置及调试工具的准备等内容。通过本节,读者可以完成开发环境的搭建,为后续开发做好准备。 -- 在线文字教程-1:[环境搭建-Windows.md](docs/01.认识ESP32/1.2-ESP32开发环境搭建/1.环境搭建-Windows.md) -- 在线文字教程-2:[环境搭建-Ubuntu虚拟机.md](docs/01.认识ESP32/1.2-ESP32开发环境搭建/2.环境搭建-Ubuntu虚拟机.md) -- 在线文字教程-3:[环境搭建-Windows与虚拟机组合使用.md](docs/01.认识ESP32/1.2-ESP32开发环境搭建/3.环境搭建-Windows与虚拟机组合使用.md) -- 在线视频教程-1:[认识ESP32—1.2.1 Win下安装ESP-IDF开发环境](https://www.bilibili.com/video/BV14o62YQEBC?vd_source=ef5a0ab0106372751602034cdd9ab98e&spm_id_from=333.788.videopod.sections) -- 在线视频教程-2:[认识ESP32—1.2.2 Linux下安装ESP-IDF开发环境](https://www.bilibili.com/video/BV1vLrKYHExy/?vd_source=ef5a0ab0106372751602034cdd9ab98e#reply251069588753) -- 在线视频教程-3:[认识ESP32—1.2.3 Windows下使用ssh调用Linux系统下的开发环境](https://www.bilibili.com/video/BV1vLrKYHExy/?vd_source=ef5a0ab0106372751602034cdd9ab98e#reply251069588753) +- 📄在线文字教程-1:[环境搭建-Windows.md](docs/01.认识ESP32/1.2-ESP32开发环境搭建/1.环境搭建-Windows.md) +- 📄在线文字教程-2:[环境搭建-Ubuntu虚拟机.md](docs/01.认识ESP32/1.2-ESP32开发环境搭建/2.环境搭建-Ubuntu虚拟机.md) +- 📄在线文字教程-3:[环境搭建-Windows与虚拟机组合使用.md](docs/01.认识ESP32/1.2-ESP32开发环境搭建/3.环境搭建-Windows与虚拟机组合使用.md) +- 📺在线视频教程-1:[认识ESP32—1.2.1 Win下安装ESP-IDF开发环境](https://www.bilibili.com/video/BV14o62YQEBC?vd_source=ef5a0ab0106372751602034cdd9ab98e&spm_id_from=333.788.videopod.sections) +- 📺在线视频教程-2:[认识ESP32—1.2.2 Linux下安装ESP-IDF开发环境](https://www.bilibili.com/video/BV1vLrKYHExy/?vd_source=ef5a0ab0106372751602034cdd9ab98e#reply251069588753) +- 📺在线视频教程-3:[认识ESP32—1.2.3 Windows下使用ssh调用Linux系统下的开发环境](https://www.bilibili.com/video/BV1vLrKYHExy/?vd_source=ef5a0ab0106372751602034cdd9ab98e#reply251069588753) ### 1.3 初试ESP32-IDF.py的基本使用 本节通过“Hello World”示例代码,指导读者创建第一个ESP32工程,并完成编译、烧录及运行调试流程。通过本节内容,初学者可以初步体验ESP-IDF的开发流程,快速进入ESP32开发的世界。 -- 在线文字教程:[ESP32初体验-idf.py的基本使用.md](docs/01.认识ESP32/1.3-初试ESP32-idf.py的基本使用/idf.py的基本使用.md) -- 在线视频教程:[ESP32初体验-idf.py的基本使用](https://www.bilibili.com/video/BV1VLrSY3E15?spm_id_from=333.788.videopod.sections&vd_source=ef5a0ab0106372751602034cdd9ab98e) -- 教程配套代码:[hello_world](https://github.com/DuRuofu/ESP32-Guide/tree/main/code/01.start/hello_world) +- 📄在线文字教程:[ESP32初体验-idf.py的基本使用.md](docs/01.认识ESP32/1.3-初试ESP32-idf.py的基本使用/idf.py的基本使用.md) +- 📺在线视频教程:[ESP32初体验-idf.py的基本使用](https://www.bilibili.com/video/BV1VLrSY3E15?spm_id_from=333.788.videopod.sections&vd_source=ef5a0ab0106372751602034cdd9ab98e) +- 💾教程配套代码:[ESP32-Guide/code/01.start/hello_world](https://github.com/DuRuofu/ESP32-Guide/tree/main/code/01.start/hello_world) --- @@ -142,33 +142,33 @@ 本节详细介绍ESP-IDF项目的基本目录结构,包括CMake工具的基础知识,帮助读者掌握ESP32工程的整体组织方式,为日后开发复杂项目奠定基础。 -- 在线文字教程:[ESP32工程结构.md](docs/02.ESP-IDF基础/2.1-ESP32工程结构/ESP-IDF的工程结构.md) -- 在线视频教程:[ESP32工程结构](https://www.bilibili.com/video/BV1CfrzYcEkK/?spm_id_from=333.1387.homepage.video_card.click&vd_source=ef5a0ab0106372751602034cdd9ab98e) -- 教程配套代码:[基础工程模板代码](https://github.com/DuRuofu/ESP32-Guide/tree/main/code/02.idf_basic/01/sample_project) +- 📄在线文字教程:[ESP32工程结构.md](docs/02.ESP-IDF基础/2.1-ESP32工程结构/ESP-IDF的工程结构.md) +- 📺在线视频教程:[ESP32工程结构](https://www.bilibili.com/video/BV1CfrzYcEkK/?spm_id_from=333.1387.homepage.video_card.click&vd_source=ef5a0ab0106372751602034cdd9ab98e) +- 💾教程配套代码:[ESP32-Guide/code/02.idf_basic/sample_project](https://github.com/DuRuofu/ESP32-Guide/tree/main/code/02.idf_basic/sample_project) ### 2.2 ESP-IDF项目配置 本节将重点讲解如何使用`menuconfig`工具配置项目,包含常见的配置选项及其实际用途。通过本节学习,读者可以根据项目需求快速定制和优化ESP32项目配置。 -- 在线文字教程:[ESP-IDF项目配置.md](docs/02.ESP-IDF基础/2.2-ESP-IDF项目配置/ESP-IDF项目配置.md) -- 在线视频教程:[ESP-IDF项目配置详解](https://www.bilibili.com/video/BV15xwbeiEnD/) -- 教程配套代码:[项目配置示例代码](https://github.com/DuRuofu/ESP32-Guide/tree/main/code/02.idf_basic/02) +- 📄在线文字教程:[ESP-IDF项目配置.md](docs/02.ESP-IDF基础/2.2-ESP-IDF项目配置/ESP-IDF项目配置.md) +- 📺在线视频教程:[ESP-IDF项目配置详解](https://www.bilibili.com/video/BV15xwbeiEnD/) +- 💾教程配套代码:[ESP32-Guide/code/02.idf_basic/config](https://github.com/DuRuofu/ESP32-Guide/tree/main/code/02.idf_basic/config) ### 2.3 ESP-IDF自定义组件 本节讲解如何创建和管理ESP-IDF的自定义组件,包括组件的目录结构、声明与调用方法,以及组件的复用和共享技巧,帮助读者构建模块化项目。 -- 在线文字教程:[ESP-IDF自定义组件.md](docs/02.ESP-IDF基础/2.3-ESP-IDF自定义组件/ESP-IDF自定义组件.md) -- 在线视频教程:[ESP-IDF自定义组件](https://www.bilibili.com/video/BV182ftYHEox/?spm_id_from=333.1387.upload.video_card.click&vd_source=ef5a0ab0106372751602034cdd9ab98e) -- 教程配套代码:[组件示例代码](https://github.com/DuRuofu/ESP32-Guide/tree/main/code/02.idf_basic/03/blink_component) +- 📄在线文字教程:[ESP-IDF自定义组件.md](docs/02.ESP-IDF基础/2.3-ESP-IDF自定义组件/ESP-IDF自定义组件.md) +- 📺在线视频教程:[ESP-IDF自定义组件](https://www.bilibili.com/video/BV182ftYHEox/?spm_id_from=333.1387.upload.video_card.click&vd_source=ef5a0ab0106372751602034cdd9ab98e) +- 💾教程配套代码:[ESP32-Guide/code/02.idf_basic/blink_component](https://github.com/DuRuofu/ESP32-Guide/tree/main/code/02.idf_basic/blink_component) ### 2.4 ESP-IDF组件管理器 本节重点介绍ESP-IDF组件管理器的功能与使用方法,涵盖如何通过组件管理器导入外部库、配置组件依赖,使用官方提供的外部组件。 -- 在线文字教程:[ESP-IDF组件管理器.md](docs/02.ESP-IDF基础/2.4-ESP-IDF组件管理器/ESP-IDF组件管理器.md) -- 在线视频教程:[ESP-IDF组件管理器详解](https://www.bilibili.com/video/BV1etfHYgE6M/) -- 教程配套代码:[组件管理器示例代码](https://github.com/DuRuofu/ESP32-Guide/tree/main/code/02.idf_basic/04/button_blink) +- 📄在线文字教程:[ESP-IDF组件管理器.md](docs/02.ESP-IDF基础/2.4-ESP-IDF组件管理器/ESP-IDF组件管理器.md) +- 📺在线视频教程:[ESP-IDF组件管理器详解](https://www.bilibili.com/video/BV1etfHYgE6M/) +- 💾教程配套代码:[ESP32-Guide/code/02.idf_basic/button_blink](https://github.com/DuRuofu/ESP32-Guide/tree/main/code/02.idf_basic/button_blink) --- @@ -180,33 +180,33 @@ 本节将介绍FreeRTOS的核心概念,包括实时操作系统的特点、FreeRTOS的基本架构和设计思想,以及其在嵌入式开发中的应用场景,帮助读者快速了解FreeRTOS的基础知识。 -> 在线文字教程:[FreeRTOS概述.md](docs/03.FreeRTOS基础/3.1-FreeRTOS概述/FreeRTOS概述.md) -> 在线视频教程:[FreeRTOS概述讲解] +- 📄在线文字教程:[FreeRTOS概述.md](docs/03.FreeRTOS基础/3.1-FreeRTOS概述/FreeRTOS概述.md) +- 📺在线视频教程:🚧 开发中 ### 3.2 FreeRTOS多任务与任务管理 本节讲解FreeRTOS中的多任务机制及任务管理方法,包括任务创建、任务删除、任务优先级和任务状态的管理。通过本节学习,读者可以初步掌握在FreeRTOS中实现并发任务的基本技巧。 -> 在线文字教程:[FreeRTOS多任务与任务管理.md](docs/03.FreeRTOS基础/3.2-FreeRTOS多任务与任务管理/FreeRTOS多任务与任务管理.md) -> 在线视频教程:[FreeRTOS任务管理详解] -> 教程配套代码:[FreeRTOS多任务示例代码] +- 📄在线文字教程:[FreeRTOS多任务与任务管理.md](docs/03.FreeRTOS基础/3.2-FreeRTOS多任务与任务管理/FreeRTOS多任务与任务管理.md) +- 📺在线视频教程:🚧 开发中 +- 💾教程配套代码:[ESP32-Guide/code/03.freertos_basic/task](https://github.com/DuRuofu/ESP32-Guide/tree/main/code/03.freertos_basic/task) ### 3.3 FreeRTOS任务看门狗 本节讲解 FreeRTOS 中任务看门狗机制的原理包括如何监控任务执行状态、检测任务卡死以及触发系统恢复等功能。通过学习任务看门狗,读者可以掌握提高系统可靠性的重要技巧,确保任务能够在异常情况下得到及时处理。 -> 在线文字教程:[FreeRTOS任务看门狗.md](docs/03.FreeRTOS基础/3.3-FreeRTOS任务看门狗/FreeRTOS任务看门狗.md) -> 在线视频教程:[FreeRTOS任务看门狗] -> 教程配套代码:[FreeRTOS任务看门狗示例代码] +> 📄在线文字教程:[FreeRTOS任务看门狗.md](docs/03.FreeRTOS基础/3.3-FreeRTOS任务看门狗/FreeRTOS任务看门狗.md) +> 📺在线视频教程:🚧 开发中 +> 💾教程配套代码:[ESP32-Guide/code/03.freertos_basic/watchdog](https://github.com/DuRuofu/ESP32-Guide/tree/main/code/03.freertos_basic/watchdog) -### 3.4 软件定时器 (Software Timer) +### 3.4 FreeRTOS软件定时器 (Software Timer) 通过软件定时器实现定时触发任务逻辑,学习其管理及高级用法。 - > 在线文字教程:[FreeRTOS软件定时器](docs/03.FreeRTOS基础/3.4-软件定时器/FreeRTOS软件定时器.md) - > 在线视频教程:[软件定时器开发详解] - > 教程配套代码:[软件定时器示例代码] + > 📄在线文字教程:[FreeRTOS软件定时器.md](docs/03.FreeRTOS基础/3.4-FreeRTOS软件定时器/FreeRTOS软件定时器.md) + > 📺在线视频教程:🚧 开发中 + > 💾教程配套代码:[ESP32-Guide/code/03.freertos_basic/timer](https://github.com/DuRuofu/ESP32-Guide/tree/main/code/03.freertos_basic/timer) --- @@ -220,73 +220,73 @@ 本节介绍GPIO(通用输入输出)的基本功能,包括输入、输出及中断操作。通过实际案例,学习如何控制外部设备并响应硬件信号。 -> 在线文字教程:[GPIO入门](docs/04.外设学习/4.1-基础外设/4.1.1-GPIO/GPIO入门.md) -> 在线视频教程:[GPIO开发详解] -> 教程配套代码:[GPIO示例代码] +> 📄在线文字教程:[外设-GPIO入门.md](docs/04.外设学习/4.1-基础外设/4.1.1-GPIO/GPIO入门.md) +> 📺在线视频教程:🚧 开发中 +> 💾教程配套代码:[ESP32-Guide/code/04.peripheral/basics/gpio](https://github.com/DuRuofu/ESP32-Guide/tree/main/code/04.peripheral/basics/gpio) #### 4.1.2 UART 本节讲解UART串口通信的原理及在ESP32中的实现,内容涵盖UART初始化、数据收发及常见调试方法。 -> 在线文字教程:[UART串口通信](docs/04.外设学习/4.1-基础外设/4.1.2-UART/UART串口通信.md) -> 在线视频教程:[UART开发详解] -> 教程配套代码:[UART示例代码] +> 📄在线文字教程:[外设-UART串口.md](docs/04.外设学习/4.1-基础外设/4.1.2-UART/UART串口通信.md) +> 📺在线视频教程:🚧 开发中 +> 💾教程配套代码:[ESP32-Guide/code/04.peripheral/basics/uart](https://github.com/DuRuofu/ESP32-Guide/tree/main/code/04.peripheral/basics/uart) #### 4.1.3 定时器 本节内容包括ESP32硬件定时器的初始化、配置及应用,通过案例学习如何实现精确的时间控制与定时任务。 -> 在线文字教程:[定时器](docs/04.外设学习/4.1-基础外设/4.1.3-定时器/定时器.md) -> 在线视频教程:[定时器开发详解] -> 教程配套代码:[定时器示例代码] +> 📄在线文字教程:[外设-硬件定时器.md](docs/04.外设学习/4.1-基础外设/4.1.3-定时器/定时器.md) +> 📺在线视频教程:🚧 开发中 +> 💾教程配套代码:[ESP32-Guide/code/04.peripheral/basics/gptimer](https://github.com/DuRuofu/ESP32-Guide/tree/main/code/04.peripheral/basics/gptimer) #### 4.1.4 ADC(模数转换) 本节讲解ESP32的ADC模块,包括采样的基本配置与信号转换,并通过示例学习如何读取模拟信号。 -> 在线文字教程:[ADC模数转换](docs/04.外设学习/4.1-基础外设/4.1.4-ADC/ADC模数转换.md) -> 在线视频教程:[ADC开发详解] -> 教程配套代码:[ADC示例代码] +> 📄在线文字教程:[ADC模数转换.md](docs/04.外设学习/4.1-基础外设/4.1.4-ADC/ADC模数转换.md) +> 📺在线视频教程:🚧 开发中 +> 💾教程配套代码:[ESP32-Guide/code/04.peripheral/basics/adc](https://github.com/DuRuofu/ESP32-Guide/tree/main/code/04.peripheral/basics/adc) #### 4.1.5 DAC(数模转换) 本节讲解DAC模块的基本操作,学习如何将数字信号转换为模拟信号输出。 -> 在线文字教程:[DAC数模转换](docs/04.外设学习/4.1-基础外设/4.1.5-DAC/DAC数模转换.md) -> 在线视频教程:[DAC开发详解] -> 教程配套代码:[DAC示例代码] +> 📄在线文字教程:[DAC数模转换.md](docs/04.外设学习/4.1-基础外设/4.1.5-DAC/DAC数模转换.md) +> 📺在线视频教程:🚧 开发中 +> 💾教程配套代码:[ESP32-Guide/code/04.peripheral/basics/dac](https://github.com/DuRuofu/ESP32-Guide/tree/main/code/04.peripheral/basics/dac) #### 4.1.6 LED PWM 本节介绍LED PWM(脉宽调制)的原理及操作方法,通过实际案例学习如何控制LED亮度。 -> 在线文字教程:[LED PWM控制](docs/04.外设学习/4.1-基础外设/4.1.6-LED_PWM/LED_PWM控制.md) -> 在线视频教程:[PWM开发详解] -> 教程配套代码:[PWM示例代码] +> 📄在线文字教程:[LED PWM控制.md](docs/04.外设学习/4.1-基础外设/4.1.6-LED_PWM/LED_PWM控制.md) +> 📺在线视频教程:🚧 开发中 +> 💾教程配套代码:[ESP32-Guide/code/04.peripheral/basics/led_pwm](https://github.com/DuRuofu/ESP32-Guide/tree/main/code/04.peripheral/basics/led_pwm) #### 4.1.7 I2C 本节讲解I2C通信协议及在ESP32中的实现,内容涵盖设备寻址、数据收发及实际应用。 -> 在线文字教程:[I2C通信](docs/04.外设学习/4.1-基础外设/4.1.7-I2C/I2C通信.md) -> 在线视频教程:[I2C开发详解] -> 教程配套代码:[I2C示例代码] +> 📄在线文字教程:[I2C通信.md](docs/04.外设学习/4.1-基础外设/4.1.7-I2C/I2C通信.md) +> 📺在线视频教程:🚧 开发中 +> 💾教程配套代码:[ESP32-Guide/code/04.peripheral/basics/i2c](https://github.com/DuRuofu/ESP32-Guide/tree/main/code/04.peripheral/basics/i2c) #### 4.1.8 SPI 本节介绍SPI通信协议及其在ESP32中的使用,学习如何通过SPI与外部设备通信。 -> 在线文字教程:[SPI通信](docs/04.外设学习/4.1-基础外设/4.1.8-SPI/SPI通信.md) -> 在线视频教程:[SPI开发详解] -> 教程配套代码:[SPI示例代码] +> 📄在线文字教程:[SPI通信.md](docs/04.外设学习/4.1-基础外设/4.1.8-SPI/SPI通信.md) +> 📺在线视频教程:🚧 开发中 +> 💾教程配套代码:[ESP32-Guide/code/04.peripheral/basics/spi](https://github.com/DuRuofu/ESP32-Guide/tree/main/code/04.peripheral/basics/spi) #### 4.1.9 I2S 本节介绍I2S通信协议及其在ESP32中的使用,学习如何通过I2S与外部设备通信。 -> 在线文字教程:[SPI通信](docs/04.外设学习/4.1-基础外设/4.1.9-I2S/I2S入门.md) -> 在线视频教程:[SPI开发详解] -> 教程配套代码:[SPI示例代码] +> 📄在线文字教程:[I2S通信.md](docs/04.外设学习/4.1-基础外设/4.1.9-I2S/I2S入门.md) +> 📺在线视频教程:🚧 开发中 +> 💾教程配套代码:[ESP32-Guide/code/04.peripheral/basics/i2s](https://github.com/DuRuofu/ESP32-Guide/tree/main/code/04.peripheral/basics/i2s) > ### 4.2 存储外设 @@ -294,51 +294,43 @@ 本节讲解ESP32的分区表结构及设计方法,学习如何规划存储空间以满足不同开发需求。 -> 在线文字教程:[分区表设计](docs/04.外设学习/4.2-存储外设/4.2.1-分区表/分区表.md) -> 在线视频教程:[分区表开发详解] -> 教程配套代码:[分区表示例代码] +> 📄在线文字教程:[分区表设计.md](docs/04.外设学习/4.2-存储外设/4.2.1-分区表/分区表.md) +> 📺在线视频教程:🚧 开发中 +> 💾教程配套代码:[ESP32-Guide/code/04.peripheral/storage/partition](https://github.com/DuRuofu/ESP32-Guide/tree/main/code/04.peripheral/storage/partition) #### 4.2.2 非易失性存储(NVS) 本节介绍NVS的使用方法,学习如何在ESP32中存储和读取持久化数据。 -> 在线文字教程:[非易失性存储](docs/04.外设学习/4.2-存储外设/4.2.2-非易失性存储/非易失性存储.md) -> 在线视频教程:[NVS开发详解] -> 教程配套代码:[NVS示例代码] +> 📄在线文字教程:[非易失性存储.md](docs/04.外设学习/4.2-存储外设/4.2.2-非易失性存储/非易失性存储.md) +> 📺在线视频教程:🚧 开发中 +> 💾教程配套代码:[ESP32-Guide/code/04.peripheral/storage/nvs](https://github.com/DuRuofu/ESP32-Guide/tree/main/code/04.peripheral/storage/nvs) #### 4.2.3 FAT文件系统 本节讲解FAT文件系统的基本操作,学习如何在ESP32中管理文件及目录。 -> 在线文字教程:[FAT文件系统](docs/04.外设学习/4.2-存储外设/4.2.3-FAT文件系统/FAT文件系统.md) -> 在线视频教程:[FAT文件系统开发详解] -> 教程配套代码:[FAT文件系统示例代码] +> 📄在线文字教程:[FAT文件系统.md](docs/04.外设学习/4.2-存储外设/4.2.3-FAT文件系统/FAT文件系统.md) +> 📺在线视频教程:🚧 开发中 +> 💾教程配套代码:[ESP32-Guide/code/04.peripheral/storage/flash_fatfs](https://github.com/DuRuofu/ESP32-Guide/tree/main/code/04.peripheral/storage/flash_fatfs) #### 4.2.4 SPIFFS文件系统 本节介绍SPIFFS文件系统的基本操作,学习如何在ESP32中使用轻量级文件系统进行数据存储与读取。 -> 在线文字教程:[SPIFFS文件系统](docs/04.外设学习/4.2-存储外设/4.2.4-SPIFFS文件系统/SPIFFS文件系统.md) -> 在线视频教程:[SPIFFS开发详解] -> 教程配套代码:[SPIFFS文件系统示例代码] +> 📄在线文字教程:[SPIFFS文件系统.md](docs/04.外设学习/4.2-存储外设/4.2.4-SPIFFS文件系统/SPIFFS文件系统.md) +> 📺在线视频教程:🚧 开发中 +> 💾教程配套代码:[ESP32-Guide/code/04.peripheral/storage/flash_spiffs](https://github.com/DuRuofu/ESP32-Guide/tree/main/code/04.peripheral/storage/flash_spiffs) #### 4.2.5 ESP32存储-SD、SDIO、MMC 驱动 本节介绍ESP32存储-SD、SDIO、MMC 驱动的基本操作. -> 在线文字教程:[SD卡驱动](docs/04.外设学习/4.2-存储外设/4.2.5-SD卡驱动/SD卡驱动.md) -> 在线视频教程:[SPIFFS开发详解] -> 教程配套代码:[SPIFFS文件系统示例代码] - +> 📄在线文字教程:[SD卡驱动.md](docs/04.外设学习/4.2-存储外设/4.2.5-SD卡驱动/SD卡驱动.md) +> 📺在线视频教程:🚧 开发中 +> 💾教程配套代码:[ESP32-Guide/code/04.peripheral/storage/sdmmc](https://github.com/DuRuofu/ESP32-Guide/tree/main/code/04.peripheral/storage/sdmmc) ### 4.3 其他外设 -#### 4.3.1 电机控制脉宽调制器(MCPWM) - -MCPWM 外设是一个多功能 PWM 生成器,集成多个子模块,在电力电子应用(如电机控制、数字电源等)中至关重要。 - -> 在线文字教程:[MCPWM](docs/04.外设学习/4.3-其他外设/4.3.1-MCPWM/MCPWM.md) -> 在线视频教程:[MCPWM开发详解] -> 教程配套代码:[MCPWM示例代码] --- @@ -351,44 +343,40 @@ MCPWM 外设是一个多功能 PWM 生成器,集成多个子模块,在电力 学习FreeRTOS中队列的基本概念及用法,掌握如何在任务之间传递数据,并理解阻塞与优先级特性。 ->在线文字教程:[FreeRTOS队列使用教程](docs/05.FreeRTOS进阶/5.1-队列/FreeRTOS队列使用教程.md) - 在线视频教程:[队列开发详解] - 教程配套代码:[队列示例代码] - -### 5.2 信号量 (Semaphore) +>📄在线文字教程:[FreeRTOS队列使用教程.md](docs/05.FreeRTOS进阶/5.1-队列/FreeRTOS队列使用教程.md) + 📺在线视频教程:🚧 开发中 + 💾教程配套代码:[ESP32-Guide/code/05.freertos_advanced/queue](https://github.com/DuRuofu/ESP32-Guide/tree/main/code/05.freertos_advanced/queue) +### 5.2 信号量 (Semaphore) 和互斥量 (Mutex) 理解信号量的分类(计数信号量与二值信号量),学习如何通过信号量实现任务同步及资源管理。 - > 在线文字教程:[FreeRTOS信号量教程](docs/05.FreeRTOS进阶/5.2-信号量/FreeRTOS信号量教程.md) - > 在线视频教程:[信号量开发详解] - > 教程配套代码:[信号量示例代码] + > 📄在线文字教程:[FreeRTOS信号量教程.md](docs/05.FreeRTOS进阶/5.2-信号量/FreeRTOS信号量教程.md) + > 📺在线视频教程:🚧 开发中 + > 💾教程配套代码:[ESP32-Guide/code/05.freertos_advanced/semphr](https://github.com/DuRuofu/ESP32-Guide/tree/main/code/05.freertos_advanced/semphr) ### 5.3 互斥量 (Mutex) 掌握互斥量的作用及优先级反转问题,学习如何保护共享资源以避免竞争条件。 - > 在线文字教程:[FreeRTOS互斥量教程](docs/05.FreeRTOS进阶/5.3-互斥量/FreeRTOS互斥量教程.md) - > 在线视频教程:[互斥量开发详解] - > 教程配套代码:[互斥量示例代码] + > 📄在线文字教程:[FreeRTOS互斥量教程.md](docs/05.FreeRTOS进阶/5.3-互斥量/FreeRTOS互斥量教程.md) + > 📺在线视频教程:🚧 开发中 + > 💾教程配套代码:[ESP32-Guide/code/05.freertos_advanced/semphr](https://github.com/DuRuofu/ESP32-Guide/tree/main/code/05.freertos_advanced/semphr) ### 5.4 事件组 (Event Group) 学习如何通过事件组实现复杂的任务同步逻辑及事件管理。 - > 在线文字教程:[FreeRTOS事件组教程](docs/05.FreeRTOS进阶/5.4-事件组/FreeRTOS事件组教程.md) - > 在线视频教程:[事件组开发详解] - > 教程配套代码:[事件组示例代码] + > 📄在线文字教程:[FreeRTOS事件组教程.md](docs/05.FreeRTOS进阶/5.4-事件组/FreeRTOS事件组教程.md) + > 📺在线视频教程:🚧 开发中 + > 💾教程配套代码:[ESP32-Guide/code/05.freertos_advanced/event_group](https://github.com/DuRuofu/ESP32-Guide/tree/main/code/05.freertos_advanced/event_group) ### 5.5 任务通知 (Task Notifications) 了解任务通知的特点,掌握其在任务间高效通信中的实际应用。 - > 在线文字教程:[FreeRTOS任务通知教程](docs/05.FreeRTOS进阶/5.5-任务通知/FreeRTOS任务通知教程.md) - > 在线视频教程:[任务通知开发详解] - > 教程配套代码:[任务通知示例代码] - - - + > 📄在线文字教程:[FreeRTOS任务通知教程.md](docs/05.FreeRTOS进阶/5.5-任务通知/FreeRTOS任务通知教程.md) + > 📺在线视频教程:🚧 开发中 + > 💾教程配套代码:[ESP32-Guide/code/05.freertos_advanced/task_notify](https://github.com/DuRuofu/ESP32-Guide/tree/main/code/05.freertos_advanced/task_notify) --- @@ -402,17 +390,17 @@ MCPWM 外设是一个多功能 PWM 生成器,集成多个子模块,在电力 本节介绍ESP32的Wi-Fi模式,包括STA模式和AP模式,以及如何进行基本的Wi-Fi操作,如连接网络和设置路由器等。 -> 在线文字教程:[Wi-Fi模式与介绍](docs/06.Wi-Fi功能与相关协议/6.1-Wi-Fi功能入门/6.1.1-Wi-Fi模式与介绍/Wi-Fi模式与介绍.md) -> 在线视频教程:[Wi-Fi模式开发详解] -> 教程配套代码:[Wi-Fi模式示例代码] +> 📄在线文字教程:[Wi-Fi模式与介绍.md](docs/06.Wi-Fi功能与相关协议/6.1-Wi-Fi功能入门/6.1.1-Wi-Fi模式与介绍/Wi-Fi模式与介绍.md) +> 📺在线视频教程:🚧 开发中 +> 💾教程配套代码:[Wi-Fi模式示例代码] #### 6.1.2 Wi-Fi STA与AP配置 本节介绍如何在ESP32中配置Wi-Fi STA(Station)和AP(Access Point)模式,帮助用户快速实现设备与路由器或其他设备的连接。 -> 在线文字教程:[Wi-Fi的STA与AP配置](docs/06.Wi-Fi功能与相关协议/6.1-Wi-Fi功能入门/6.1.2-Wi-Fi的STA与AP配置/Wi-Fi的STA与AP配置.md) -> 在线视频教程:[Wi-Fi配置详解] -> 教程配套代码:[Wi-Fi配置示例代码] +> 📄在线文字教程:[Wi-Fi的STA与AP配置.md](docs/06.Wi-Fi功能与相关协议/6.1-Wi-Fi功能入门/6.1.2-Wi-Fi的STA与AP配置/Wi-Fi的STA与AP配置.md) +> 📺在线视频教程:🚧 开发中 +> 💾教程配套代码:[Wi-Fi配置示例代码] ### 6.2 网络协议应用 @@ -420,70 +408,52 @@ MCPWM 外设是一个多功能 PWM 生成器,集成多个子模块,在电力 本节讲解TCP协议的原理及在ESP32中的实现,包含连接、数据传输及断开连接的操作步骤。 -> 在线文字教程:[TCP协议应用](docs/06.Wi-Fi功能与相关协议/6.2-网络协议应用/6.2.1-TCP协议/TCP协议应用.md) -> 在线视频教程:[TCP协议开发详解] -> 教程配套代码:[TCP协议示例代码] +> 📄在线文字教程:[TCP协议应用.md](docs/06.Wi-Fi功能与相关协议/6.2-网络协议应用/6.2.1-TCP协议/TCP协议应用.md) +> 📺在线视频教程:🚧 开发中 +> 💾教程配套代码:[TCP协议示例代码] #### 6.2.2 UDP协议 本节介绍UDP协议的工作原理及在ESP32上的应用,包含数据发送与接收的实现方法。 -> 在线文字教程:[UDP协议应用](docs/06.Wi-Fi功能与相关协议/6.2-网络协议应用/6.2.2-UDP协议/UDP协议应用.md) -> 在线视频教程:[UDP协议开发详解] -> 教程配套代码:[UDP协议示例代码] +> 📄在线文字教程:[UDP协议应用.md](docs/06.Wi-Fi功能与相关协议/6.2-网络协议应用/6.2.2-UDP协议/UDP协议应用.md) +> 📺在线视频教程:🚧 开发中 +> 💾教程配套代码:[UDP协议示例代码] #### 6.2.3 HTTP协议 本节介绍ESP32如何实现HTTP协议,包括创建HTTP客户端和服务器的步骤,以及常见的应用场景。 -> 在线文字教程-1:[HTTP协议(服务端).md](docs/06.Wi-Fi功能与相关协议/6.2-网络协议应用/6.2.3-HTTP协议/HTTP协议(服务端)/HTTP协议(服务端).md) -> 在线文字教程-2:[HTTP协议(客户端).md](docs/06.Wi-Fi功能与相关协议/6.2-网络协议应用/6.2.3-HTTP协议/HTTP协议(客户端)/HTTP协议(客户端).md) -> 在线视频教程:[HTTP协议开发详解] -> 教程配套代码:[HTTP协议示例代码] +> 📄在线文字教程-1:[HTTP协议(服务端).md](docs/06.Wi-Fi功能与相关协议/6.2-网络协议应用/6.2.3-HTTP协议/HTTP协议(服务端)/HTTP协议(服务端).md) +> 📄在线文字教程-2:[HTTP协议(客户端).md](docs/06.Wi-Fi功能与相关协议/6.2-网络协议应用/6.2.3-HTTP协议/HTTP协议(客户端)/HTTP协议(客户端).md) +> 📺在线视频教程:🚧 开发中 +> 💾教程配套代码:[HTTP协议示例代码] #### 6.2.4 WebSocket协议 本节讲解WebSocket协议在ESP32中的应用,如何通过WebSocket实现实时双向通信。 -> 在线文字教程:[WebSocket协议应用](docs/06.Wi-Fi功能与相关协议/6.2-网络协议应用/6.2.4-WebSocket协议/WebSocket协议.md) -> 在线视频教程:[WebSocket协议开发详解] -> 教程配套代码:[WebSocket协议示例代码] +> 📄在线文字教程:[WebSocket协议应用.md](docs/06.Wi-Fi功能与相关协议/6.2-网络协议应用/6.2.4-WebSocket协议/WebSocket协议.md) +> 📺在线视频教程:🚧 开发中 +> 💾教程配套代码:[WebSocket协议示例代码] #### 6.2.5 MQTT协议 本节介绍ESP32如何实现MQTT协议,包括客户端连接、订阅和发布消息的基本操作。 -> 在线文字教程:[MQTT协议应用](docs/06.Wi-Fi功能与相关协议/6.2-网络协议应用/6.2.5-MQTT协议/MQTT协议应用.md) -> 在线视频教程:[MQTT协议开发详解] -> 教程配套代码:[MQTT协议示例代码] +> 📄在线文字教程:[MQTT协议应用.md](docs/06.Wi-Fi功能与相关协议/6.2-网络协议应用/6.2.5-MQTT协议/MQTT协议应用.md) +> 📺在线视频教程:🚧 开发中 +> 💾教程配套代码:[MQTT协议示例代码] #### 6.2.6 ESP-NOW协议 本节介绍ESP32的ESP-NOW协议,讲解其在无需Wi-Fi路由器的情况下实现设备间直接通信的应用场景。 -> 在线文字教程:[ESP-NOW协议应用](docs/06.Wi-Fi功能与相关协议/6.2-网络协议应用/6.2.6-ESP-NOW协议/ESP-NOW协议应用.md) -> 在线视频教程:[ESP-NOW协议开发详解] -> 教程配套代码:[ESP-NOW协议示例代码] +> 📄在线文字教程:[ESP-NOW协议应用.md](docs/06.Wi-Fi功能与相关协议/6.2-网络协议应用/6.2.6-ESP-NOW协议/ESP-NOW协议应用.md) +> 📺在线视频教程:🚧 开发中 +> 💾教程配套代码:[ESP-NOW协议示例代码] -### 6.3 Wi-Fi配网技术 -#### 6.3.1 Blufi配网 - -> 在线文字教程:[BluFi配网](docs/06.Wi-Fi功能与相关协议/6.3-Wi-Fi配网技术/6.3.1-BluFi配网/BluFi配网.md) -> 在线视频教程:[开发详解] -> 教程配套代码:[示例代码] -#### 6.3.2 Smartconfig配网 - -> 在线文字教程:[Smartconfig配网](docs/06.Wi-Fi功能与相关协议/6.3-Wi-Fi配网技术/6.3.2-Smartconfig配网/Smartconfig配网.md) -> 在线视频教程:[开发详解] -> 教程配套代码:[示例代码] - -#### 6.3.3 SoftAP配网 - - -> 在线文字教程:[SoftAP配网](docs/06.Wi-Fi功能与相关协议/6.3-Wi-Fi配网技术/6.3.3-SoftAP配网/SoftAP配网.md) -> 在线视频教程:[开发详解] -> 教程配套代码:[示例代码] --- ## 七、蓝牙功能与相关协议 (更新中) @@ -532,15 +502,39 @@ MCPWM 外设是一个多功能 PWM 生成器,集成多个子模块,在电力 > 补充一些综合性性案例,与实用功能,为前八章做补充。 +### 9.1 Wi-Fi配网技术 -### 1.Web服务程序(Vue3+element-plus) -> 在线文字教程:[WEB服务程序(Vue3+element-plus).md](docs/09.其他实用内容/WEB服务程序(Vue3+element-plus)/WEB服务程序.md) -> 在线视频教程: -> 教程配套代码:[WEB服务程序示例代码](docs/09.其他实用内容/WEB服务程序(Vue3+element-plus)/WEB服务程序.md) +#### 9.1.1 Blufi配网 + +> 📄在线文字教程:[BluFi配网](docs/09.其他实用内容/9.1-ESP32配网/9.1.1-BluFi配网/BluFi配网.md) +> 📺在线视频教程:🚧 开发中 +> 💾教程配套代码:[示例代码] +#### 9.1.2 Smartconfig配网 + +> 📄在线文字教程:[Smartconfig配网](docs/09.其他实用内容/9.1-ESP32配网/9.1.2-Smartconfig配网/Smartconfig配网.md) +> 📺在线视频教程:🚧 开发中 +> 💾教程配套代码:[示例代码] -### 1. OTA功能 +#### 9.1.3 SoftAP配网 + + +> 📄在线文字教程:[SoftAP配网](docs/09.其他实用内容/9.1-ESP32配网/9.1.3-SoftAP配网/SoftAP配网.md) +> 📺在线视频教程:🚧 开发中 +> 💾教程配套代码:[示例代码] +### 9.2 Web服务程序(Vue3+element-plus) + +> 📄在线文字教程:[WEB服务程序(Vue3+element-plus).md](docs/09.其他实用内容/WEB服务程序(Vue3+element-plus)/WEB服务程序.md) +> 📺在线视频教程:🚧 开发中 +> 💾教程配套代码:[WEB服务程序示例代码](docs/09.其他实用内容/WEB服务程序(Vue3+element-plus)/WEB服务程序.md) + +### 9.3 OTA功能 + + +> 📄在线文字教程:🚧 开发中 +> 📺在线视频教程:🚧 开发中 +> 💾教程配套代码:🚧 开发中 diff --git a/docs/00.常见问题及解决方案/常见问题及解决方案.md b/docs/00.常见问题及解决方案/常见问题及解决方案.md index a8c55d1..a294edf 100644 --- a/docs/00.常见问题及解决方案/常见问题及解决方案.md +++ b/docs/00.常见问题及解决方案/常见问题及解决方案.md @@ -1,7 +1,8 @@ # 常见问题与解决 ->[!INFO] ->这里也推荐大家参考:[ESP-FAQ](https://docs.espressif.com/projects/esp-faq/zh_CN/latest/index.html) 是由乐鑫官方推出的针对常见问题的总结。在线帮助我们的用户快速检索经常问到的问题,通过简单的解释获得解答。目前常见问题的种类涵盖:开发环境、应用方案、软件平台、硬件相关和测试测试。 + +> [!INFO] +> 在遇到问题时,推荐大家参考:[ESP-FAQ](https://docs.espressif.com/projects/esp-faq/zh_CN/latest/index.html),这是由乐鑫官方推出的常见问题汇总。它帮助用户快速检索常见问题,并通过简洁的解答解决疑惑。常见问题涉及的领域包括:开发环境、应用方案、软件平台、硬件相关问题以及测试相关内容。 ## 索引 diff --git a/docs/01.认识ESP32/1.1-ESP32介绍/ESP32介绍.md b/docs/01.认识ESP32/1.1-ESP32介绍/ESP32介绍.md index 5287486..7e24229 100644 --- a/docs/01.认识ESP32/1.1-ESP32介绍/ESP32介绍.md +++ b/docs/01.认识ESP32/1.1-ESP32介绍/ESP32介绍.md @@ -1,7 +1,7 @@ # ESP32介绍 -> [!NOTE] -> 对应视频教程:https://www.bilibili.com/video/BV1u861YHEso +> [!TIP] +> - 📺 **视频教程**:[点击观看](https://www.bilibili.com/video/BV1u861YHEso) ## 一、ESP32是什么? ESP32是一款由乐鑫(Espressif)公司研发的高性能、低功耗Wi-Fi和蓝牙双模芯片。它专为物联网(IoT)设计,集成了丰富的功能模块和硬件接口,是目前最流行的物联网嵌入式开发平台之一。 diff --git a/docs/01.认识ESP32/1.2-ESP32开发环境搭建/1.环境搭建-Windows.md b/docs/01.认识ESP32/1.2-ESP32开发环境搭建/1.环境搭建-Windows.md index a8b21bd..3662db0 100644 --- a/docs/01.认识ESP32/1.2-ESP32开发环境搭建/1.环境搭建-Windows.md +++ b/docs/01.认识ESP32/1.2-ESP32开发环境搭建/1.环境搭建-Windows.md @@ -1,9 +1,8 @@ # ESP32开发环境搭建—Windows系统 -> [!NOTE] -> 本文介绍在Windows系统下安装ESP-IDF开发环境,并且推荐使用VS Code插件直接安装
-> 对应视频教程-1:https://www.bilibili.com/video/BV14o62YQEBC
- +> [!TIP] 🚀 **初次接触!在 Windows 系统中搭建 ESP32 开发环境** +> - 💡 **碎碎念**😎:本文将引导你在 Windows 系统下安装 ESP-IDF 开发环境,并推荐使用 VS Code 插件进行简便安装。 +> - 📺 **视频教程**:[点击观看](https://www.bilibili.com/video/BV14o62YQEBC) ## 一、使用VS Code插件直接安装 ### 1.1 下载插件 diff --git a/docs/01.认识ESP32/1.2-ESP32开发环境搭建/2.环境搭建-Ubuntu虚拟机.md b/docs/01.认识ESP32/1.2-ESP32开发环境搭建/2.环境搭建-Ubuntu虚拟机.md index 25b6c76..8618f84 100644 --- a/docs/01.认识ESP32/1.2-ESP32开发环境搭建/2.环境搭建-Ubuntu虚拟机.md +++ b/docs/01.认识ESP32/1.2-ESP32开发环境搭建/2.环境搭建-Ubuntu虚拟机.md @@ -1,9 +1,8 @@ # 二、ESP32开发环境搭建—Linux系统 -> [!NOTE] -> 本节介绍在Linux系统下搭建ESP-IDF开发环境,以获得更高的编译速度。
-> 对应视频教程: https://www.bilibili.com/video/BV1vLrKYHExy
- +> [!TIP] 🚀 **在 Linux 系统上搭建 ESP32 开发环境 | 高效编译,畅快开发!** +> - 💡 **碎碎念**😎:本节将引导你在 Linux 系统下搭建 ESP-IDF 开发环境,让你的编译速度飞起来! +> - 📺 **视频教程**:[点击观看](https://www.bilibili.com/video/BV1vLrKYHExy) ## 一、使用VS Code插件直接安装 这种安装方法和[环境搭建-Windows](1.环境搭建-Windows.md)介绍的Windows下使用VS Code插件直接安装没有太大区别,参考[环境搭建-Windows](1.环境搭建-Windows.md)和官方文档中针对Linux系统的提示即可,这里就不展开描述了。 diff --git a/docs/01.认识ESP32/1.2-ESP32开发环境搭建/3.环境搭建-Windows与虚拟机组合使用.md b/docs/01.认识ESP32/1.2-ESP32开发环境搭建/3.环境搭建-Windows与虚拟机组合使用.md index 8dd9937..2f32ce8 100644 --- a/docs/01.认识ESP32/1.2-ESP32开发环境搭建/3.环境搭建-Windows与虚拟机组合使用.md +++ b/docs/01.认识ESP32/1.2-ESP32开发环境搭建/3.环境搭建-Windows与虚拟机组合使用.md @@ -1,10 +1,8 @@ # 三、ESP32开发环境搭建—Windows与虚拟机组合使用(进阶) - -> [!NOTE] -> 本节主要介绍教程:[环境搭建-Windows](1.环境搭建-Windows.md)和 [环境搭建-Ubuntu虚拟机](2.环境搭建-Ubuntu虚拟机.md)组合使用的情况,属于一种进阶的用法,故文档会比较简略,推荐参考视频教程
-> 对应视频教程:https://www.bilibili.com/video/BV1s2rGYsE4V
- +> [!TIP] 🚀 **进阶教程:Windows + Ubuntu 虚拟机组合使用** +> - 💡 **碎碎念**😎:本节将介绍如何将 [环境搭建-Windows](1.环境搭建-Windows.md) 和 [环境搭建-Ubuntu虚拟机](2.环境搭建-Ubuntu虚拟机.md) 组合使用,属于进阶用法,因此文档会相对简略,建议配合视频教程一起参考。 +> - 📺 **视频教程**:[点击观看](https://www.bilibili.com/video/BV1s2rGYsE4V) ## 一、SSH介绍 SSH (Secure Shell) 是一种网络协议,用于在不安全的网络上安全地访问远程设备和服务器。它提供了强大的加密功能,可以保护用户和服务器之间的通信免受窃听、篡改和中间人攻击。 diff --git a/docs/01.认识ESP32/1.2-ESP32开发环境搭建/4.环境搭建-WSL2.md b/docs/01.认识ESP32/1.2-ESP32开发环境搭建/4.环境搭建-WSL2.md index 900d96d..651f0b1 100644 --- a/docs/01.认识ESP32/1.2-ESP32开发环境搭建/4.环境搭建-WSL2.md +++ b/docs/01.认识ESP32/1.2-ESP32开发环境搭建/4.环境搭建-WSL2.md @@ -1,6 +1,6 @@ # 三、ESP32开发环境搭建—WSL(进阶且推荐) -> [!NOTE] -> 本节主要介绍在WSL2环境下安装ESP-IDF开发环境,也是笔者比较推荐的开发环境。
-> 对应视频教程: +> [!TIP] 🚀 **WSL2 环境搭建 ESP-IDF 开发环境 | 推荐的开发环境!** +> - 💡 **碎碎念**😎:本节将介绍如何在 WSL2 环境下安装 ESP-IDF 开发环境,这是笔者比较推荐的开发环境,带来更流畅的开发体验! +> - 📺 **视频教程**:[点击观看] \ No newline at end of file diff --git a/docs/01.认识ESP32/1.3-初试ESP32-idf.py的基本使用/idf.py的基本使用.md b/docs/01.认识ESP32/1.3-初试ESP32-idf.py的基本使用/idf.py的基本使用.md index 185e62c..84d1562 100644 --- a/docs/01.认识ESP32/1.3-初试ESP32-idf.py的基本使用/idf.py的基本使用.md +++ b/docs/01.认识ESP32/1.3-初试ESP32-idf.py的基本使用/idf.py的基本使用.md @@ -1,9 +1,11 @@ # ESP.py的基本使用 -> [!NOTE] -> 对应视频教程:https://www.bilibili.com/video/BV1VLrSY3E15 -本节介绍ESP32开发的基本流程,介绍代码编译,烧录,以及查看串口监视器等常用命令,引导大家学会使用idf.py工具。此部分也可以参考官方文档:[IDF 前端工具 - idf.py](https://docs.espressif.com/projects/esp-idf/zh_CN/v5.2.3/esp32/api-guides/tools/idf-py.html) +> [!TIP] 🚀 **ESP32开发基本流程 | 从编译到烧录,一步步掌握!** +> - 💡 **碎碎念**😎:本节将介绍 ESP32 开发的基本流程,包括代码编译、烧录以及查看串口监视器等常用命令。同时,引导大家学会使用 `idf.py` 工具,让你的开发更高效! +> - 📺 **视频教程**:[点击观看](https://www.bilibili.com/video/BV1VLrSY3E15) +> - 📚 **官方文档**:[API 指南 » 工具 » IDF 前端工具 - idf.py](https://docs.espressif.com/projects/esp-idf/zh_CN/v5.2.3/esp32/api-guides/tools/idf-py.html) + ## 一、常用idf.py命令介绍 | 功能 | 命令 | 备注 | diff --git a/docs/02.ESP-IDF基础/2.1-ESP32工程结构/ESP-IDF的工程结构.md b/docs/02.ESP-IDF基础/2.1-ESP32工程结构/ESP-IDF的工程结构.md index 1cf1c94..0f9fffc 100644 --- a/docs/02.ESP-IDF基础/2.1-ESP32工程结构/ESP-IDF的工程结构.md +++ b/docs/02.ESP-IDF基础/2.1-ESP32工程结构/ESP-IDF的工程结构.md @@ -1,14 +1,15 @@ # ESP32项目工程结构 -> [!NOTE] -> 对应视频教程:https://www.bilibili.com/video/BV1CfrzYcEkK
-> 对应示例代码:[sample_project](https://github.com/DuRuofu/ESP32-Guide/tree/main/code/02.idf_basic/01/sample_project) +> [!TIP] 🚀 **ESP32项目工程结构 | 从基础了解项目布局** +> - 💡 **碎碎念**😎:本节介绍 ESP32 项目工程的基本结构,帮助你更好地理解项目布局。 +> - 📺 **视频教程**:[点击观看](https://www.bilibili.com/video/BV1CfrzYcEkK) +> - 💾 **示例代码**:[ESP32-Guide/code/02.idf_basic/sample_project](https://github.com/DuRuofu/ESP32-Guide/tree/main/code/02.idf_basic/sample_project) +> - 📚 **官方文档**:[ API 指南 » 构建系统](https://docs.espressif.com/projects/esp-idf/zh_CN/v5.3.2/esp32/api-guides/build-system.html#example-project-structure) + ## 介绍 ESP-IDF 的项目工程与 Keil 的传统工程模式有显著不同。Keil 工程通常依赖于特定的项目文件格式(如 .uvprojx 或 .uvoptx),这些文件记录了项目的结构、配置和依赖,且需要通过 Keil 软件进行管理和编译。而 ESP-IDF 则采用更灵活的构建方式,ESP-IDF 的项目只是一个特定的文件夹,其中包含了构建可执行应用程序所需的全部文件和配置,以及其他支持型文件,例如分区表、数据/文件系统分区和引导程序。这些文件描述了项目的源码路径、依赖关系和编译选项,而不是依赖于 IDE 专属的配置格式。这样可以方便地在不同的开发环境中切换。 -关于ESP-IDF工程结构可以参考官方文档:[示例项目](https://docs.espressif.com/projects/esp-idf/zh_CN/v5.3.2/esp32/api-guides/build-system.html#example-project-structure) - 这部分没有什么新的东西,只是需要明白ESP-IDF所规定的项目框架,下面的内容都提炼自官方文档,大家也可以直接前往官方文档查看。 ## 项目目录 @@ -68,7 +69,7 @@ project(teat) 组件是 COMPONENT_DIRS 列表中的任何目录。此列表中的目录可以是组件自身(即包含 CMakeLists.txt 文件的目录),也可以是子目录为组件的顶级目录,例如`$ENV{PROJECT_DIR}/components` -`构建` 或 `编译` 时,ESP-IDF 搜索所有待构建的组件的顺序为`COMPONENT_DIRS` 指定的顺序依次进行。 +构建 或 编译 时,ESP-IDF 搜索所有待构建的组件的顺序为`COMPONENT_DIRS` 指定的顺序依次进行。 因此,在默认情况下: 1. 搜索 ESP-IDF 内部组件(`$ENV{IDF_PATH}/components`) diff --git a/docs/02.ESP-IDF基础/2.2-ESP-IDF项目配置/ESP-IDF项目配置.md b/docs/02.ESP-IDF基础/2.2-ESP-IDF项目配置/ESP-IDF项目配置.md index cb866fe..2f8e48c 100644 --- a/docs/02.ESP-IDF基础/2.2-ESP-IDF项目配置/ESP-IDF项目配置.md +++ b/docs/02.ESP-IDF基础/2.2-ESP-IDF项目配置/ESP-IDF项目配置.md @@ -1,10 +1,10 @@ # ESP32项目配置 -> [!NOTE] -> 对应视频教程:https://www.bilibili.com/video/BV15xwbeiEnD
-> 对应示例代码:[blink_menuconfig](https://github.com/DuRuofu/ESP32-Guide/tree/main/code/02.idf_basic/02) - -关于项目配置部分的文档,可以参考:[ API 参考 » 项目配置](https://docs.espressif.com/projects/esp-idf/zh_CN/v5.3.2/esp32/api-reference/kconfig.html) +> [!TIP] 🚀 **ESP32 项目配置 | 一步步掌握 Menuconfig 和 Kconfig 文件** +> - 💡 **碎碎念**😎:本节将通过一个具体例子,详细讲解如何使用 `menuconfig` 命令,以及 `Kconfig` 文件在项目配置中的作用,帮助你更好地掌控项目配置。 +> - 📺 **视频教程**:[点击观看](https://www.bilibili.com/video/BV15xwbeiEnD) +> - 💾 **示例代码**:[ESP32-Guide/code/02.idf_basic/config](https://github.com/DuRuofu/ESP32-Guide/tree/main/code/02.idf_basic/config) +> - 📚 **官方文档**:[ API 参考 » 项目配置](https://docs.espressif.com/projects/esp-idf/zh_CN/v5.3.2/esp32/api-reference/kconfig.html) 首先我们先借助一个具体的例子来解释Menuconfig命令的使用和Kconfig文件的作用。 ## 一、Menuconfig的使用 diff --git a/docs/02.ESP-IDF基础/2.3-ESP-IDF自定义组件/ESP-IDF自定义组件.md b/docs/02.ESP-IDF基础/2.3-ESP-IDF自定义组件/ESP-IDF自定义组件.md index 0270562..35219e7 100644 --- a/docs/02.ESP-IDF基础/2.3-ESP-IDF自定义组件/ESP-IDF自定义组件.md +++ b/docs/02.ESP-IDF基础/2.3-ESP-IDF自定义组件/ESP-IDF自定义组件.md @@ -1,10 +1,11 @@ # ESP32自定义组件 -> [!NOTE] -> 对应视频教程:https://www.bilibili.com/video/BV182ftYHEox
-> 对应示例代码:[blink_component](https://github.com/DuRuofu/ESP32-Guide/tree/main/code/02.idf_basic/03/blink_component) +> [!TIP] 🚀 **ESP32 自定义组件 | 玩转组件开发与配置** +> - 💡 **碎碎念**😎:本节将介绍如何创建和配置 ESP32 自定义组件,帮助你模块化复用代码。 +> - 📺 **视频教程**:[点击观看](https://www.bilibili.com/video/BV182ftYHEox) +> - 💾 **示例代码**:[ESP32-Guide/code/02.idf_basic/blink_component](https://github.com/DuRuofu/ESP32-Guide/tree/main/code/02.idf_basic/blink_component) +> - 📚 **官方文档**:[API 指南 » 构建系统](https://docs.espressif.com/projects/esp-idf/zh_CN/v5.3.2/esp32/api-guides/build-system.html?highlight=kconfig%20projbuild#component-configuration) -关于ESP-IDF自定义组件部分的文档,可以参考:[API 指南 » 构建系统](https://docs.espressif.com/projects/esp-idf/zh_CN/v5.3.2/esp32/api-guides/build-system.html?highlight=kconfig%20projbuild#component-configuration) ## 一 、自定义组件介绍: 之前在[ESP-IDF的工程结构](../2.1-ESP32工程结构/ESP-IDF的工程结构.md)里提到esp-idf项目的结构如下: diff --git a/docs/02.ESP-IDF基础/2.4-ESP-IDF组件管理器/ESP-IDF组件管理器.md b/docs/02.ESP-IDF基础/2.4-ESP-IDF组件管理器/ESP-IDF组件管理器.md index 9464ef3..46edf8d 100644 --- a/docs/02.ESP-IDF基础/2.4-ESP-IDF组件管理器/ESP-IDF组件管理器.md +++ b/docs/02.ESP-IDF基础/2.4-ESP-IDF组件管理器/ESP-IDF组件管理器.md @@ -1,10 +1,11 @@ # ESP32组件管理器 -> [!NOTE] -> 对应视频教程:https://www.bilibili.com/video/BV1etfHYgE6M
-> 对应示例代码:[button_blink](https://github.com/DuRuofu/ESP32-Guide/tree/main/code/02.idf_basic/04/button_blink) +> [!TIP] 🚀 **ESP32 组件管理器 | 管理和扩展你的项目组件** +> - 💡 **碎碎念**😎:本节将带你了解如何使用 ESP32 组件管理器进行项目组件的管理,帮助你更高效地使用和扩展 ESP32 组件。 +> - 📺 **视频教程**:[点击观看](https://www.bilibili.com/video/BV1etfHYgE6M) +> - 💾 **示例代码**:[ESP32-Guide/code/02.idf_basic/button_blink](https://github.com/DuRuofu/ESP32-Guide/tree/main/code/02.idf_basic/button_blink) +> - 📚 **官方文档**:[API 指南 » 工具 » IDF 组件管理器](https://docs.espressif.com/projects/esp-idf/zh_CN/stable/esp32/api-guides/tools/idf-component-manager.html) -关于ESP-IDF组件管理器的文档,可以参考:[ API 指南 » 工具 » IDF 组件管理器](https://docs.espressif.com/projects/esp-idf/zh_CN/stable/esp32/api-guides/tools/idf-component-manager.html) ## 一、啥是组件管理器 ESP-IDF官方对组件管理器的描述是这样的: diff --git a/docs/03.FreeRTOS基础/3.1-FreeRTOS概述/FreeRTOS概述.md b/docs/03.FreeRTOS基础/3.1-FreeRTOS概述/FreeRTOS概述.md index cfbef04..bab9377 100644 --- a/docs/03.FreeRTOS基础/3.1-FreeRTOS概述/FreeRTOS概述.md +++ b/docs/03.FreeRTOS基础/3.1-FreeRTOS概述/FreeRTOS概述.md @@ -1,9 +1,10 @@ # FreeRTOS介绍 -> [!NOTE] -> 对应视频教程:暂无
-> 对应示例代码:暂无 +> [!TIP] 🚀 **FreeRTOS | 实现实时操作系统的强大功能** +> - 💡 **碎碎念**😎:本节将介绍 FreeRTOS,帮助你理解如何在 ESP32 上实现实时操作系统,提升任务调度和系统效率。 +> - 📺 **视频教程**:🚧 *开发中* +> - 💾 **示例代码**:🚧 *开发中* FreeRTOS 是一个开源的 RTOS(实时操作系统)内核,它以组件的形式集成到 ESP-IDF 中。因此,所有的 ESP-IDF 应用程序及多种 ESP-IDF 组件都基于 FreeRTOS 编写。 diff --git a/docs/03.FreeRTOS基础/3.2-FreeRTOS多任务与任务管理/FreeRTOS多任务与任务管理.md b/docs/03.FreeRTOS基础/3.2-FreeRTOS多任务与任务管理/FreeRTOS多任务与任务管理.md index 6ce5788..8420b87 100644 --- a/docs/03.FreeRTOS基础/3.2-FreeRTOS多任务与任务管理/FreeRTOS多任务与任务管理.md +++ b/docs/03.FreeRTOS基础/3.2-FreeRTOS多任务与任务管理/FreeRTOS多任务与任务管理.md @@ -1,9 +1,11 @@ # FreeRTOS多任务管理 -> [!NOTE] -> 对应视频教程:暂无
-> 对应示例代码:暂无 +> [!TIP] 🚀 **FreeRTOS 多任务管理 | 实现任务并行处理** +> - 💡 **碎碎念**😎:本节将介绍如何在 FreeRTOS 中实现多任务管理,帮助你更高效地进行任务调度和并行处理。 +> - 📺 **视频教程**:🚧 *开发中* +> - 💾 **示例代码**:[ESP32-Guide/code/03.freertos_basic/task](https://github.com/DuRuofu/ESP32-Guide/tree/main/code/03.freertos_basic/task) + 注意:与原生 FreeRTOS 不同,在 ESP-IDF 中使用 FreeRTOS 的用户 \永远不应调用 `vTaskStartScheduler()` 和 `vTaskEndScheduler()`。相反,ESP-IDF 会自动启动 FreeRTOS。用户必须定义一个 `void app_main(void)` 函数作为用户应用程序的入口点,并在 ESP-IDF 启动时被自动调用。 diff --git a/docs/03.FreeRTOS基础/3.3-FreeRTOS任务看门狗/FreeRTOS任务看门狗.md b/docs/03.FreeRTOS基础/3.3-FreeRTOS任务看门狗/FreeRTOS任务看门狗.md index 1e519fa..e9ac439 100644 --- a/docs/03.FreeRTOS基础/3.3-FreeRTOS任务看门狗/FreeRTOS任务看门狗.md +++ b/docs/03.FreeRTOS基础/3.3-FreeRTOS任务看门狗/FreeRTOS任务看门狗.md @@ -1,8 +1,9 @@ # FreeRTOS任务看门狗 -> [!NOTE] -> 对应视频教程:暂无
-> 对应示例代码:暂无 +> [!TIP] 🚀 **FreeRTOS 任务看门狗 | 保障任务执行稳定** +> - 💡 **碎碎念**😎:本节将介绍如何在 FreeRTOS 中使用任务看门狗,帮助确保任务的正常运行和系统的稳定性。 +> - 📺 **视频教程**:🚧 *开发中* +> - 💾 **示例代码**:[ESP32-Guide/code/03.freertos_basic/watchdog](https://github.com/DuRuofu/ESP32-Guide/tree/main/code/03.freertos_basic/watchdog) ## 任务看门狗定时器 (TWDT) diff --git a/docs/03.FreeRTOS基础/3.4-FreeRTOS软件定时器/FreeRTOS软件定时器.md b/docs/03.FreeRTOS基础/3.4-FreeRTOS软件定时器/FreeRTOS软件定时器.md new file mode 100644 index 0000000..6e178d9 --- /dev/null +++ b/docs/03.FreeRTOS基础/3.4-FreeRTOS软件定时器/FreeRTOS软件定时器.md @@ -0,0 +1,9 @@ +# FreeRTOS软器教程 + +> [!TIP] 🚀 **FreeRTOS 软件定时器 | 灵活管理定时任务** +> - 💡 **碎碎念**😎:本节将介绍如何在 FreeRTOS 中使用软件定时器,帮助你灵活地管理定时任务,提升系统性能。 +> - 📺 **视频教程**:🚧 *开发中* +> - 💾 **示例代码**:[ESP32-Guide/code/03.freertos_basic/timer](https://github.com/DuRuofu/ESP32-Guide/tree/main/code/03.freertos_basic/timer) + +## 一、介绍 + diff --git a/docs/03.FreeRTOS基础/3.4-软件定时器/FreeRTOS软件定时器.md b/docs/03.FreeRTOS基础/3.4-软件定时器/FreeRTOS软件定时器.md deleted file mode 100644 index 6459373..0000000 --- a/docs/03.FreeRTOS基础/3.4-软件定时器/FreeRTOS软件定时器.md +++ /dev/null @@ -1,5 +0,0 @@ -# FreeRTOS软件定时器教程 - -> [!NOTE] -> 对应视频教程:暂无
-> 对应示例代码:暂无 \ No newline at end of file diff --git a/docs/04.外设学习/4.1-基础外设/4.1.1-GPIO/GPIO入门.md b/docs/04.外设学习/4.1-基础外设/4.1.1-GPIO/GPIO入门.md index 6b2040c..ba69da2 100644 --- a/docs/04.外设学习/4.1-基础外设/4.1.1-GPIO/GPIO入门.md +++ b/docs/04.外设学习/4.1-基础外设/4.1.1-GPIO/GPIO入门.md @@ -1,9 +1,10 @@ # ESP32外设-GPIO -> [!NOTE] -> 对应视频教程:暂无
-> 对应示例代码:暂无 +> [!TIP] 🚀 **ESP32 外设-GPIO | 轻松控制硬件引脚** +> - 💡 **碎碎念**😎:本节将介绍 ESP32 的 GPIO 外设,帮助你掌握如何使用 GPIO 引脚进行硬件控制和信号传输。 +> - 📺 **视频教程**:🚧 *开发中* +> - 💾 **示例代码**:🚧 *开发中* ## 一、GPIO介绍 diff --git a/docs/04.外设学习/4.1-基础外设/4.1.2-UART/UART串口通信.md b/docs/04.外设学习/4.1-基础外设/4.1.2-UART/UART串口通信.md index 87c9826..33a9bf5 100644 --- a/docs/04.外设学习/4.1-基础外设/4.1.2-UART/UART串口通信.md +++ b/docs/04.外设学习/4.1-基础外设/4.1.2-UART/UART串口通信.md @@ -2,9 +2,10 @@ # ESP32外设-UART -> [!NOTE] -> 对应视频教程:暂无
-> 对应示例代码:暂无 +> [!TIP] 🚀 **ESP32 外设-UART | 串口通信轻松搞定** +> - 💡 **碎碎念**😎:本节将介绍 ESP32 的 UART 外设,帮助你实现设备间的串口通信,进行数据传输。 +> - 📺 **视频教程**:🚧 *开发中* +> - 💾 **示例代码**:🚧 *开发中* ## 一、UART介绍 diff --git a/docs/04.外设学习/4.1-基础外设/4.1.3-定时器/定时器.md b/docs/04.外设学习/4.1-基础外设/4.1.3-定时器/定时器.md index 7beb277..9ec2d46 100644 --- a/docs/04.外设学习/4.1-基础外设/4.1.3-定时器/定时器.md +++ b/docs/04.外设学习/4.1-基础外设/4.1.3-定时器/定时器.md @@ -2,9 +2,10 @@ # ESP32外设-硬件定时器入门 -> [!NOTE] -> 对应视频教程:暂无
-> 对应示例代码:暂无 +> [!TIP] 🚀 **ESP32 外设-硬件定时器入门 | 精准定时,控制更灵活** +> - 💡 **碎碎念**😎:本节将介绍 ESP32 的硬件定时器,帮助你实现精准的定时控制,提升系统响应能力。 +> - 📺 **视频教程**:🚧 *开发中* +> - 💾 **示例代码**:🚧 *开发中* > 若不必使用硬件定时器,则建议使用软件定时器:[ESP 定时器](https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/api-reference/system/esp_timer.html) diff --git a/docs/04.外设学习/4.1-基础外设/4.1.4-ADC/ADC模数转换.md b/docs/04.外设学习/4.1-基础外设/4.1.4-ADC/ADC模数转换.md index 3ed0b88..c6baf9c 100644 --- a/docs/04.外设学习/4.1-基础外设/4.1.4-ADC/ADC模数转换.md +++ b/docs/04.外设学习/4.1-基础外设/4.1.4-ADC/ADC模数转换.md @@ -2,10 +2,10 @@ # ESP32外设-ADC入门 -> [!NOTE] -> 对应视频教程:暂无
-> 对应示例代码:暂无 - +> [!TIP] 🚀 **ESP32 外设-ADC入门 | 轻松实现模拟信号采集** +> - 💡 **碎碎念**😎:本节将介绍 ESP32 的 ADC 外设,帮助你实现模拟信号采集,进行高精度数据处理。 +> - 📺 **视频教程**:🚧 *开发中* +> - 💾 **示例代码**:🚧 *开发中* >本文档主要转载自[Augtons正(单片机)](https://blog.csdn.net/m0_50064262 "Augtons正(单片机)")的ESP32系列教程(关于ADC部分的梳理甚至比官方教程都清晰)。 diff --git a/docs/04.外设学习/4.1-基础外设/4.1.5-DAC/DAC数模转换.md b/docs/04.外设学习/4.1-基础外设/4.1.5-DAC/DAC数模转换.md index f523122..79a6cbe 100644 --- a/docs/04.外设学习/4.1-基础外设/4.1.5-DAC/DAC数模转换.md +++ b/docs/04.外设学习/4.1-基础外设/4.1.5-DAC/DAC数模转换.md @@ -1,8 +1,9 @@ # ESP32外设-DAC -> [!NOTE] -> 对应视频教程:暂无
-> 对应示例代码:暂无 +> [!TIP] 🚀 **ESP32 外设-DAC | 精准数字模拟转换** +> - 💡 **碎碎念**😎:本节将介绍 ESP32 的 DAC 外设,帮助你实现数字信号到模拟信号的转换,支持多种应用场景。 +> - 📺 **视频教程**:🚧 *开发中* +> - 💾 **示例代码**:🚧 *开发中* ## 一、介绍 diff --git a/docs/04.外设学习/4.1-基础外设/4.1.6-LED_PWM/LED_PWM控制.md b/docs/04.外设学习/4.1-基础外设/4.1.6-LED_PWM/LED_PWM控制.md index 42d4557..8c657d2 100644 --- a/docs/04.外设学习/4.1-基础外设/4.1.6-LED_PWM/LED_PWM控制.md +++ b/docs/04.外设学习/4.1-基础外设/4.1.6-LED_PWM/LED_PWM控制.md @@ -1,9 +1,10 @@ # ESP32外设-LEDPWM入门 -> [!NOTE] -> 对应视频教程:暂无
-> 对应示例代码:暂无 +> [!TIP] 🚀 **ESP32 外设-LEDPWM入门 | 精准控制 LED 灯光效果** +> - 💡 **碎碎念**😎:本节将介绍 ESP32 的 LEDPWM 外设,帮助你实现对 LED 灯光的精准控制,打造炫酷灯光效果。 +> - 📺 **视频教程**:🚧 *开发中* +> - 💾 **示例代码**:🚧 *开发中* ## 一、介绍: LED 控制器 (LEDC) 主要用于控制 LED,也可产生 PWM 信号用于其他设备的控制。该控制器有 8 路通道,可以产生独立的波形,驱动 RGB LED 等设备。 diff --git a/docs/04.外设学习/4.1-基础外设/4.1.7-I2C/I2C通信.md b/docs/04.外设学习/4.1-基础外设/4.1.7-I2C/I2C通信.md index bfd1514..4d749f3 100644 --- a/docs/04.外设学习/4.1-基础外设/4.1.7-I2C/I2C通信.md +++ b/docs/04.外设学习/4.1-基础外设/4.1.7-I2C/I2C通信.md @@ -1,6 +1,12 @@ # ESP32外设-I2C入门 +> [!TIP] 🚀 **ESP32 外设-I2C入门 | 快速实现设备通信** +> - 💡 **碎碎念**😎:本节将介绍 ESP32 的 I2C 外设,帮助你实现多个设备之间的高效通信。 +> - 📺 **视频教程**:🚧 *开发中* +> - 💾 **示例代码**:🚧 *开发中* + + ## 一、介绍 I2C 是一种串行同步半双工通信协议,总线上可以同时挂载多个主机和从机。I2C 总线由串行数据线 (SDA) 和串行时钟线 (SCL) 线构成。这些线都需要上拉电阻。 diff --git a/docs/04.外设学习/4.1-基础外设/4.1.8-SPI/SPI通信.md b/docs/04.外设学习/4.1-基础外设/4.1.8-SPI/SPI通信.md index e69de29..6413dcc 100644 --- a/docs/04.外设学习/4.1-基础外设/4.1.8-SPI/SPI通信.md +++ b/docs/04.外设学习/4.1-基础外设/4.1.8-SPI/SPI通信.md @@ -0,0 +1,6 @@ +# ESP32外设-SPI通信 + +> [!TIP] 🚀 **ESP32 外设-SPI通信 | 快速数据传输利器** +> - 💡 **碎碎念**😎:本节将介绍 ESP32 的 SPI 外设,帮助你实现高速数据传输,连接多个外设。 +> - 📺 **视频教程**:🚧 *开发中* +> - 💾 **示例代码**:🚧 *开发中* diff --git a/docs/04.外设学习/4.1-基础外设/4.1.9-I2S/I2S入门.md b/docs/04.外设学习/4.1-基础外设/4.1.9-I2S/I2S入门.md index 35803b1..ae0b2c6 100644 --- a/docs/04.外设学习/4.1-基础外设/4.1.9-I2S/I2S入门.md +++ b/docs/04.外设学习/4.1-基础外设/4.1.9-I2S/I2S入门.md @@ -1,6 +1,11 @@ # ESP32外设-I2S入门 +> [!TIP] 🚀 **ESP32 外设-I2S入门 | 音频数据传输利器** +> - 💡 **碎碎念**😎:本节将介绍 ESP32 的 I2S 外设,帮助你实现高质量音频数据的传输与处理。 +> - 📺 **视频教程**:🚧 *开发中* +> - 💾 **示例代码**:🚧 *开发中* + ## 一、概念 diff --git a/docs/04.外设学习/4.2-存储外设/4.2.1-分区表/分区表.md b/docs/04.外设学习/4.2-存储外设/4.2.1-分区表/分区表.md index 9281d6c..12bce02 100644 --- a/docs/04.外设学习/4.2-存储外设/4.2.1-分区表/分区表.md +++ b/docs/04.外设学习/4.2-存储外设/4.2.1-分区表/分区表.md @@ -1,8 +1,9 @@ - - # ESP32存储-分区表入门 - +> [!TIP] 🚀 **ESP32 存储-分区表入门 | 高效管理设备存储空间** +> - 💡 **碎碎念**😎:本节将介绍 ESP32 的分区表,帮助你合理分配存储空间,提高系统的存储效率。 +> - 📺 **视频教程**:🚧 *开发中* +> - 💾 **示例代码**:🚧 *开发中* > **flash**: 它在嵌入式系统中的功能可以和硬盘在PC中的功能相比。它们都是用来存储程序和数据的,好比是ROM。而且可以在掉电的情况下继续保存数据使其不会丢失。Flash memory(闪速存储器)作为一种安全、快速的存储体,具有体积小,容量大,成本低,掉电数据不丢失等一系列优点,已成为嵌入式系统中数据和程序最主要的载体。根据结构的不同可以将其分为**NOR Flash**和**NAND Flash**两种。NOR Flash的特点是应用程序可以直接在闪存中运行,不需要再把代码读到系统RAM中运行。NAND Flash不行。而我们单片机基本都是NOR FLASN。 diff --git a/docs/04.外设学习/4.2-存储外设/4.2.2-非易失性存储/非易失性存储.md b/docs/04.外设学习/4.2-存储外设/4.2.2-非易失性存储/非易失性存储.md index f9e3e16..0c82a30 100644 --- a/docs/04.外设学习/4.2-存储外设/4.2.2-非易失性存储/非易失性存储.md +++ b/docs/04.外设学习/4.2-存储外设/4.2.2-非易失性存储/非易失性存储.md @@ -4,6 +4,11 @@ # ESP32存储-非易失性存储 (NVS) +> [!TIP] 🚀 **ESP32 存储-非易失性存储 (NVS) | 稳定持久存储解决方案** +> - 💡 **碎碎念**😎:本节将介绍 ESP32 的非易失性存储 (NVS),让你轻松保存配置信息及其他数据,即使设备断电也能保持数据。 +> - 📺 **视频教程**:🚧 *开发中* +> - 💾 **示例代码**:🚧 *开发中* + ## 一、介绍 #### 1.1 基本概念 diff --git a/docs/04.外设学习/4.2-存储外设/4.2.3-FAT文件系统/FAT文件系统.md b/docs/04.外设学习/4.2-存储外设/4.2.3-FAT文件系统/FAT文件系统.md index 8076c13..e4e7f81 100644 --- a/docs/04.外设学习/4.2-存储外设/4.2.3-FAT文件系统/FAT文件系统.md +++ b/docs/04.外设学习/4.2-存储外设/4.2.3-FAT文件系统/FAT文件系统.md @@ -3,6 +3,12 @@ # ESP32存储-VFS虚拟文件系统 +> [!TIP] 🚀 **ESP32 存储-VFS虚拟文件系统 | 灵活管理文件存储** +> - 💡 **碎碎念**😎:本节将介绍 ESP32 的虚拟文件系统(VFS),帮助你在多个存储设备之间创建统一的文件访问接口。 +> - 📺 **视频教程**:🚧 *开发中* +> - 💾 **示例代码**:🚧 *开发中* + + ## 一、介绍 #### 1.1 什么是VFS diff --git a/docs/04.外设学习/4.2-存储外设/4.2.4-SPIFFS文件系统/SPIFFS文件系统.md b/docs/04.外设学习/4.2-存储外设/4.2.4-SPIFFS文件系统/SPIFFS文件系统.md index fedf155..bd45696 100644 --- a/docs/04.外设学习/4.2-存储外设/4.2.4-SPIFFS文件系统/SPIFFS文件系统.md +++ b/docs/04.外设学习/4.2-存储外设/4.2.4-SPIFFS文件系统/SPIFFS文件系统.md @@ -3,6 +3,12 @@ # ESP32存储-SPIFFS文件系统 +> [!TIP] 🚀 **ESP32 存储-SPIFFS文件系统 | 让存储更高效!** +> - 💡 **碎碎念**😎:本节将介绍 ESP32 的 SPIFFS 文件系统,帮助你在闪存中管理文件,实现高效的文件存储与读取。 +> - 📺 **视频教程**:🚧 *开发中* +> - 💾 **示例代码**:🚧 *开发中* + + ## 一、介绍 关于[esp32](https://so.csdn.net/so/search?q=esp32&spm=1001.2101.3001.7020)的spiffs文件系统的详细内容,请看esp32官网的介绍:[espidf编程指南-spiffs](https://docs.espressif.com/projects/esp-idf/zh_CN/release-v4.1/api-reference/storage/spiffs.html) diff --git a/docs/04.外设学习/4.2-存储外设/4.2.5-SD卡驱动/SD卡驱动.md b/docs/04.外设学习/4.2-存储外设/4.2.5-SD卡驱动/SD卡驱动.md index 1618820..0b7e790 100644 --- a/docs/04.外设学习/4.2-存储外设/4.2.5-SD卡驱动/SD卡驱动.md +++ b/docs/04.外设学习/4.2-存储外设/4.2.5-SD卡驱动/SD卡驱动.md @@ -1,6 +1,12 @@ # ESP32存储-SD、SDIO、MMC 驱动 +> [!TIP] 🚀 **ESP32 存储-SD、SDIO、MMC 驱动 | 高效管理存储卡数据** +> - 💡 **碎碎念**😎:本节将介绍 ESP32 支持的 SD、SDIO 和 MMC 驱动,帮助你轻松实现与存储卡的数据交互。 +> - 📺 **视频教程**:🚧 *开发中* +> - 💾 **示例代码**:🚧 *开发中* + + ## 一、基本概念 ### 1.1 SD卡科普 diff --git a/docs/04.外设学习/4.3-其他外设/4.3.1-MCPWM/MCPWM.md b/docs/04.外设学习/4.3-其他外设/4.3.1-MCPWM/MCPWM.md index 89a3442..a39d9b9 100644 --- a/docs/04.外设学习/4.3-其他外设/4.3.1-MCPWM/MCPWM.md +++ b/docs/04.外设学习/4.3-其他外设/4.3.1-MCPWM/MCPWM.md @@ -1,3 +1,9 @@ # 电机控制脉宽调制器 (MCPWM) +> [!TIP] 🚀 **ESP32 电机控制脉宽调制器 (MCPWM) | 精确控制电机速度与方向** +> - 💡 **碎碎念**😎:本节将介绍 ESP32 的电机控制脉宽调制器(MCPWM),帮助你实现对电机速度和方向的精确控制。 +> - 📺 **视频教程**:🚧 *开发中* +> - 💾 **示例代码**:🚧 *开发中* + + MCPWM 外设是一个多功能 PWM 生成器,集成多个子模块,在电力电子应用(如电机控制、数字电源等)中至关重要。 \ No newline at end of file diff --git a/docs/05.FreeRTOS进阶/5.1-队列/FreeRTOS队列使用教程.md b/docs/05.FreeRTOS进阶/5.1-队列/FreeRTOS队列使用教程.md index 68b6e82..c2a0a50 100644 --- a/docs/05.FreeRTOS进阶/5.1-队列/FreeRTOS队列使用教程.md +++ b/docs/05.FreeRTOS进阶/5.1-队列/FreeRTOS队列使用教程.md @@ -1,4 +1,9 @@ -# FreeRTOS—队列 +# FreeRTOS进阶—队列 + +> [!TIP] 🚀 **FreeRTOS 进阶—队列 | 高效的任务间数据传输** +> - 💡 **碎碎念**😎:本节将深入介绍 FreeRTOS 中的队列机制,帮助你在任务间高效传输数据,保证系统的响应性和稳定性。 +> - 📺 **视频教程**:🚧 *开发中* +> - 💾 **示例代码**:🚧 *开发中* ## 1. 队列创建与传参 diff --git a/docs/05.FreeRTOS进阶/5.2-信号量/FreeRTOS信号量教程.md b/docs/05.FreeRTOS进阶/5.2-信号量/FreeRTOS信号量教程.md index 35e140b..e2f033b 100644 --- a/docs/05.FreeRTOS进阶/5.2-信号量/FreeRTOS信号量教程.md +++ b/docs/05.FreeRTOS进阶/5.2-信号量/FreeRTOS信号量教程.md @@ -1,4 +1,10 @@ -# 信号量 +# FreeRTOS进阶—信号量 + +> [!TIP] 🚀 **FreeRTOS 信号量 | 控制任务的执行顺序与共享资源访问** +> - 💡 **碎碎念**😎:本节将讲解 FreeRTOS 中的信号量机制,帮助你在多任务环境中有效管理资源的访问顺序,避免竞争条件。 +> - 📺 **视频教程**:🚧 *开发中* +> - 💾 **示例代码**:🚧 *开发中* + FreeRTOS 提供了信号量和互斥锁,用于任务间的同步和资源共享管理。信号量更偏向于任务同步,而互斥锁用于保护共享资源。 ## 1. 二进制信号量 diff --git a/docs/05.FreeRTOS进阶/5.3-互斥量/FreeRTOS互斥量教程.md b/docs/05.FreeRTOS进阶/5.3-互斥量/FreeRTOS互斥量教程.md index 472087b..769dc4e 100644 --- a/docs/05.FreeRTOS进阶/5.3-互斥量/FreeRTOS互斥量教程.md +++ b/docs/05.FreeRTOS进阶/5.3-互斥量/FreeRTOS互斥量教程.md @@ -1,4 +1,9 @@ -# 互斥锁 +# FreeRTOS进阶—互斥锁 + +> [!TIP] 🚀 **FreeRTOS 互斥锁 | 保证任务间共享资源的独占访问** +> - 💡 **碎碎念**😎:本节将讲解 FreeRTOS 中的互斥锁机制,帮助你确保在多任务环境中对共享资源的独占访问,避免数据冲突。 +> - 📺 **视频教程**:🚧 *开发中* +> - 💾 **示例代码**:🚧 *开发中* ## 1. 互斥量 diff --git a/docs/05.FreeRTOS进阶/5.4-事件组/FreeRTOS事件组教程.md b/docs/05.FreeRTOS进阶/5.4-事件组/FreeRTOS事件组教程.md index 640e397..52e47cd 100644 --- a/docs/05.FreeRTOS进阶/5.4-事件组/FreeRTOS事件组教程.md +++ b/docs/05.FreeRTOS进阶/5.4-事件组/FreeRTOS事件组教程.md @@ -1,5 +1,10 @@ +# FreeRTOS进阶—事件组 + +> [!TIP] 🚀 **FreeRTOS 事件组 | 高效的任务同步与状态管理** +> - 💡 **碎碎念**😎:本节将介绍 FreeRTOS 中的事件组机制,帮助你在多任务环境中实现高效的任务同步和状态管理。 +> - 📺 **视频教程**:🚧 *开发中* +> - 💾 **示例代码**:🚧 *开发中* -# 事件组 事件组是一种实现任务间通信和同步的机制,主要用于协调多个任务或中断之间的执行。 diff --git a/docs/05.FreeRTOS进阶/5.5-任务通知/FreeRTOS任务通知教程.md b/docs/05.FreeRTOS进阶/5.5-任务通知/FreeRTOS任务通知教程.md index c6895e2..b349d71 100644 --- a/docs/05.FreeRTOS进阶/5.5-任务通知/FreeRTOS任务通知教程.md +++ b/docs/05.FreeRTOS进阶/5.5-任务通知/FreeRTOS任务通知教程.md @@ -1,5 +1,11 @@ # 任务通知 +> [!TIP] 🚀 **FreeRTOS 任务通知 | 高效的任务间通讯机制** +> - 💡 **碎碎念**😎:本节将讲解 FreeRTOS 中的任务通知机制,帮助你实现任务间高效的通讯和信号传递,减少资源消耗。 +> - 📺 **视频教程**:🚧 *开发中* +> - 💾 **示例代码**:🚧 *开发中* + + 任务通知(Task Notifications)是一种轻量级的任务间通信和同步机制,它比队列或事件组更加高效,因为它不需要动态分配内存。每个任务都内置了一个任务通知值,其他任务或中断服务例程(ISR)可以用它来通知该任务事件的发生。 **特点**: diff --git a/docs/06.Wi-Fi功能与相关协议/6.1-Wi-Fi功能入门/6.1.1-Wi-Fi模式与介绍/Wi-Fi模式与介绍.md b/docs/06.Wi-Fi功能与相关协议/6.1-Wi-Fi功能入门/6.1.1-Wi-Fi模式与介绍/Wi-Fi模式与介绍.md index 18383ac..64def2c 100644 --- a/docs/06.Wi-Fi功能与相关协议/6.1-Wi-Fi功能入门/6.1.1-Wi-Fi模式与介绍/Wi-Fi模式与介绍.md +++ b/docs/06.Wi-Fi功能与相关协议/6.1-Wi-Fi功能入门/6.1.1-Wi-Fi模式与介绍/Wi-Fi模式与介绍.md @@ -1,645 +1,7 @@ +# # WiFi介绍 -# ESP32网络入门-WIFI连接 - -## 一、介绍 - -在开始使用WIFI之前,我们需要掌握一些基本的概念和前置知识: - ->最基本的一点:Wi-Fi是物理层和数据链路层的东西,Wi-Fi取代的是以太网的网线和交换机上的口,通过无线电波来收发信息。换句话说,这里说的WIFI暂时不涉及网络层协议。 - -### 1.1 ESP32事件机制 - -> 如果对FreeRTOS的多线程没有任何了解,请先了解一下,可以参考:[线程是什么](https://www.bilibili.com/video/BV1au411E7K1?p=7) - -关于事件循环可以参考下面的链接、大致了解即可。 - -1. [ESP32事件循环](https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/api-reference/system/esp_event.html) -2. [Event Loop 大白话版](https://www.bilibili.com/video/BV1FD4y1j79J/?spm_id_from=333.788&vd_source=ef5a0ab0106372751602034cdd9ab98e) - -### 1.2 ESP32 WIFI的STA和AP模式 - -#### 1.2.1 AP - -AP(Access Point)也就是无线接入点,是一个无线网络的创建者,是网络的中心节点。一般家庭或办公室使用的无线路由器就是一个AP。 - -![](attachments/20240313184111.png) - -#### 1.2.2 STA - -站点(STA,Station)就是每一个连接到无线网络中的终端(如笔记本电脑、PDA及其它可以联网的用户设备)都可称为一个站点。 - -![](attachments/20240313184132.png) - - -## 二、使用 - ->参考:[ESP-IDF:Wi-Fi 驱动程序](https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/api-guides/wifi.html) - -ESP-IDFWiFi库提供的功能如下: - -- 支持仅 station 模式、仅 AP 模式、station/AP 共存模式 -- 支持使用 IEEE 802.11b、IEEE 802.11g、IEEE 802.11n 和 API 配置协议模式 -- 支持 WPA/WPA2/WPA3/WPA2-企业版/WPA3-企业版/WAPI/WPS 和 DPP -- 支持 AMSDU、AMPDU、HT40、QoS 以及其它主要功能 -- 支持乐鑫专属协议,可实现 **1 km** 数据通信量 -- 空中数据传输最高可达 20 MBit/s TCP 吞吐量和 30 MBit/s UDP 吞吐量 -- 支持快速扫描和全信道扫描 -- 支持获取信道状态信息 - -### 2.1 WIFI AP模式 - ->官方示例程序位于: -> -`Espressif\frameworks\esp-idf-v4.4.3\examples\wifi\getting_started\softAP` - -配置流程如下: - -- `nvs_flash_init`,初始化默认 NVS 分区。 -- `esp_netif_init`,初始化底层TCP/IP堆栈(创建一个 LwIP 核心任务,并初始化 LwIP 相关工作。) -- `esp_event_loop_create_default`,创建默认事件循环。 -- `esp_netif_create_default_wifi_ap`,使用默认WiFi AP配置创建esp_netif对象,将netif连接到WiFi并注册默认WiFi处理程序。 -- `esp_wifi_init`,为 WiFi 驱动初始化 WiFi 分配资源,如 WiFi 控制结构、RX/TX 缓冲区、WiFi NVS 结构等,这个 WiFi 也启动 WiFi 任务。必须先调用此API,然后才能调用所有其他WiFi API -- `esp_event_handler_instance_register`,监听WIFI_EVENTWiFi 任意事件,触发事件后,进入回调函数 -- `esp_wifi_set_mode`,设置WiFi工作模式为station、soft-AP或station+soft-AP,默认模式为soft-AP模式。本程序设置为AP -- `esp_wifi_set_config`,设置 ESP32 STA 或 AP 的配置 -- `esp_wifi_start`,根据配置,启动WiFi - -工作流程如下图所示:(看不懂可以忽略,毕竟先用起来慢慢就学会了,也可以看[Michael_ee](https://space.bilibili.com/1338335828)老师的教程:[WIFI热点工作流程](https://www.bilibili.com/video/BV1ye4y1r7XK/?spm_id_from=333.788&vd_source=ef5a0ab0106372751602034cdd9ab98e)) - -![](attachments/20240313190734.png) - -主要的流程分为下面几个部分(图来自官方教程): - -![](attachments/20240313191730.png) - -#### 2.1.1 Wi-Fi准备阶段(图上没有) - -这个阶段我们需要初始化NVS,因为WiFi库内部是依赖这个东西的,NVS的相关知识可以看这篇博客:[ESP32存储-3.VFS虚拟文件系统](https://www.duruofu.top/2024/03/06/4.%E7%A1%AC%E4%BB%B6%E7%9B%B8%E5%85%B3/MCU/ESP32/04.ESP32%E5%AD%98%E5%82%A8%E5%99%A8%E5%85%A5%E9%97%A8/4.3-ESP32%E5%AD%98%E5%82%A8-VFS%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F/ESP32%E5%AD%98%E5%82%A8-VFS%E8%99%9A%E6%8B%9F%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F%E5%85%A5%E9%97%A8/) - -下面直接贴出代码: -```c -// Initialize NVS -esp_err_t ret = nvs_flash_init(); -if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) { - ESP_ERROR_CHECK(nvs_flash_erase()); - ret = nvs_flash_init(); -} -ESP_ERROR_CHECK( ret ); -``` - -#### 2.1.2 Wi-Fi 初始化阶段 - -这个阶段主要有下面几个步骤: - -- 主任务通过调用函数 [`esp_netif_init()`](https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/api-reference/network/esp_netif.html#_CPPv414esp_netif_initv "esp_netif_init") 创建一个 LwIP 核心任务,并初始化 LwIP 相关工作。 -- 主任务通过调用函数 [`esp_event_loop_create()`](https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/api-reference/system/esp_event.html#_CPPv421esp_event_loop_createPK21esp_event_loop_args_tP23esp_event_loop_handle_t "esp_event_loop_create") 创建一个系统事件任务,并初始化应用程序事件的回调函数。在此情况下,该回调函数唯一的动作就是将事件中继到应用程序任务中。 -- 主任务通过调用函数 [`esp_netif_create_default_wifi_ap()`](https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/api-reference/network/esp_netif.html#_CPPv432esp_netif_create_default_wifi_apv "esp_netif_create_default_wifi_ap") 或 [`esp_netif_create_default_wifi_sta()`](https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/api-reference/network/esp_netif.html#_CPPv433esp_netif_create_default_wifi_stav "esp_netif_create_default_wifi_sta") 创建有 TCP/IP 堆栈的默认网络接口实例绑定 station 或 AP。 -- 主任务通过调用函数 [`esp_wifi_init()`](https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/api-reference/network/esp_wifi.html#_CPPv413esp_wifi_initPK18wifi_init_config_t "esp_wifi_init") 创建 Wi-Fi 驱动程序任务,并初始化 Wi-Fi 驱动程序。 -- 主任务通过调用 OS API 创建应用程序任务。 - -代码: - -```c -ESP_ERROR_CHECK(esp_netif_init()); - -ESP_ERROR_CHECK(esp_event_loop_create_default()); - -// *esp_netif_ap 可以用来修改AP设置 -esp_netif_t *esp_netif_ap = esp_netif_create_default_wifi_ap(); - -/*Initialize WiFi */ -wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); -// WIFI_INIT_CONFIG_DEFAULT 是一个默认配置的宏 - -ESP_ERROR_CHECK(esp_wifi_init(&cfg)); -``` - -到这里就完成了wifi初始化。 - -#### 2.1.3 Wi-Fi 配置阶段 - -Wi-Fi 驱动程序初始化成功后,可以进入到配置阶段。 - -通过函数`esp_wifi_set_mode`可以设置WiFi工作模式为station、soft-AP或station+soft-AP。 - -通过函数`esp_wifi_set_config`,设置 ESP32 STA 或 AP 的具体配置(参数很多,可以去官方文档仔细看看,下面只配置几个基本参数)。 - -```c -// 设置为AP模式 - ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_AP)); - -// AP详细配置 -wifi_config_t wifi_ap_config = { - .ap = { - .ssid = ESP_WIFI_AP_SSID, // WIFI名称 - .ssid_len = strlen(ESP_WIFI_AP_SSID), // 名称长度 - .channel = 1, // WIFI信道 - .password = ESP_WIFI_AP_PASSWD, // WiFi密码 - .max_connection = 5, // 最大连接数,默认值是 10 - .authmode = WIFI_AUTH_WPA2_PSK, // WiFi认证方式 - }, -}; -ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_AP, &wifi_ap_config)); -``` - -这里只配配置了基本参数。 -#### 2.1.4 Wi-Fi 启动阶段 - - 使用`esp_wifi_start`,根据配置,启动WiFi - -```c -/* Start WiFi */ -ESP_ERROR_CHECK(esp_wifi_start()); -``` - -这样就完成了一个基本的WIFI AP。 - -但是这样仅仅是最基本的程序,当有外部STA设备接入和断开我们如何在程序里得知呢?这就需要使用之前创建的默认事件循环, - -#### 2.1.5 事件循环 - -调用 [`esp_event_handler_instance_register`](https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/api-reference/system/esp_event.html#_CPPv431esp_event_handler_register_with23esp_event_loop_handle_t16esp_event_base_t7int32_t19esp_event_handler_tPv "esp_event_handler_register_with") 将事件处理函数注册到默认的事件循环中。它与 `esp_event_handler_instance_register_with `函数的功能相同,唯一的区别是将处理器注册到默认事件循环中。 - -```c - -esp_err_t esp_event_handler_instance_register(esp_event_base_t event_base, - int32_t event_id, - esp_event_handler_t event_handler, - void *event_handler_arg, - esp_event_handler_instance_t *instance); -``` - -参数如下: -- 参数 event_base 是要为其注册处理程序的事件的基本ID。 -- 参数 event_id 是要注册处理程序的事件的ID。 -- 参数 event_handler 是当事件被分发时调用的处理函数。 -- 参数 event_handler_arg 是传递给处理函数的除事件数据以外的数据。 -- 参数 instance 是与注册的事件处理器和数据相关的事件处理器实例对象 - -可以在espidf文件里看到相关事件描述: - -![](attachments/20240314165844.png) - - -我们可以在默认事件循环创建后,添加事件处理: - -```c -void WIFI_CallBack(void *event_handler_arg,esp_event_base_t event_base,int32_t event_id,void *event_data) -{ - // 连接事件 - if(event_base == IP_EVENT && event_id == IP_EVENT_AP_STAIPASSIGNED) - { - // 解析数据 - ip_event_ap_staipassigned_t* event_info = (ip_event_ap_staipassigned_t *)event_data; - ESP_LOGW("WIFI_AP", "设备已连接 MAC:"MACSTR"", MAC2STR(event_info->mac)); - } - - // 断开连接事件 - if(event_base == WIFI_EVENT && event_id == WIFI_EVENT_AP_STADISCONNECTED) - { - wifi_event_ap_stadisconnected_t* event_info = (wifi_event_ap_stadisconnected_t*)event_data; - ESP_LOGW("WIFI_AP", "设备已断开 MAC:"MACSTR"", MAC2STR(event_info->mac)); - } -} - -void app_main(void) -{ - // ...... - - // 初始化默认事件循环 - ESP_ERROR_CHECK(esp_event_loop_create_default()); - // 注册设备连接事件回调 - esp_event_handler_instance_register(IP_EVENT, IP_EVENT_AP_STAIPASSIGNED, WIFI_CallBack, NULL, NULL); - // 注册设备断开连接设备回调 - esp_event_handler_instance_register(WIFI_EVENT, WIFI_EVENT_AP_STADISCONNECTED, WIFI_CallBack, NULL, NULL); - - - // ...... -} - -``` - -我们在这里注册了IP_EVENT_AP_STAIPASSIGNED事件,当STA设备连接和断开后就会调用WIFI_CallBack回调函数,打印连接设备的MAC信息。 - -### 2.2 WIFI STA - ->官方示例代码位于(与热点流程相似,但是细节有所不同): -`Espressif\frameworks\esp-idf-v4.4.3\examples\wifi\getting_started\station - -前面几步配配置方式基本相同 - -下面是官方的程序宏观流程: - -![](attachments/20240314220947.png) - -#### 2.2.1 Wi-Fi准备阶段(与上文AP相同) - -初始化NVS: - -```c -// Initialize NVS -esp_err_t ret = nvs_flash_init(); -if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) { - ESP_ERROR_CHECK(nvs_flash_erase()); - ret = nvs_flash_init(); -} -ESP_ERROR_CHECK( ret ); -``` - -#### 2.2.2 Wi-Fi初始化阶段 - -这里与AP的配置不同了,我们需要配置设备为STA模式, - -这里唯一的区别是把`esp_netif_create_default_wifi_ap()`修改为` esp_netif_create_default_wifi_sta()`配置为STA模式 - -```c -ESP_ERROR_CHECK(esp_netif_init()); - -ESP_ERROR_CHECK(esp_event_loop_create_default()); - -// *esp_netif_ap 可以用来修改AP设置 -esp_netif_t *esp_netif_sta = esp_netif_create_default_wifi_sta(); - -/*Initialize WiFi */ -wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); -// WIFI_INIT_CONFIG_DEFAULT 是一个默认配置的宏 - -ESP_ERROR_CHECK(esp_wifi_init(&cfg)); -``` - -#### 2.2.3 Wi-Fi配置阶段 - -这里与AP模式类似,但是配置结构体里的内容有差异 - -``` c -............... -#define ESP_WIFI_STA_SSID "duruofu_win10" -#define ESP_WIFI_STA_PASSWD "1234567890" - -................. - -// 设置为STA模式 -ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA)); - -// STA详细配置 -wifi_config_t sta_config = { - .sta = { - .ssid = ESP_WIFI_STA_SSID, - .password = ESP_WIFI_STA_PASSWD, - .bssid_set = false, - }, -} ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &sta_config)); - -``` - -这里的配置信息顾名思义就是要连接的wifi名称和密码(当然还有更多参数,可以参考ESP-IDF参数说明)。 - -#### 2.2.4 Wi-Fi 启动阶段 - -和AP模式不同,这里多了一个`esp_wifi_connect()`用于连接wifi。 - -```c -//----------------启动阶段------------------- -ESP_ERROR_CHECK(esp_wifi_start()); -ESP_ERROR_CHECK(esp_wifi_connect()); -``` - -#### 2.2.5 事件循环 - -同样的,我们可以像前面一样添加事件回调函数 - -这里监听了启动事件,连接失败事件,连接成功事件,代码很简单就不展开解释了。 - -```c - -void WIFI_CallBack(void *event_handler_arg,esp_event_base_t event_base,int32_t event_id,void *event_data) -{ - static uint8_t connect_count = 0; - // WIFI 启动成功 - if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START) - { - ESP_LOGI("WIFI_EVENT", "WIFI_EVENT_STA_START"); - ESP_ERROR_CHECK(esp_wifi_connect()); - } - // WIFI 连接失败 - if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_DISCONNECTED) - { - ESP_LOGI("WIFI_EVENT", "WIFI_EVENT_STA_DISCONNECTED"); - connect_count++; - if (connect_count < 6) - { - ESP_ERROR_CHECK(esp_wifi_connect()); - } - else{ - ESP_LOGI("WIFI_EVENT", "WIFI_EVENT_STA_DISCONNECTED 10 times"); - } - } - // WIFI 连接成功(获取到了IP) - if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) - { - ESP_LOGI("WIFI_EVENT", "WIFI_EVENT_STA_GOT_IP"); - ip_event_got_ip_t *info = (ip_event_got_ip_t *)event_data; - ESP_LOGI("WIFI_EVENT", "got ip:" IPSTR "", IP2STR(&info->ip_info.ip)); - } -} - -void app_main(void) -{ - // ...... - - // 初始化默认事件循环 - ESP_ERROR_CHECK(esp_event_loop_create_default()); - // 注册事件(wifi启动成功) - ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT, WIFI_EVENT_STA_START, WIFI_CallBack, NULL, NULL)) - // 注册事件(wifi连接失败) - ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT, WIFI_EVENT_STA_DISCONNECTED, WIFI_CallBack, NULL, NULL)) - // 注册事件(wifi连接失败) - ESP_ERROR_CHECK(esp_event_handler_instance_register(IP_EVENT, IP_EVENT_STA_GOT_IP, WIFI_CallBack, NULL, NULL)) - - // ...... -} - -``` - -### 2.3 补充 - -#### 2.3.1 WIFI的省电模式 - - -可以使用`esp_wifi_set_ps()`函数来配置WIFI的省电模式。 - -这个函数可以有三个参数可选: -``` c -typedef enum { - WIFI_PS_NONE, /**< No power save */ - WIFI_PS_MIN_MODEM, /**< Minimum modem power saving. In this mode, station wakes up to receive beacon every DTIM period */ - WIFI_PS_MAX_MODEM, /**< Maximum modem power saving. In this mode, interval to receive beacons is determined by the listen_interval parameter in wifi_sta_config_t */ -} wifi_ps_type_t; - -``` - -关于省电模式可以参考:[Wi-Fi场景如何选择低功耗模式](https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/api-guides/low-power-mode.html#id8 "永久链接至标题") - -#### 2.3.2 静态IP配置 - -在`esp_netif_create_default_wifi_sta()`创建好DHCP客户端后使用函数`esp_err_t esp_netif_dhcpc_stop(esp_netif_t *esp_netif)`停止DHCP客户端。 - -使用`esp_netif_set_ip_info()`配置我们想要的静态IP,如下: - -```c -// 初始化STA设备 -esp_netif_t *esp_netif = esp_netif_create_default_wifi_sta(); - -// ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ -//*******************配置静态IP************************* -esp_netif_dhcpc_stop(esp_netif); -esp_netif_ip_info_t ipInfo; -ipInfo.ip.addr = inet_addr("192.168.138.2"); -ipInfo.netmask = inet_addr("255.255.255.0"); -ipInfo.gw = inet_addr("192.168.138.2"); - -esp_netif_set_ip_info(esp_netif, &ipInfo); -esp_netif_dhcpc_start(esp_netif); -//*******************配置静态IP************************* -// ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ -``` - -### 2.3.1 WIFI Scan - -我们使用`esp_wifi_start`后,会根据配置,启动WiFI。如果不立即连接到设定的WIFI热点,我们也可以使用WIFI Scan来寻找可连接的设备。 - -`esp_wifi_scan_start`,扫描所有有效的AP -`esp_wifi_scan_get_ap_records`,获取上次扫描中找到的AP列表 `esp_wifi_scan_get_ap_num`,获取上次扫描中找到的AP数 - -这里也没什么复杂的,建议直接参考IDF官方文档:[ESP32 Wi-Fi 扫描](https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/api-guides/wifi.html#id17 "永久链接至标题") -## 三、实例 - -### 3.1 WIFI AP模式 - -下面基于第二部分的教程实现了WIFI AP模式 -代码链接: - -> https://github.com/DuRuofu/ESP32_Learning/tree/master/05.wifi/wifi_ap - -```c -#include -#include "freertos/FreeRTOS.h" -#include "freertos/event_groups.h" -#include "esp_wifi.h" -#include "esp_log.h" -#include "esp_event.h" -#include "nvs_flash.h" -#include "esp_mac.h" - -#define ESP_WIFI_AP_SSID "DuRuofu_ESP32" -#define ESP_WIFI_AP_PASSWD "3.1415926" - -void WIFI_CallBack(void *event_handler_arg,esp_event_base_t event_base,int32_t event_id,void *event_data) -{ - // 连接事件 - if(event_base == IP_EVENT && event_id == IP_EVENT_AP_STAIPASSIGNED) - { - // 解析数据 - ip_event_ap_staipassigned_t* event_info = (ip_event_ap_staipassigned_t *)event_data; - ESP_LOGW("WIFI_AP", "设备已连接 MAC:"MACSTR"", MAC2STR(event_info->mac)); - } - - // 断开连接事件 - if(event_base == WIFI_EVENT && event_id == WIFI_EVENT_AP_STADISCONNECTED) - { - wifi_event_ap_stadisconnected_t* event_info = (wifi_event_ap_stadisconnected_t*)event_data; - ESP_LOGW("WIFI_AP", "设备已断开 MAC:"MACSTR"", MAC2STR(event_info->mac)); - } -} - -void app_main(void) -{ - //----------------准备阶段------------------- - // Initialize NVS - esp_err_t ret = nvs_flash_init(); - if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) - { - ESP_ERROR_CHECK(nvs_flash_erase()); - ret = nvs_flash_init(); - } - ESP_ERROR_CHECK(ret); - - //---------------初始化阶段------------------ - - ESP_ERROR_CHECK(esp_netif_init()); - - // 初始化默认事件循环 - ESP_ERROR_CHECK(esp_event_loop_create_default()); - // 注册设备连接事件回调 - esp_event_handler_instance_register(IP_EVENT, IP_EVENT_AP_STAIPASSIGNED, WIFI_CallBack, NULL, NULL); - // 注册设备断开连接设备回调 - esp_event_handler_instance_register(WIFI_EVENT, WIFI_EVENT_AP_STADISCONNECTED, WIFI_CallBack, NULL, NULL); - - // *esp_netif_ap 可以用来修改AP设置 - esp_netif_t *esp_netif_ap = esp_netif_create_default_wifi_ap(); - - /*Initialize WiFi */ - wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); - // WIFI_INIT_CONFIG_DEFAULT 是一个默认配置的宏 - ESP_ERROR_CHECK(esp_wifi_init(&cfg)); - - //---------------配置阶段-------------------- - // 设置为AP模式 - ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_AP)); - - // AP详细配置 - wifi_config_t wifi_ap_config = { - .ap = { - .ssid = ESP_WIFI_AP_SSID, // WIFI名称 - .ssid_len = strlen(ESP_WIFI_AP_SSID), // 名称长度 - .channel = 1, // WIFI信道 - .password = ESP_WIFI_AP_PASSWD, // WiFi密码 - .max_connection = 5, // 最大连接数,默认值是 10 - .authmode = WIFI_AUTH_WPA2_PSK, // WiFi认证方式 - }, - }; - ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_AP, &wifi_ap_config)); - - //---------------启动阶段-------------------- - /* Start WiFi */ - ESP_ERROR_CHECK(esp_wifi_start()); -} -``` - -效果展示: - -![](attachments/20240314220318.png) - -连接wifi会打印连接设备的信息。 - -### 3.2 WIFI STA模式 - -下面基于第二部分的教程实现了WIFI STA模式 -代码链接: - -> https://github.com/DuRuofu/ESP32_Learning/tree/master/05.wifi/wifi_sta - -```c - -#include -#include -#include "freertos/FreeRTOS.h" -#include "freertos/event_groups.h" -#include "esp_wifi.h" -#include "esp_log.h" -#include "esp_event.h" -#include "nvs_flash.h" -#include "esp_mac.h" - -#define ESP_WIFI_STA_SSID "duruofu_win10" -#define ESP_WIFI_STA_PASSWD "1234567890" - -void WIFI_CallBack(void *event_handler_arg, esp_event_base_t event_base, int32_t event_id, void *event_data) -{ - static uint8_t connect_count = 0; - // WIFI 启动成功 - if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START) - { - ESP_LOGI("WIFI_EVENT", "WIFI_EVENT_STA_START"); - ESP_ERROR_CHECK(esp_wifi_connect()); - } - // WIFI 连接失败 - if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_DISCONNECTED) - { - ESP_LOGI("WIFI_EVENT", "WIFI_EVENT_STA_DISCONNECTED"); - connect_count++; - if (connect_count < 6) - { - ESP_ERROR_CHECK(esp_wifi_connect()); - } - else{ - ESP_LOGI("WIFI_EVENT", "WIFI_EVENT_STA_DISCONNECTED 10 times"); - } - } - // WIFI 连接成功(获取到了IP) - if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) - { - ESP_LOGI("WIFI_EVENT", "WIFI_EVENT_STA_GOT_IP"); - ip_event_got_ip_t *info = (ip_event_got_ip_t *)event_data; - ESP_LOGI("WIFI_EVENT", "got ip:" IPSTR "", IP2STR(&info->ip_info.ip)); - } -} - -void app_main(void) -{ - //----------------准备阶段------------------- - // Initialize NVS - esp_err_t ret = nvs_flash_init(); - if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) - { - ESP_ERROR_CHECK(nvs_flash_erase()); - ret = nvs_flash_init(); - } - ESP_ERROR_CHECK(ret); - - //----------------初始化阶段------------------- - ESP_ERROR_CHECK(esp_netif_init()); - - ESP_ERROR_CHECK(esp_event_loop_create_default()); - // 注册事件(wifi启动成功) - ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT, WIFI_EVENT_STA_START, WIFI_CallBack, NULL, NULL)); - // 注册事件(wifi连接失败) - ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT, WIFI_EVENT_STA_DISCONNECTED, WIFI_CallBack, NULL, NULL)); - // 注册事件(wifi连接失败) - ESP_ERROR_CHECK(esp_event_handler_instance_register(IP_EVENT, IP_EVENT_STA_GOT_IP, WIFI_CallBack, NULL, NULL)); - - // 初始化STA设备 - esp_netif_create_default_wifi_sta(); - - /*Initialize WiFi */ - wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); - // WIFI_INIT_CONFIG_DEFAULT 是一个默认配置的宏 - - ESP_ERROR_CHECK(esp_wifi_init(&cfg)); - - //----------------配置阶段------------------- - // 设置为STA模式 - ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA)); - - // STA详细配置 - wifi_config_t sta_config = { - .sta = { - .ssid = ESP_WIFI_STA_SSID, - .password = ESP_WIFI_STA_PASSWD, - .bssid_set = false, - }, - }; - ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &sta_config)); - - //----------------启动阶段------------------- - ESP_ERROR_CHECK(esp_wifi_start()); - -} - -``` - -效果如下: - -![](attachments/20240315084947.png) - - -### 3.2 WIFI配置静态IP - -代码链接: - -> https://github.com/DuRuofu/ESP32_Learning/tree/master/05.wifi/wifi_sta_static_ip - -### 3.3 WIFI Scan - -代码链接: - -> https://github.com/DuRuofu/ESP32_Learning/tree/master/05.wifi/wifi_scan - -效果: - -![](attachments/20240315100518.png) -# 参考链接 - -1. https://www.bilibili.com/video/BV1au411E7K1?p=7&vd_source=ef5a0ab0106372751602034cdd9ab98e -2. https://www.bilibili.com/video/BV1au411E7K1?p=8&vd_source=ef5a0ab0106372751602034cdd9ab98e -3. https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/api-guides/wifi.html \ No newline at end of file +> [!TIP] 🚀 **WiFi基础知识 | 连接世界的桥梁** +> - 💡 **碎碎念**😎:本节将介绍 WiFi 的基本概念、工作原理,助你快速入门无线通信。 +> - 📺 **视频教程**:🚧 *开发中* +> - 💾 **示例代码**:🚧 *开发中* +> - 📚 **相关文档**: diff --git a/docs/06.Wi-Fi功能与相关协议/6.1-Wi-Fi功能入门/6.1.2-Wi-Fi的STA与AP配置/Wi-Fi的STA与AP配置.md b/docs/06.Wi-Fi功能与相关协议/6.1-Wi-Fi功能入门/6.1.2-Wi-Fi的STA与AP配置/Wi-Fi的STA与AP配置.md index e69de29..5ccaf4d 100644 --- a/docs/06.Wi-Fi功能与相关协议/6.1-Wi-Fi功能入门/6.1.2-Wi-Fi的STA与AP配置/Wi-Fi的STA与AP配置.md +++ b/docs/06.Wi-Fi功能与相关协议/6.1-Wi-Fi功能入门/6.1.2-Wi-Fi的STA与AP配置/Wi-Fi的STA与AP配置.md @@ -0,0 +1,649 @@ + +# ESP32网络入门 - WIFI基本使用 + +> [!TIP] 🚀 **WiFi基础使用 | 让你的ESP32连接互联网** +> - 💡 **碎碎念**😎:本节将介绍如何在 ESP32 上使用 WiFi 功能,包括WIFI AP 和WIFI STA。 +> - 📺 **视频教程**:🚧 *开发中* +> - 💾 **示例代码**:🚧 *开发中* +## 一、介绍 + +在开始使用WIFI之前,我们需要掌握一些基本的概念和前置知识: + +>最基本的一点:Wi-Fi是物理层和数据链路层的东西,Wi-Fi取代的是以太网的网线和交换机上的口,通过无线电波来收发信息。换句话说,这里说的WIFI暂时不涉及网络层协议。 + +### 1.1 ESP32事件机制 + +> 如果对FreeRTOS的多线程没有任何了解,请先了解一下,可以参考:[线程是什么](https://www.bilibili.com/video/BV1au411E7K1?p=7) + +关于事件循环可以参考下面的链接、大致了解即可。 + +1. [ESP32事件循环](https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/api-reference/system/esp_event.html) +2. [Event Loop 大白话版](https://www.bilibili.com/video/BV1FD4y1j79J/?spm_id_from=333.788&vd_source=ef5a0ab0106372751602034cdd9ab98e) + +### 1.2 ESP32 WIFI的STA和AP模式 + +#### 1.2.1 AP + +AP(Access Point)也就是无线接入点,是一个无线网络的创建者,是网络的中心节点。一般家庭或办公室使用的无线路由器就是一个AP。 + +![](attachments/20240313184111.png) + +#### 1.2.2 STA + +站点(STA,Station)就是每一个连接到无线网络中的终端(如笔记本电脑、PDA及其它可以联网的用户设备)都可称为一个站点。 + +![](attachments/20240313184132.png) + + +## 二、使用 + +>参考:[ESP-IDF:Wi-Fi 驱动程序](https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/api-guides/wifi.html) + +ESP-IDFWiFi库提供的功能如下: + +- 支持仅 station 模式、仅 AP 模式、station/AP 共存模式 +- 支持使用 IEEE 802.11b、IEEE 802.11g、IEEE 802.11n 和 API 配置协议模式 +- 支持 WPA/WPA2/WPA3/WPA2-企业版/WPA3-企业版/WAPI/WPS 和 DPP +- 支持 AMSDU、AMPDU、HT40、QoS 以及其它主要功能 +- 支持乐鑫专属协议,可实现 **1 km** 数据通信量 +- 空中数据传输最高可达 20 MBit/s TCP 吞吐量和 30 MBit/s UDP 吞吐量 +- 支持快速扫描和全信道扫描 +- 支持获取信道状态信息 + +### 2.1 WIFI AP模式 + +>官方示例程序位于: +> +`Espressif\frameworks\esp-idf-v4.4.3\examples\wifi\getting_started\softAP` + +配置流程如下: + +- `nvs_flash_init`,初始化默认 NVS 分区。 +- `esp_netif_init`,初始化底层TCP/IP堆栈(创建一个 LwIP 核心任务,并初始化 LwIP 相关工作。) +- `esp_event_loop_create_default`,创建默认事件循环。 +- `esp_netif_create_default_wifi_ap`,使用默认WiFi AP配置创建esp_netif对象,将netif连接到WiFi并注册默认WiFi处理程序。 +- `esp_wifi_init`,为 WiFi 驱动初始化 WiFi 分配资源,如 WiFi 控制结构、RX/TX 缓冲区、WiFi NVS 结构等,这个 WiFi 也启动 WiFi 任务。必须先调用此API,然后才能调用所有其他WiFi API +- `esp_event_handler_instance_register`,监听WIFI_EVENTWiFi 任意事件,触发事件后,进入回调函数 +- `esp_wifi_set_mode`,设置WiFi工作模式为station、soft-AP或station+soft-AP,默认模式为soft-AP模式。本程序设置为AP +- `esp_wifi_set_config`,设置 ESP32 STA 或 AP 的配置 +- `esp_wifi_start`,根据配置,启动WiFi + +工作流程如下图所示:(看不懂可以忽略,毕竟先用起来慢慢就学会了,也可以看[Michael_ee](https://space.bilibili.com/1338335828)老师的教程:[WIFI热点工作流程](https://www.bilibili.com/video/BV1ye4y1r7XK/?spm_id_from=333.788&vd_source=ef5a0ab0106372751602034cdd9ab98e)) + +![](attachments/20240313190734.png) + +主要的流程分为下面几个部分(图来自官方教程): + +![](attachments/20240313191730.png) + +#### 2.1.1 Wi-Fi准备阶段(图上没有) + +这个阶段我们需要初始化NVS,因为WiFi库内部是依赖这个东西的,NVS的相关知识可以看这篇博客:[ESP32存储-3.VFS虚拟文件系统](https://www.duruofu.top/2024/03/06/4.%E7%A1%AC%E4%BB%B6%E7%9B%B8%E5%85%B3/MCU/ESP32/04.ESP32%E5%AD%98%E5%82%A8%E5%99%A8%E5%85%A5%E9%97%A8/4.3-ESP32%E5%AD%98%E5%82%A8-VFS%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F/ESP32%E5%AD%98%E5%82%A8-VFS%E8%99%9A%E6%8B%9F%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F%E5%85%A5%E9%97%A8/) + +下面直接贴出代码: +```c +// Initialize NVS +esp_err_t ret = nvs_flash_init(); +if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) { + ESP_ERROR_CHECK(nvs_flash_erase()); + ret = nvs_flash_init(); +} +ESP_ERROR_CHECK( ret ); +``` + +#### 2.1.2 Wi-Fi 初始化阶段 + +这个阶段主要有下面几个步骤: + +- 主任务通过调用函数 [`esp_netif_init()`](https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/api-reference/network/esp_netif.html#_CPPv414esp_netif_initv "esp_netif_init") 创建一个 LwIP 核心任务,并初始化 LwIP 相关工作。 +- 主任务通过调用函数 [`esp_event_loop_create()`](https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/api-reference/system/esp_event.html#_CPPv421esp_event_loop_createPK21esp_event_loop_args_tP23esp_event_loop_handle_t "esp_event_loop_create") 创建一个系统事件任务,并初始化应用程序事件的回调函数。在此情况下,该回调函数唯一的动作就是将事件中继到应用程序任务中。 +- 主任务通过调用函数 [`esp_netif_create_default_wifi_ap()`](https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/api-reference/network/esp_netif.html#_CPPv432esp_netif_create_default_wifi_apv "esp_netif_create_default_wifi_ap") 或 [`esp_netif_create_default_wifi_sta()`](https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/api-reference/network/esp_netif.html#_CPPv433esp_netif_create_default_wifi_stav "esp_netif_create_default_wifi_sta") 创建有 TCP/IP 堆栈的默认网络接口实例绑定 station 或 AP。 +- 主任务通过调用函数 [`esp_wifi_init()`](https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/api-reference/network/esp_wifi.html#_CPPv413esp_wifi_initPK18wifi_init_config_t "esp_wifi_init") 创建 Wi-Fi 驱动程序任务,并初始化 Wi-Fi 驱动程序。 +- 主任务通过调用 OS API 创建应用程序任务。 + +代码: + +```c +ESP_ERROR_CHECK(esp_netif_init()); + +ESP_ERROR_CHECK(esp_event_loop_create_default()); + +// *esp_netif_ap 可以用来修改AP设置 +esp_netif_t *esp_netif_ap = esp_netif_create_default_wifi_ap(); + +/*Initialize WiFi */ +wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); +// WIFI_INIT_CONFIG_DEFAULT 是一个默认配置的宏 + +ESP_ERROR_CHECK(esp_wifi_init(&cfg)); +``` + +到这里就完成了wifi初始化。 + +#### 2.1.3 Wi-Fi 配置阶段 + +Wi-Fi 驱动程序初始化成功后,可以进入到配置阶段。 + +通过函数`esp_wifi_set_mode`可以设置WiFi工作模式为station、soft-AP或station+soft-AP。 + +通过函数`esp_wifi_set_config`,设置 ESP32 STA 或 AP 的具体配置(参数很多,可以去官方文档仔细看看,下面只配置几个基本参数)。 + +```c +// 设置为AP模式 + ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_AP)); + +// AP详细配置 +wifi_config_t wifi_ap_config = { + .ap = { + .ssid = ESP_WIFI_AP_SSID, // WIFI名称 + .ssid_len = strlen(ESP_WIFI_AP_SSID), // 名称长度 + .channel = 1, // WIFI信道 + .password = ESP_WIFI_AP_PASSWD, // WiFi密码 + .max_connection = 5, // 最大连接数,默认值是 10 + .authmode = WIFI_AUTH_WPA2_PSK, // WiFi认证方式 + }, +}; +ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_AP, &wifi_ap_config)); +``` + +这里只配配置了基本参数。 +#### 2.1.4 Wi-Fi 启动阶段 + + 使用`esp_wifi_start`,根据配置,启动WiFi + +```c +/* Start WiFi */ +ESP_ERROR_CHECK(esp_wifi_start()); +``` + +这样就完成了一个基本的WIFI AP。 + +但是这样仅仅是最基本的程序,当有外部STA设备接入和断开我们如何在程序里得知呢?这就需要使用之前创建的默认事件循环, + +#### 2.1.5 事件循环 + +调用 [`esp_event_handler_instance_register`](https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/api-reference/system/esp_event.html#_CPPv431esp_event_handler_register_with23esp_event_loop_handle_t16esp_event_base_t7int32_t19esp_event_handler_tPv "esp_event_handler_register_with") 将事件处理函数注册到默认的事件循环中。它与 `esp_event_handler_instance_register_with `函数的功能相同,唯一的区别是将处理器注册到默认事件循环中。 + +```c + +esp_err_t esp_event_handler_instance_register(esp_event_base_t event_base, + int32_t event_id, + esp_event_handler_t event_handler, + void *event_handler_arg, + esp_event_handler_instance_t *instance); +``` + +参数如下: +- 参数 event_base 是要为其注册处理程序的事件的基本ID。 +- 参数 event_id 是要注册处理程序的事件的ID。 +- 参数 event_handler 是当事件被分发时调用的处理函数。 +- 参数 event_handler_arg 是传递给处理函数的除事件数据以外的数据。 +- 参数 instance 是与注册的事件处理器和数据相关的事件处理器实例对象 + +可以在espidf文件里看到相关事件描述: + +![](attachments/20240314165844.png) + + +我们可以在默认事件循环创建后,添加事件处理: + +```c +void WIFI_CallBack(void *event_handler_arg,esp_event_base_t event_base,int32_t event_id,void *event_data) +{ + // 连接事件 + if(event_base == IP_EVENT && event_id == IP_EVENT_AP_STAIPASSIGNED) + { + // 解析数据 + ip_event_ap_staipassigned_t* event_info = (ip_event_ap_staipassigned_t *)event_data; + ESP_LOGW("WIFI_AP", "设备已连接 MAC:"MACSTR"", MAC2STR(event_info->mac)); + } + + // 断开连接事件 + if(event_base == WIFI_EVENT && event_id == WIFI_EVENT_AP_STADISCONNECTED) + { + wifi_event_ap_stadisconnected_t* event_info = (wifi_event_ap_stadisconnected_t*)event_data; + ESP_LOGW("WIFI_AP", "设备已断开 MAC:"MACSTR"", MAC2STR(event_info->mac)); + } +} + +void app_main(void) +{ + // ...... + + // 初始化默认事件循环 + ESP_ERROR_CHECK(esp_event_loop_create_default()); + // 注册设备连接事件回调 + esp_event_handler_instance_register(IP_EVENT, IP_EVENT_AP_STAIPASSIGNED, WIFI_CallBack, NULL, NULL); + // 注册设备断开连接设备回调 + esp_event_handler_instance_register(WIFI_EVENT, WIFI_EVENT_AP_STADISCONNECTED, WIFI_CallBack, NULL, NULL); + + + // ...... +} + +``` + +我们在这里注册了IP_EVENT_AP_STAIPASSIGNED事件,当STA设备连接和断开后就会调用WIFI_CallBack回调函数,打印连接设备的MAC信息。 + +### 2.2 WIFI STA + +>官方示例代码位于(与热点流程相似,但是细节有所不同): +`Espressif\frameworks\esp-idf-v4.4.3\examples\wifi\getting_started\station + +前面几步配配置方式基本相同 + +下面是官方的程序宏观流程: + +![](attachments/20240314220947.png) + +#### 2.2.1 Wi-Fi准备阶段(与上文AP相同) + +初始化NVS: + +```c +// Initialize NVS +esp_err_t ret = nvs_flash_init(); +if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) { + ESP_ERROR_CHECK(nvs_flash_erase()); + ret = nvs_flash_init(); +} +ESP_ERROR_CHECK( ret ); +``` + +#### 2.2.2 Wi-Fi初始化阶段 + +这里与AP的配置不同了,我们需要配置设备为STA模式, + +这里唯一的区别是把`esp_netif_create_default_wifi_ap()`修改为` esp_netif_create_default_wifi_sta()`配置为STA模式 + +```c +ESP_ERROR_CHECK(esp_netif_init()); + +ESP_ERROR_CHECK(esp_event_loop_create_default()); + +// *esp_netif_ap 可以用来修改AP设置 +esp_netif_t *esp_netif_sta = esp_netif_create_default_wifi_sta(); + +/*Initialize WiFi */ +wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); +// WIFI_INIT_CONFIG_DEFAULT 是一个默认配置的宏 + +ESP_ERROR_CHECK(esp_wifi_init(&cfg)); +``` + +#### 2.2.3 Wi-Fi配置阶段 + +这里与AP模式类似,但是配置结构体里的内容有差异 + +``` c +............... +#define ESP_WIFI_STA_SSID "duruofu_win10" +#define ESP_WIFI_STA_PASSWD "1234567890" + +................. + +// 设置为STA模式 +ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA)); + +// STA详细配置 +wifi_config_t sta_config = { + .sta = { + .ssid = ESP_WIFI_STA_SSID, + .password = ESP_WIFI_STA_PASSWD, + .bssid_set = false, + }, +} ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &sta_config)); + +``` + +这里的配置信息顾名思义就是要连接的wifi名称和密码(当然还有更多参数,可以参考ESP-IDF参数说明)。 + +#### 2.2.4 Wi-Fi 启动阶段 + +和AP模式不同,这里多了一个`esp_wifi_connect()`用于连接wifi。 + +```c +//----------------启动阶段------------------- +ESP_ERROR_CHECK(esp_wifi_start()); +ESP_ERROR_CHECK(esp_wifi_connect()); +``` + +#### 2.2.5 事件循环 + +同样的,我们可以像前面一样添加事件回调函数 + +这里监听了启动事件,连接失败事件,连接成功事件,代码很简单就不展开解释了。 + +```c + +void WIFI_CallBack(void *event_handler_arg,esp_event_base_t event_base,int32_t event_id,void *event_data) +{ + static uint8_t connect_count = 0; + // WIFI 启动成功 + if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START) + { + ESP_LOGI("WIFI_EVENT", "WIFI_EVENT_STA_START"); + ESP_ERROR_CHECK(esp_wifi_connect()); + } + // WIFI 连接失败 + if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_DISCONNECTED) + { + ESP_LOGI("WIFI_EVENT", "WIFI_EVENT_STA_DISCONNECTED"); + connect_count++; + if (connect_count < 6) + { + ESP_ERROR_CHECK(esp_wifi_connect()); + } + else{ + ESP_LOGI("WIFI_EVENT", "WIFI_EVENT_STA_DISCONNECTED 10 times"); + } + } + // WIFI 连接成功(获取到了IP) + if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) + { + ESP_LOGI("WIFI_EVENT", "WIFI_EVENT_STA_GOT_IP"); + ip_event_got_ip_t *info = (ip_event_got_ip_t *)event_data; + ESP_LOGI("WIFI_EVENT", "got ip:" IPSTR "", IP2STR(&info->ip_info.ip)); + } +} + +void app_main(void) +{ + // ...... + + // 初始化默认事件循环 + ESP_ERROR_CHECK(esp_event_loop_create_default()); + // 注册事件(wifi启动成功) + ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT, WIFI_EVENT_STA_START, WIFI_CallBack, NULL, NULL)) + // 注册事件(wifi连接失败) + ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT, WIFI_EVENT_STA_DISCONNECTED, WIFI_CallBack, NULL, NULL)) + // 注册事件(wifi连接失败) + ESP_ERROR_CHECK(esp_event_handler_instance_register(IP_EVENT, IP_EVENT_STA_GOT_IP, WIFI_CallBack, NULL, NULL)) + + // ...... +} + +``` + +### 2.3 补充 + +#### 2.3.1 WIFI的省电模式 + + +可以使用`esp_wifi_set_ps()`函数来配置WIFI的省电模式。 + +这个函数可以有三个参数可选: +``` c +typedef enum { + WIFI_PS_NONE, /**< No power save */ + WIFI_PS_MIN_MODEM, /**< Minimum modem power saving. In this mode, station wakes up to receive beacon every DTIM period */ + WIFI_PS_MAX_MODEM, /**< Maximum modem power saving. In this mode, interval to receive beacons is determined by the listen_interval parameter in wifi_sta_config_t */ +} wifi_ps_type_t; + +``` + +关于省电模式可以参考:[Wi-Fi场景如何选择低功耗模式](https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/api-guides/low-power-mode.html#id8 "永久链接至标题") + +#### 2.3.2 静态IP配置 + +在`esp_netif_create_default_wifi_sta()`创建好DHCP客户端后使用函数`esp_err_t esp_netif_dhcpc_stop(esp_netif_t *esp_netif)`停止DHCP客户端。 + +使用`esp_netif_set_ip_info()`配置我们想要的静态IP,如下: + +```c +// 初始化STA设备 +esp_netif_t *esp_netif = esp_netif_create_default_wifi_sta(); + +// ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ +//*******************配置静态IP************************* +esp_netif_dhcpc_stop(esp_netif); +esp_netif_ip_info_t ipInfo; +ipInfo.ip.addr = inet_addr("192.168.138.2"); +ipInfo.netmask = inet_addr("255.255.255.0"); +ipInfo.gw = inet_addr("192.168.138.2"); + +esp_netif_set_ip_info(esp_netif, &ipInfo); +esp_netif_dhcpc_start(esp_netif); +//*******************配置静态IP************************* +// ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ +``` + +### 2.3.1 WIFI Scan + +我们使用`esp_wifi_start`后,会根据配置,启动WiFI。如果不立即连接到设定的WIFI热点,我们也可以使用WIFI Scan来寻找可连接的设备。 + +`esp_wifi_scan_start`,扫描所有有效的AP +`esp_wifi_scan_get_ap_records`,获取上次扫描中找到的AP列表 `esp_wifi_scan_get_ap_num`,获取上次扫描中找到的AP数 + +这里也没什么复杂的,建议直接参考IDF官方文档:[ESP32 Wi-Fi 扫描](https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/api-guides/wifi.html#id17 "永久链接至标题") +## 三、实例 + +### 3.1 WIFI AP模式 + +下面基于第二部分的教程实现了WIFI AP模式 +代码链接: + +> https://github.com/DuRuofu/ESP32_Learning/tree/master/05.wifi/wifi_ap + +```c +#include +#include "freertos/FreeRTOS.h" +#include "freertos/event_groups.h" +#include "esp_wifi.h" +#include "esp_log.h" +#include "esp_event.h" +#include "nvs_flash.h" +#include "esp_mac.h" + +#define ESP_WIFI_AP_SSID "DuRuofu_ESP32" +#define ESP_WIFI_AP_PASSWD "3.1415926" + +void WIFI_CallBack(void *event_handler_arg,esp_event_base_t event_base,int32_t event_id,void *event_data) +{ + // 连接事件 + if(event_base == IP_EVENT && event_id == IP_EVENT_AP_STAIPASSIGNED) + { + // 解析数据 + ip_event_ap_staipassigned_t* event_info = (ip_event_ap_staipassigned_t *)event_data; + ESP_LOGW("WIFI_AP", "设备已连接 MAC:"MACSTR"", MAC2STR(event_info->mac)); + } + + // 断开连接事件 + if(event_base == WIFI_EVENT && event_id == WIFI_EVENT_AP_STADISCONNECTED) + { + wifi_event_ap_stadisconnected_t* event_info = (wifi_event_ap_stadisconnected_t*)event_data; + ESP_LOGW("WIFI_AP", "设备已断开 MAC:"MACSTR"", MAC2STR(event_info->mac)); + } +} + +void app_main(void) +{ + //----------------准备阶段------------------- + // Initialize NVS + esp_err_t ret = nvs_flash_init(); + if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) + { + ESP_ERROR_CHECK(nvs_flash_erase()); + ret = nvs_flash_init(); + } + ESP_ERROR_CHECK(ret); + + //---------------初始化阶段------------------ + + ESP_ERROR_CHECK(esp_netif_init()); + + // 初始化默认事件循环 + ESP_ERROR_CHECK(esp_event_loop_create_default()); + // 注册设备连接事件回调 + esp_event_handler_instance_register(IP_EVENT, IP_EVENT_AP_STAIPASSIGNED, WIFI_CallBack, NULL, NULL); + // 注册设备断开连接设备回调 + esp_event_handler_instance_register(WIFI_EVENT, WIFI_EVENT_AP_STADISCONNECTED, WIFI_CallBack, NULL, NULL); + + // *esp_netif_ap 可以用来修改AP设置 + esp_netif_t *esp_netif_ap = esp_netif_create_default_wifi_ap(); + + /*Initialize WiFi */ + wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); + // WIFI_INIT_CONFIG_DEFAULT 是一个默认配置的宏 + ESP_ERROR_CHECK(esp_wifi_init(&cfg)); + + //---------------配置阶段-------------------- + // 设置为AP模式 + ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_AP)); + + // AP详细配置 + wifi_config_t wifi_ap_config = { + .ap = { + .ssid = ESP_WIFI_AP_SSID, // WIFI名称 + .ssid_len = strlen(ESP_WIFI_AP_SSID), // 名称长度 + .channel = 1, // WIFI信道 + .password = ESP_WIFI_AP_PASSWD, // WiFi密码 + .max_connection = 5, // 最大连接数,默认值是 10 + .authmode = WIFI_AUTH_WPA2_PSK, // WiFi认证方式 + }, + }; + ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_AP, &wifi_ap_config)); + + //---------------启动阶段-------------------- + /* Start WiFi */ + ESP_ERROR_CHECK(esp_wifi_start()); +} +``` + +效果展示: + +![](attachments/20240314220318.png) + +连接wifi会打印连接设备的信息。 + +### 3.2 WIFI STA模式 + +下面基于第二部分的教程实现了WIFI STA模式 +代码链接: + +> https://github.com/DuRuofu/ESP32_Learning/tree/master/05.wifi/wifi_sta + +```c + +#include +#include +#include "freertos/FreeRTOS.h" +#include "freertos/event_groups.h" +#include "esp_wifi.h" +#include "esp_log.h" +#include "esp_event.h" +#include "nvs_flash.h" +#include "esp_mac.h" + +#define ESP_WIFI_STA_SSID "duruofu_win10" +#define ESP_WIFI_STA_PASSWD "1234567890" + +void WIFI_CallBack(void *event_handler_arg, esp_event_base_t event_base, int32_t event_id, void *event_data) +{ + static uint8_t connect_count = 0; + // WIFI 启动成功 + if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START) + { + ESP_LOGI("WIFI_EVENT", "WIFI_EVENT_STA_START"); + ESP_ERROR_CHECK(esp_wifi_connect()); + } + // WIFI 连接失败 + if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_DISCONNECTED) + { + ESP_LOGI("WIFI_EVENT", "WIFI_EVENT_STA_DISCONNECTED"); + connect_count++; + if (connect_count < 6) + { + ESP_ERROR_CHECK(esp_wifi_connect()); + } + else{ + ESP_LOGI("WIFI_EVENT", "WIFI_EVENT_STA_DISCONNECTED 10 times"); + } + } + // WIFI 连接成功(获取到了IP) + if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) + { + ESP_LOGI("WIFI_EVENT", "WIFI_EVENT_STA_GOT_IP"); + ip_event_got_ip_t *info = (ip_event_got_ip_t *)event_data; + ESP_LOGI("WIFI_EVENT", "got ip:" IPSTR "", IP2STR(&info->ip_info.ip)); + } +} + +void app_main(void) +{ + //----------------准备阶段------------------- + // Initialize NVS + esp_err_t ret = nvs_flash_init(); + if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) + { + ESP_ERROR_CHECK(nvs_flash_erase()); + ret = nvs_flash_init(); + } + ESP_ERROR_CHECK(ret); + + //----------------初始化阶段------------------- + ESP_ERROR_CHECK(esp_netif_init()); + + ESP_ERROR_CHECK(esp_event_loop_create_default()); + // 注册事件(wifi启动成功) + ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT, WIFI_EVENT_STA_START, WIFI_CallBack, NULL, NULL)); + // 注册事件(wifi连接失败) + ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT, WIFI_EVENT_STA_DISCONNECTED, WIFI_CallBack, NULL, NULL)); + // 注册事件(wifi连接失败) + ESP_ERROR_CHECK(esp_event_handler_instance_register(IP_EVENT, IP_EVENT_STA_GOT_IP, WIFI_CallBack, NULL, NULL)); + + // 初始化STA设备 + esp_netif_create_default_wifi_sta(); + + /*Initialize WiFi */ + wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); + // WIFI_INIT_CONFIG_DEFAULT 是一个默认配置的宏 + + ESP_ERROR_CHECK(esp_wifi_init(&cfg)); + + //----------------配置阶段------------------- + // 设置为STA模式 + ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA)); + + // STA详细配置 + wifi_config_t sta_config = { + .sta = { + .ssid = ESP_WIFI_STA_SSID, + .password = ESP_WIFI_STA_PASSWD, + .bssid_set = false, + }, + }; + ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &sta_config)); + + //----------------启动阶段------------------- + ESP_ERROR_CHECK(esp_wifi_start()); + +} + +``` + +效果如下: + +![](attachments/20240315084947.png) + + +### 3.2 WIFI配置静态IP + +代码链接: + +> https://github.com/DuRuofu/ESP32_Learning/tree/master/05.wifi/wifi_sta_static_ip + +### 3.3 WIFI Scan + +代码链接: + +> https://github.com/DuRuofu/ESP32_Learning/tree/master/05.wifi/wifi_scan + +效果: + +![](attachments/20240315100518.png) +# 参考链接 + +1. https://www.bilibili.com/video/BV1au411E7K1?p=7&vd_source=ef5a0ab0106372751602034cdd9ab98e +2. https://www.bilibili.com/video/BV1au411E7K1?p=8&vd_source=ef5a0ab0106372751602034cdd9ab98e +3. https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/api-guides/wifi.html \ No newline at end of file diff --git a/docs/06.Wi-Fi功能与相关协议/6.1-Wi-Fi功能入门/6.1.1-Wi-Fi模式与介绍/attachments/20240313184111.png b/docs/06.Wi-Fi功能与相关协议/6.1-Wi-Fi功能入门/6.1.2-Wi-Fi的STA与AP配置/attachments/20240313184111.png similarity index 100% rename from docs/06.Wi-Fi功能与相关协议/6.1-Wi-Fi功能入门/6.1.1-Wi-Fi模式与介绍/attachments/20240313184111.png rename to docs/06.Wi-Fi功能与相关协议/6.1-Wi-Fi功能入门/6.1.2-Wi-Fi的STA与AP配置/attachments/20240313184111.png diff --git a/docs/06.Wi-Fi功能与相关协议/6.1-Wi-Fi功能入门/6.1.1-Wi-Fi模式与介绍/attachments/20240313184132.png b/docs/06.Wi-Fi功能与相关协议/6.1-Wi-Fi功能入门/6.1.2-Wi-Fi的STA与AP配置/attachments/20240313184132.png similarity index 100% rename from docs/06.Wi-Fi功能与相关协议/6.1-Wi-Fi功能入门/6.1.1-Wi-Fi模式与介绍/attachments/20240313184132.png rename to docs/06.Wi-Fi功能与相关协议/6.1-Wi-Fi功能入门/6.1.2-Wi-Fi的STA与AP配置/attachments/20240313184132.png diff --git a/docs/06.Wi-Fi功能与相关协议/6.1-Wi-Fi功能入门/6.1.1-Wi-Fi模式与介绍/attachments/20240313190734.png b/docs/06.Wi-Fi功能与相关协议/6.1-Wi-Fi功能入门/6.1.2-Wi-Fi的STA与AP配置/attachments/20240313190734.png similarity index 100% rename from docs/06.Wi-Fi功能与相关协议/6.1-Wi-Fi功能入门/6.1.1-Wi-Fi模式与介绍/attachments/20240313190734.png rename to docs/06.Wi-Fi功能与相关协议/6.1-Wi-Fi功能入门/6.1.2-Wi-Fi的STA与AP配置/attachments/20240313190734.png diff --git a/docs/06.Wi-Fi功能与相关协议/6.1-Wi-Fi功能入门/6.1.1-Wi-Fi模式与介绍/attachments/20240313191730.png b/docs/06.Wi-Fi功能与相关协议/6.1-Wi-Fi功能入门/6.1.2-Wi-Fi的STA与AP配置/attachments/20240313191730.png similarity index 100% rename from docs/06.Wi-Fi功能与相关协议/6.1-Wi-Fi功能入门/6.1.1-Wi-Fi模式与介绍/attachments/20240313191730.png rename to docs/06.Wi-Fi功能与相关协议/6.1-Wi-Fi功能入门/6.1.2-Wi-Fi的STA与AP配置/attachments/20240313191730.png diff --git a/docs/06.Wi-Fi功能与相关协议/6.1-Wi-Fi功能入门/6.1.1-Wi-Fi模式与介绍/attachments/20240314165844.png b/docs/06.Wi-Fi功能与相关协议/6.1-Wi-Fi功能入门/6.1.2-Wi-Fi的STA与AP配置/attachments/20240314165844.png similarity index 100% rename from docs/06.Wi-Fi功能与相关协议/6.1-Wi-Fi功能入门/6.1.1-Wi-Fi模式与介绍/attachments/20240314165844.png rename to docs/06.Wi-Fi功能与相关协议/6.1-Wi-Fi功能入门/6.1.2-Wi-Fi的STA与AP配置/attachments/20240314165844.png diff --git a/docs/06.Wi-Fi功能与相关协议/6.1-Wi-Fi功能入门/6.1.1-Wi-Fi模式与介绍/attachments/20240314220318.png b/docs/06.Wi-Fi功能与相关协议/6.1-Wi-Fi功能入门/6.1.2-Wi-Fi的STA与AP配置/attachments/20240314220318.png similarity index 100% rename from docs/06.Wi-Fi功能与相关协议/6.1-Wi-Fi功能入门/6.1.1-Wi-Fi模式与介绍/attachments/20240314220318.png rename to docs/06.Wi-Fi功能与相关协议/6.1-Wi-Fi功能入门/6.1.2-Wi-Fi的STA与AP配置/attachments/20240314220318.png diff --git a/docs/06.Wi-Fi功能与相关协议/6.1-Wi-Fi功能入门/6.1.1-Wi-Fi模式与介绍/attachments/20240314220947.png b/docs/06.Wi-Fi功能与相关协议/6.1-Wi-Fi功能入门/6.1.2-Wi-Fi的STA与AP配置/attachments/20240314220947.png similarity index 100% rename from docs/06.Wi-Fi功能与相关协议/6.1-Wi-Fi功能入门/6.1.1-Wi-Fi模式与介绍/attachments/20240314220947.png rename to docs/06.Wi-Fi功能与相关协议/6.1-Wi-Fi功能入门/6.1.2-Wi-Fi的STA与AP配置/attachments/20240314220947.png diff --git a/docs/06.Wi-Fi功能与相关协议/6.1-Wi-Fi功能入门/6.1.1-Wi-Fi模式与介绍/attachments/20240315084947.png b/docs/06.Wi-Fi功能与相关协议/6.1-Wi-Fi功能入门/6.1.2-Wi-Fi的STA与AP配置/attachments/20240315084947.png similarity index 100% rename from docs/06.Wi-Fi功能与相关协议/6.1-Wi-Fi功能入门/6.1.1-Wi-Fi模式与介绍/attachments/20240315084947.png rename to docs/06.Wi-Fi功能与相关协议/6.1-Wi-Fi功能入门/6.1.2-Wi-Fi的STA与AP配置/attachments/20240315084947.png diff --git a/docs/06.Wi-Fi功能与相关协议/6.1-Wi-Fi功能入门/6.1.1-Wi-Fi模式与介绍/attachments/20240315100518.png b/docs/06.Wi-Fi功能与相关协议/6.1-Wi-Fi功能入门/6.1.2-Wi-Fi的STA与AP配置/attachments/20240315100518.png similarity index 100% rename from docs/06.Wi-Fi功能与相关协议/6.1-Wi-Fi功能入门/6.1.1-Wi-Fi模式与介绍/attachments/20240315100518.png rename to docs/06.Wi-Fi功能与相关协议/6.1-Wi-Fi功能入门/6.1.2-Wi-Fi的STA与AP配置/attachments/20240315100518.png diff --git a/docs/06.Wi-Fi功能与相关协议/6.2-网络协议应用/6.2.1-TCP协议/TCP协议应用.md b/docs/06.Wi-Fi功能与相关协议/6.2-网络协议应用/6.2.1-TCP协议/TCP协议应用.md index 2f1992e..61facd1 100644 --- a/docs/06.Wi-Fi功能与相关协议/6.2-网络协议应用/6.2.1-TCP协议/TCP协议应用.md +++ b/docs/06.Wi-Fi功能与相关协议/6.2-网络协议应用/6.2.1-TCP协议/TCP协议应用.md @@ -1,5 +1,12 @@ -# ESP32网络入门-TCP协议 +# ESP32网络入门 - TCP协议 + +> [!TIP] 🚀 **TCP协议基础 | 可靠的网络通信** +> - 💡 **碎碎念**😎:本节将介绍如何在 ESP32 上使用 TCP 协议进行网络通信,帮助你理解 TCP 的工作原理,并在 ESP32 上实现客户端和服务器功能。 +> - 📺 **视频教程**:暂无 +> - 💾 **示例代码**:暂无 + + ## 一、介绍 在开始使用TCP协议之前,我们需要掌握一些基本的概念和前置知识: diff --git a/docs/06.Wi-Fi功能与相关协议/6.2-网络协议应用/6.2.2-UDP协议/UDP协议应用.md b/docs/06.Wi-Fi功能与相关协议/6.2-网络协议应用/6.2.2-UDP协议/UDP协议应用.md index c8f6106..f972af2 100644 --- a/docs/06.Wi-Fi功能与相关协议/6.2-网络协议应用/6.2.2-UDP协议/UDP协议应用.md +++ b/docs/06.Wi-Fi功能与相关协议/6.2-网络协议应用/6.2.2-UDP协议/UDP协议应用.md @@ -1,6 +1,9 @@ +# ESP32网络入门 - UDP协议 - -# ESP32网络入门-UDP协议 +> [!TIP] 🚀 **UDP协议基础 | 快速但不可靠的通信** +> - 💡 **碎碎念**😎:本节将介绍如何在 ESP32 上使用 UDP 协议进行网络通信,了解 UDP 的特性和使用场景,并在 ESP32 上实现客户端和服务器功能。 +> - 📺 **视频教程**:暂无 +> - 💾 **示例代码**:暂无 ## 一、概述 diff --git a/docs/06.Wi-Fi功能与相关协议/6.2-网络协议应用/6.2.3-HTTP协议/HTTP协议(客户端)/HTTP协议(客户端).md b/docs/06.Wi-Fi功能与相关协议/6.2-网络协议应用/6.2.3-HTTP协议/HTTP协议(客户端)/HTTP协议(客户端).md index 068048d..22a4ed3 100644 --- a/docs/06.Wi-Fi功能与相关协议/6.2-网络协议应用/6.2.3-HTTP协议/HTTP协议(客户端)/HTTP协议(客户端).md +++ b/docs/06.Wi-Fi功能与相关协议/6.2-网络协议应用/6.2.3-HTTP协议/HTTP协议(客户端)/HTTP协议(客户端).md @@ -1,6 +1,9 @@ +# ESP32网络入门 - HTTP协议 - 客户端 - -# ESP32网络入门-HTTP协议 +> [!TIP] 🚀 **HTTP客户端 | 让ESP32和服务器轻松对话** +> - 💡 **碎碎念**😎:本节将介绍如何在 ESP32 上使用 HTTP 协议作为客户端,向远程服务器发送请求并获取响应。你将学习如何配置请求参数和处理响应内容。 +> - 📺 **视频教程**:暂无 +> - 💾 **示例代码**:暂无 ### 一、概述 diff --git a/docs/06.Wi-Fi功能与相关协议/6.2-网络协议应用/6.2.3-HTTP协议/HTTP协议(服务端)/HTTP协议(服务端).md b/docs/06.Wi-Fi功能与相关协议/6.2-网络协议应用/6.2.3-HTTP协议/HTTP协议(服务端)/HTTP协议(服务端).md index 9943bd8..534fe01 100644 --- a/docs/06.Wi-Fi功能与相关协议/6.2-网络协议应用/6.2.3-HTTP协议/HTTP协议(服务端)/HTTP协议(服务端).md +++ b/docs/06.Wi-Fi功能与相关协议/6.2-网络协议应用/6.2.3-HTTP协议/HTTP协议(服务端)/HTTP协议(服务端).md @@ -1,6 +1,10 @@ +# ESP32网络入门 - HTTP协议(服务端) +> [!TIP] 🚀 **HTTP服务端 | 在ESP32上搭建你的Web服务器** +> - 💡 **碎碎念**😎:本节将介绍如何在 ESP32 上实现 HTTP 服务端,处理来自客户端的请求,并返回相应的内容。你将学习如何搭建简单的 Web 服务器,并处理常见的 HTTP 请求。 +> - 📺 **视频教程**:暂无 +> - 💾 **示例代码**:暂无 -# ESP32网络入门-HTTP协议(服务端) ## 一、介绍 diff --git a/docs/06.Wi-Fi功能与相关协议/6.2-网络协议应用/6.2.4-WebSocket协议/WebSocket协议.md b/docs/06.Wi-Fi功能与相关协议/6.2-网络协议应用/6.2.4-WebSocket协议/WebSocket协议.md index 221e8fd..83aa889 100644 --- a/docs/06.Wi-Fi功能与相关协议/6.2-网络协议应用/6.2.4-WebSocket协议/WebSocket协议.md +++ b/docs/06.Wi-Fi功能与相关协议/6.2-网络协议应用/6.2.4-WebSocket协议/WebSocket协议.md @@ -1,5 +1,9 @@ +# ESP32网络入门 - WebSocket协议 -# ESP32网络入门-WebSocket协议 +> [!TIP] 🚀 **WebSocket协议 | 实时双向通信** +> - 💡 **碎碎念**😎:本节将介绍如何在 ESP32 上实现 WebSocket 协议,进行实时双向通信。你将学习如何创建 WebSocket 服务器和客户端,支持快速、低延迟的数据传输。 +> - 📺 **视频教程**:暂无 +> - 💾 **示例代码**:暂无 ## 一、介绍 diff --git a/docs/06.Wi-Fi功能与相关协议/6.2-网络协议应用/6.2.5-MQTT协议/MQTT协议应用.md b/docs/06.Wi-Fi功能与相关协议/6.2-网络协议应用/6.2.5-MQTT协议/MQTT协议应用.md index 838fc9e..2a218b4 100644 --- a/docs/06.Wi-Fi功能与相关协议/6.2-网络协议应用/6.2.5-MQTT协议/MQTT协议应用.md +++ b/docs/06.Wi-Fi功能与相关协议/6.2-网络协议应用/6.2.5-MQTT协议/MQTT协议应用.md @@ -1,7 +1,9 @@ +# ESP32网络入门 - MQTT协议 - -# ESP32网络入门-MQTT协议 - +> [!TIP] 🚀 **MQTT协议 | 让物联网设备轻松沟通** +> - 💡 **碎碎念**😎:本节将介绍如何在 ESP32 上使用 MQTT 协议,实现设备之间的消息传递。你将学习如何连接到 MQTT 服务器,发布和订阅消息。 +> - 📺 **视频教程**:暂无 +> - 💾 **示例代码**:暂无 ## 一、介绍 diff --git a/docs/06.Wi-Fi功能与相关协议/6.2-网络协议应用/6.2.6-ESP-NOW协议/ESP-NOW协议应用.md b/docs/06.Wi-Fi功能与相关协议/6.2-网络协议应用/6.2.6-ESP-NOW协议/ESP-NOW协议应用.md index b20de55..eb86867 100644 --- a/docs/06.Wi-Fi功能与相关协议/6.2-网络协议应用/6.2.6-ESP-NOW协议/ESP-NOW协议应用.md +++ b/docs/06.Wi-Fi功能与相关协议/6.2-网络协议应用/6.2.6-ESP-NOW协议/ESP-NOW协议应用.md @@ -1,9 +1,13 @@ +# ESP32网络入门 - ESP-NOW协议 + +> [!TIP] 🚀 **ESP-NOW协议 | ESP32设备间的低功耗无线通信** +> - 💡 **碎碎念**😎:本节将介绍如何在 ESP32 上使用 ESP-NOW 协议,实现低功耗、快速的设备间通信。你将学习如何配置 ESP-NOW,并进行数据传输。 +> - 📺 **视频教程**:暂无 +> - 💾 **示例代码**:暂无 -# ESP32网络入门-ESP-NOW协议 ## 一、概述 - ### 1.1 ESP-NOW介绍 >视频介绍:https://www.espressif.com/sites/default/files/esp-now-zh.mp4 diff --git a/docs/06.Wi-Fi功能与相关协议/6.2-网络协议应用/6.2.7-SNTP校时/SNTP校时.md b/docs/06.Wi-Fi功能与相关协议/6.2-网络协议应用/6.2.7-SNTP校时/SNTP校时.md index af945a7..48cb71e 100644 --- a/docs/06.Wi-Fi功能与相关协议/6.2-网络协议应用/6.2.7-SNTP校时/SNTP校时.md +++ b/docs/06.Wi-Fi功能与相关协议/6.2-网络协议应用/6.2.7-SNTP校时/SNTP校时.md @@ -1,5 +1,9 @@ +# ESP32网络入门 - SNTP校时 -# ESP32网络入门-SNTP校时 +> [!TIP] 🚀 **SNTP校时 | 精确同步ESP32的系统时间** +> - 💡 **碎碎念**😎:本节将介绍如何使用 SNTP 协议实现 ESP32 的系统时间同步。你将学习如何连接到网络时间服务器,并校准 ESP32 的本地时间。 +> - 📺 **视频教程**:暂无 +> - 💾 **示例代码**:暂无 ## 一、介绍 diff --git a/docs/06.Wi-Fi功能与相关协议/6.3-Wi-Fi配网技术/6.3.1-BluFi配网/BluFi配网.md b/docs/06.Wi-Fi功能与相关协议/6.3-Wi-Fi配网技术/6.3.1-BluFi配网/BluFi配网.md deleted file mode 100644 index 4adf790..0000000 --- a/docs/06.Wi-Fi功能与相关协议/6.3-Wi-Fi配网技术/6.3.1-BluFi配网/BluFi配网.md +++ /dev/null @@ -1,59 +0,0 @@ - -### 说明: - -1. 本文档由DuRuofu撰写,由DuRuofu负责解释及执行。 -2. 本文档记录如何使用BluFi完成ESP32的WiFi配网程序。 - -### 修订历史: - -| 文档名称 | 版本 | 作者 | 时间 | 备注 | -| ----------------- | ------ | ------- | ---------- | ---- | -| ESP32网络入门-BluFi配网 | v1.0.0 | DuRuofu | 2024-04-03 | 首次建立 | - -
- -# ESP32网络入门-BluFi配网 - -## 一、介绍 - -### 1.1 BluFi是什么 - -BluFi 是一项基于蓝牙通道的 Wi-Fi 网络配置功能,适用于 ESP32。它通过安全协议将 Wi-Fi 的 SSID、密码等配置信息传输到 ESP32。基于这些信息,ESP32 可进而连接到 AP 或建立 SoftAP。 - -BluFi 流程的关键部分包括数据的分片、加密以及校验和验证。 - -用户可按需自定义用于对称加密、非对称加密以及校验的算法。此处,我们采用 DH 算法进行密钥协商,128-AES 算法用于数据加密,CRC16 算法用于校验和验证。 - - -### 1.2 流程 - -BluFi 配网流程包含配置 SoftAP 和配置 Station 两部分。 - -![](attachments/Pasted%20image%2020240403181235.png) - -1. ESP32 开启 GATT Server 模式,发送带有特定 _advertising data_ 的广播。该广播不属于 BluFi Profile,可以按需对其进行自定义。 -2. 使用手机应用程序搜索到该广播后,手机将作为 GATT Client 连接 ESP32。该步骤对具体使用哪款手机应用程序并无特殊要求。 -3. 成功建立 GATT 连接后,手机会向 ESP32 发送数据帧进行密钥协商(详见 [BluFi 中定义的帧格式](https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/api-guides/blufi.html#frame-formats) )。 -4. ESP32 收到密钥协商的数据帧后,会按照自定义的协商方法进行解析。 -5. 手机与 ESP32 进行密钥协商。协商过程可使用 DH/RSA/ECC 等加密算法。 -6. 协商结束后,手机端向 ESP32 发送控制帧,用于设置安全模式。 -7. ESP32 收到控制帧后,使用共享密钥以及安全配置对通信数据进行加密和解密。 -8. 手机向 ESP32 发送 [BluFi 中定义的帧格式](https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/api-guides/blufi.html#frame-formats) 中定义的数据帧,包括 SSID、密码等 Wi-Fi 配置信息。 -9. 手机向 ESP32 发送 Wi-Fi 连接请求的控制帧。ESP32 收到控制帧后,即默认手机已完成必要信息的传输,准备连接 Wi-Fi。 -10. 连接到 Wi-Fi 后,ESP32 发送 Wi-Fi 连接状态报告的控制帧到手机。至此,配网结束。 - ->1. ESP32 收到安全模式配置的控制帧后,会根据定义的安全模式进行相关操作。 ->2. 进行对称加密和解密时,加密和解密前后的数据长度必须一致。支持原地加密和解密。 - - - - - -## 二、使用 - - - -## 三、示例 - - -# 参考链接 \ No newline at end of file diff --git a/docs/06.Wi-Fi功能与相关协议/6.3-Wi-Fi配网技术/6.3.2-Smartconfig配网/Smartconfig配网.md b/docs/06.Wi-Fi功能与相关协议/6.3-Wi-Fi配网技术/6.3.2-Smartconfig配网/Smartconfig配网.md deleted file mode 100644 index b2c4f74..0000000 --- a/docs/06.Wi-Fi功能与相关协议/6.3-Wi-Fi配网技术/6.3.2-Smartconfig配网/Smartconfig配网.md +++ /dev/null @@ -1 +0,0 @@ -# Smartconfig配网 \ No newline at end of file diff --git a/docs/06.Wi-Fi功能与相关协议/6.3-Wi-Fi配网技术/6.3.3-SoftAP配网/SoftAP配网.md b/docs/06.Wi-Fi功能与相关协议/6.3-Wi-Fi配网技术/6.3.3-SoftAP配网/SoftAP配网.md deleted file mode 100644 index c0e6ba5..0000000 --- a/docs/06.Wi-Fi功能与相关协议/6.3-Wi-Fi配网技术/6.3.3-SoftAP配网/SoftAP配网.md +++ /dev/null @@ -1 +0,0 @@ -# SoftAP配网 \ No newline at end of file diff --git a/docs/09.其他实用内容/9.1-ESP32配网/9.1.1-BluFi配网/BluFi配网.md b/docs/09.其他实用内容/9.1-ESP32配网/9.1.1-BluFi配网/BluFi配网.md new file mode 100644 index 0000000..b902f42 --- /dev/null +++ b/docs/09.其他实用内容/9.1-ESP32配网/9.1.1-BluFi配网/BluFi配网.md @@ -0,0 +1,129 @@ +# ESP32网络入门 - BluFi配网 + +> [!TIP] 🚀 **BluFi配网 | 快速实现ESP32的WiFi配网功能** +> - 💡 **碎碎念**😎:本节将介绍如何使用 BluFi 协议完成 ESP32 的 WiFi 配网程序,并讲解官方提供的配网小程序示例。 +> - 📺 **视频教程**:暂无 +> - 💾 **示例程序**:暂无 +> - 📚 **官方文档**:[API 指南 » 低功耗蓝牙® » BluFi](https://docs.espressif.com/projects/esp-idf/zh_CN/v5.3.2/esp32/api-guides/ble/blufi.html?highlight=blufi) + +## 一、介绍 + +这里搬运一下官方的介绍: + +### 1.1 BluFi是什么 + +BluFi 是一项基于蓝牙通道的 Wi-Fi 网络配置功能,适用于 ESP32。它通过安全协议将 Wi-Fi 的 SSID、密码等配置信息传输到 ESP32。基于这些信息,ESP32 可进而连接到 AP 或建立 SoftAP。 + +BluFi 流程的关键部分包括数据的分片、加密以及校验和验证。 + +用户可按需自定义用于对称加密、非对称加密以及校验的算法。此处,我们采用 DH 算法进行密钥协商,128-AES 算法用于数据加密,CRC16 算法用于校验和验证。 + +### 1.2 配网流程 + +BluFi 配网流程包含配置 SoftAP 和配置 Station 两部分。 + +![](attachments/Pasted%20image%2020240403181235.png) + +1. ESP32 开启 GATT Server 模式,发送带有特定 _advertising data_ 的广播。该广播不属于 BluFi Profile,可以按需对其进行自定义。 +2. 使用手机应用程序搜索到该广播后,手机将作为 GATT Client 连接 ESP32。该步骤对具体使用哪款手机应用程序并无特殊要求。 +3. 成功建立 GATT 连接后,手机会向 ESP32 发送数据帧进行密钥协商(详见 [BluFi 中定义的帧格式](https://docs.espressif.com/projects/esp-idf/zh_CN/v5.3.2/esp32/api-guides/ble/blufi.html?highlight=blufi#frame-formats) )。 +4. ESP32 收到密钥协商的数据帧后,会按照自定义的协商方法进行解析。 +5. 手机与 ESP32 进行密钥协商。协商过程可使用 DH/RSA/ECC 等加密算法。 +6. 协商结束后,手机端向 ESP32 发送控制帧,用于设置安全模式。 +7. ESP32 收到控制帧后,使用共享密钥以及安全配置对通信数据进行加密和解密。 +8. 手机向 ESP32 发送 [BluFi 中定义的帧格式](https://docs.espressif.com/projects/esp-idf/zh_CN/v5.3.2/esp32/api-guides/ble/blufi.html?highlight=blufi#frame-formats) 中定义的数据帧,包括 SSID、密码等 Wi-Fi 配置信息。 +9. 手机向 ESP32 发送 Wi-Fi 连接请求的控制帧。ESP32 收到控制帧后,即默认手机已完成必要信息的传输,准备连接 Wi-Fi。 +10. 连接到 Wi-Fi 后,ESP32 发送 Wi-Fi 连接状态报告的控制帧到手机。至此,配网结束。 + +>1. ESP32 收到安全模式配置的控制帧后,会根据定义的安全模式进行相关操作。 +>2. 进行对称加密和解密时,加密和解密前后的数据长度必须一致。支持原地加密和解密。 + +## 二、尝试编译使用官方示例 + +首先我们先获取官方的[Blufi 配网例程](https://github.com/espressif/esp-idf/tree/master/examples/bluetooth/blufi),让后尝试编译烧录: + +![](attachments/Pasted%20image%2020250222094016.png) + +烧录完成后,串口打印如下: + +![](attachments/Pasted%20image%2020250222094420.png) + + +然后安装乐鑫提供的配套 EspBlufi app,并打开 Wi-Fi 和蓝⽛,下载链接: + +- Android:[EspBlufi](https://github.com/EspressifApp/EspBlufiForAndroid/releases/tag/v1.6.3) +- IOS: [EspBlufi](https://apps.apple.com/cn/app/espblufi/id1450614082) + +打开安装好的 EspBlufi 软件,在 app 界⾯面下拉刷新,可以看到周围的蓝⽛牙设备,如下图: + +![350](attachments/Pasted%20image%2020250222095030.png) + +点击设备,跳转到设备界⾯面: + +![|350](attachments/b923f06e69497d7a7770096f041ac36.jpg) + + +点击连接,连接成功后如图所示: + + +![|350](attachments/1.jpg) + +点击配网,输入Wifi连接信息(同时还可以选择Wifi的模式): + +![|350](attachments/f6f97325f4e47be9a42ee91e8de3f3e.jpg) + + +确定后,如果连接成功会输出连接信息: + + +![|350](attachments/1111.jpg) + +同时ESP32串口输入如下,表示配网成功: + +![718](attachments/Pasted%20image%2020250222094828.png) + +我们还可以使用乐鑫提供的小程序进行配网: + +![](attachments/Pasted%20image%2020250222112359.png) + + +上述过程中使用到的APP和小程序源码都可以在乐鑫官方的仓库中找到,大家也可以根据自己的需求进行二次开发和学习。 +## 三、示例代码解读 + +### 3.1 ESP32端 + +示例程序目录如下: + +``` +├── CMakeLists.txt +├── main +│ ├── blufi_example.h +│ ├── blufi_example_main.c +│ ├── blufi_init.c +│ ├── blufi_security.c +│ ├── CMakeLists.txt +│ └── Kconfig.projbuild +├── README.md +├── sdkconfig +├── sdkconfig.defaults +├── sdkconfig.defaults.esp32 +├── sdkconfig.defaults.esp32c2 +├── sdkconfig.defaults.esp32c3 +├── sdkconfig.defaults.esp32c6 +└── sdkconfig.defaults.esp32s3 +``` + +我们这里主要关注`blufi_example.h`,`blufi_example_main.c`,`blufi_init.c`,`blufi_security.c`这四个文件: + + + + + + + +### 3.2 APP或小程序端 + +# 参考链接 + +1. https://github.com/espressif/esp-idf/tree/master/examples/bluetooth/blufi +2. https://www.espressif.com/sites/default/files/documentation/esp32_bluetooth_networking_user_guide_cn.pdf \ No newline at end of file diff --git a/docs/09.其他实用内容/9.1-ESP32配网/9.1.1-BluFi配网/attachments/1.jpg b/docs/09.其他实用内容/9.1-ESP32配网/9.1.1-BluFi配网/attachments/1.jpg new file mode 100644 index 0000000..f01582f Binary files /dev/null and b/docs/09.其他实用内容/9.1-ESP32配网/9.1.1-BluFi配网/attachments/1.jpg differ diff --git a/docs/09.其他实用内容/9.1-ESP32配网/9.1.1-BluFi配网/attachments/1111.jpg b/docs/09.其他实用内容/9.1-ESP32配网/9.1.1-BluFi配网/attachments/1111.jpg new file mode 100644 index 0000000..7727a4d Binary files /dev/null and b/docs/09.其他实用内容/9.1-ESP32配网/9.1.1-BluFi配网/attachments/1111.jpg differ diff --git a/docs/06.Wi-Fi功能与相关协议/6.3-Wi-Fi配网技术/6.3.1-BluFi配网/attachments/Pasted image 20240403181235.png b/docs/09.其他实用内容/9.1-ESP32配网/9.1.1-BluFi配网/attachments/Pasted image 20240403181235.png similarity index 100% rename from docs/06.Wi-Fi功能与相关协议/6.3-Wi-Fi配网技术/6.3.1-BluFi配网/attachments/Pasted image 20240403181235.png rename to docs/09.其他实用内容/9.1-ESP32配网/9.1.1-BluFi配网/attachments/Pasted image 20240403181235.png diff --git a/docs/09.其他实用内容/9.1-ESP32配网/9.1.1-BluFi配网/attachments/Pasted image 20250222094016.png b/docs/09.其他实用内容/9.1-ESP32配网/9.1.1-BluFi配网/attachments/Pasted image 20250222094016.png new file mode 100644 index 0000000..7ab9c9e Binary files /dev/null and b/docs/09.其他实用内容/9.1-ESP32配网/9.1.1-BluFi配网/attachments/Pasted image 20250222094016.png differ diff --git a/docs/09.其他实用内容/9.1-ESP32配网/9.1.1-BluFi配网/attachments/Pasted image 20250222094420.png b/docs/09.其他实用内容/9.1-ESP32配网/9.1.1-BluFi配网/attachments/Pasted image 20250222094420.png new file mode 100644 index 0000000..7aeee3c Binary files /dev/null and b/docs/09.其他实用内容/9.1-ESP32配网/9.1.1-BluFi配网/attachments/Pasted image 20250222094420.png differ diff --git a/docs/09.其他实用内容/9.1-ESP32配网/9.1.1-BluFi配网/attachments/Pasted image 20250222094828.png b/docs/09.其他实用内容/9.1-ESP32配网/9.1.1-BluFi配网/attachments/Pasted image 20250222094828.png new file mode 100644 index 0000000..15280b8 Binary files /dev/null and b/docs/09.其他实用内容/9.1-ESP32配网/9.1.1-BluFi配网/attachments/Pasted image 20250222094828.png differ diff --git a/docs/09.其他实用内容/9.1-ESP32配网/9.1.1-BluFi配网/attachments/Pasted image 20250222095030.png b/docs/09.其他实用内容/9.1-ESP32配网/9.1.1-BluFi配网/attachments/Pasted image 20250222095030.png new file mode 100644 index 0000000..25203b7 Binary files /dev/null and b/docs/09.其他实用内容/9.1-ESP32配网/9.1.1-BluFi配网/attachments/Pasted image 20250222095030.png differ diff --git a/docs/09.其他实用内容/9.1-ESP32配网/9.1.1-BluFi配网/attachments/Pasted image 20250222112359.png b/docs/09.其他实用内容/9.1-ESP32配网/9.1.1-BluFi配网/attachments/Pasted image 20250222112359.png new file mode 100644 index 0000000..1206d68 Binary files /dev/null and b/docs/09.其他实用内容/9.1-ESP32配网/9.1.1-BluFi配网/attachments/Pasted image 20250222112359.png differ diff --git a/docs/09.其他实用内容/9.1-ESP32配网/9.1.1-BluFi配网/attachments/b923f06e69497d7a7770096f041ac36.jpg b/docs/09.其他实用内容/9.1-ESP32配网/9.1.1-BluFi配网/attachments/b923f06e69497d7a7770096f041ac36.jpg new file mode 100644 index 0000000..ee7af07 Binary files /dev/null and b/docs/09.其他实用内容/9.1-ESP32配网/9.1.1-BluFi配网/attachments/b923f06e69497d7a7770096f041ac36.jpg differ diff --git a/docs/09.其他实用内容/9.1-ESP32配网/9.1.1-BluFi配网/attachments/f6f97325f4e47be9a42ee91e8de3f3e.jpg b/docs/09.其他实用内容/9.1-ESP32配网/9.1.1-BluFi配网/attachments/f6f97325f4e47be9a42ee91e8de3f3e.jpg new file mode 100644 index 0000000..bf3df51 Binary files /dev/null and b/docs/09.其他实用内容/9.1-ESP32配网/9.1.1-BluFi配网/attachments/f6f97325f4e47be9a42ee91e8de3f3e.jpg differ diff --git a/docs/09.其他实用内容/9.1-ESP32配网/9.1.2-Smartconfig配网/Smartconfig配网.md b/docs/09.其他实用内容/9.1-ESP32配网/9.1.2-Smartconfig配网/Smartconfig配网.md new file mode 100644 index 0000000..aee3ab5 --- /dev/null +++ b/docs/09.其他实用内容/9.1-ESP32配网/9.1.2-Smartconfig配网/Smartconfig配网.md @@ -0,0 +1,196 @@ +# Smartconfig配网 + +> [!TIP] 🚀 **Smartconfig配网 | 快速连接WiFi** +> - 💡 **碎碎念**😎:本节介绍如何使用 Smartconfig 协议完成 ESP32 的 WiFi 配网程序,并讲解官方提供的示例程序。 +> - 📺 **视频教程**:暂无 +> - 💾 **示例程序**:暂无 +> - 📚 **相关文档**:[ API 参考 » 连网 API » SmartConfig](https://docs.espressif.com/projects/esp-idf/zh_CN/v5.3.2/esp32/api-reference/network/esp_smartconfig.html?highlight=smartconfig) + +## 一、介绍 +SmartConfig 是由 TI 开发的配网技术,用于将新的 Wi-Fi 设备连接到 Wi-Fi 网络。它使用移动应用程序将无线网凭据从智能手机或平板电脑端广播给未配网的 Wi-Fi 设备。 + +这项技术的优势在于,设备无需直接获知 AP 的 SSID 或密码,而是通过智能手机获取。这对于没有用户界面的无头设备和系统而言十分重要。 + +目前, ESP32 支持三种类型的 SmartConfig 配网: Airkiss、ESPTouch 和 ESPTouch v2。ESPTouch v2 自 SmartConfig v3.0 (SmartConfig 的版本可以从 esp_smartconfig_get_version() 获取)起开始支持,ESPTouch v2 和 vESPTouch 采用完全不同的配网算法,因此配网速度更快。此外,ESPTouch v2 还增加了 AES 加密功能和自定义数据字段。 + +从 SmartConfig v3.0.2 开始,ESPTouch v2 的 AES 加密支持随机 IV。在应用程序端,当随机 IV 的选项关闭的时候,默认的 IV 为 0,与旧版本保持一致,当随机 IV 的选项打开的时候,IV 为随机值。需要注意的是,当启用 AES 加密且 IV 为随机值时,配网时间会延长,因为需要将 IV 传输到配网设备。在配网设备端,设备会根据配网包中的 flag 来识别 AES 的随机 IV 是否开启。 +## 二、尝试编译使用官方示例 + +官方示例程序链接:[smart_config](https://github.com/espressif/esp-idf/tree/master/examples/wifi/smart_config),编译下载: + +![](attachments/Pasted%20image%2020250222114852.png) + +下载后串口打印如下,显示开始等待配网: + +![](attachments/Pasted%20image%2020250222114936.png) + +使用乐鑫提供的APP进行配网: + +![](attachments/Pasted%20image%2020250222115304.png) + +点击ESPTouch进行配网,手机需要先连接上对应的Wifi: + +![](attachments/Pasted%20image%2020250222115412.png) + +输入密码后点击确定,等待几秒时间后,配网完成: + +![](attachments/Pasted%20image%2020250222115451.png) + +ESP32的串口输出如下: + +![](attachments/Pasted%20image%2020250222115148.png) + + +ESP32 支持三种类型的 SmartConfig 配网: Airkiss、ESPTouch 和 ESPTouch v2 使用哪种类型取决于ESP32程序配置。 +当配网完成后,ESP32下一次启动,也会去尝试直接连接上一次的设备,如果我们要切换网络,可以使用`esptool.py erase_flash`命令擦除flash后重新烧写程序,使ESP32回到初始状态。也可以自行编写程序调用`esp_wifi_restore()`函数来重置WIFI配置(比如按一个重置按键,调用`esp_wifi_restore()`来重置)。 + +## 三、示例代码解读 + +相比于Bluf示例,SmartConfig配网的示例程序要更简单一些,只有一个`smartconfig_main.c`文件,程序展示了如何使用ESP32的智能配网功能(如EspTouch或AirKiss)将设备连接到Wi-Fi网络。程序通过事件驱动的方式处理Wi-Fi连接和智能配网过程,并在成功连接后停止配网任务。 + +程序的最开始,定义了一个事件组句柄和两个标志位: + +```c +static EventGroupHandle_t s_wifi_event_group; +static const int CONNECTED_BIT = BIT0; +static const int ESPTOUCH_DONE_BIT = BIT1; +``` +- `s_wifi_event_group` 是一个事件组句柄,用于同步Wi-Fi连接和智能配网完成的事件。 +- `CONNECTED_BIT` 和 `ESPTOUCH_DONE_BIT` 是事件标志位,分别表示Wi-Fi连接成功和智能配网完成。 + + +主函数非常简单,就一个初始化NVS闪存和初始化Wi-Fi。 + +```c +void app_main(void) +{ + ESP_ERROR_CHECK( nvs_flash_init() ); + initialise_wifi(); +} +``` + +`nvs_flash_init()`就不必说了,我们先看看`initialise_wifi()`: + +```c +static void initialise_wifi(void) +{ + ESP_ERROR_CHECK(esp_netif_init()); + s_wifi_event_group = xEventGroupCreate(); + ESP_ERROR_CHECK(esp_event_loop_create_default()); + esp_netif_t *sta_netif = esp_netif_create_default_wifi_sta(); + assert(sta_netif); + + wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); + ESP_ERROR_CHECK( esp_wifi_init(&cfg) ); + + ESP_ERROR_CHECK( esp_event_handler_register(WIFI_EVENT, ESP_EVENT_ANY_ID, &event_handler, NULL) ); + ESP_ERROR_CHECK( esp_event_handler_register(IP_EVENT, IP_EVENT_STA_GOT_IP, &event_handler, NULL) ); + ESP_ERROR_CHECK( esp_event_handler_register(SC_EVENT, ESP_EVENT_ANY_ID, &event_handler, NULL) ); + + ESP_ERROR_CHECK( esp_wifi_set_mode(WIFI_MODE_STA) ); + ESP_ERROR_CHECK( esp_wifi_start() ); +} +``` + +主要做了下面几件事: + +- 初始化网络接口和事件循环。 +- 创建默认的Wi-Fi Station接口。 +- 初始化Wi-Fi并设置事件处理函数。 +- 设置Wi-Fi模式为Station模式并启动Wi-Fi。 + +其中的`event_handler` 是一个事件处理函数,用于处理Wi-Fi和智能配网相关的事件,我们需要关注一下事件处理里面(`event_handler`)干了什么: + +```c +static void event_handler(void* arg, esp_event_base_t event_base, + int32_t event_id, void* event_data) +{ + if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START) { + xTaskCreate(smartconfig_example_task, "smartconfig_example_task", 4096, NULL, 3, NULL); + } else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_DISCONNECTED) { + esp_wifi_connect(); + xEventGroupClearBits(s_wifi_event_group, CONNECTED_BIT); + } else if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) { + xEventGroupSetBits(s_wifi_event_group, CONNECTED_BIT); + } else if (event_base == SC_EVENT && event_id == SC_EVENT_SCAN_DONE) { + ESP_LOGI(TAG, "Scan done"); + } else if (event_base == SC_EVENT && event_id == SC_EVENT_FOUND_CHANNEL) { + ESP_LOGI(TAG, "Found channel"); + } else if (event_base == SC_EVENT && event_id == SC_EVENT_GOT_SSID_PSWD) { + ESP_LOGI(TAG, "Got SSID and password"); + + smartconfig_event_got_ssid_pswd_t *evt = (smartconfig_event_got_ssid_pswd_t *)event_data; + wifi_config_t wifi_config; + uint8_t ssid[33] = { 0 }; + uint8_t password[65] = { 0 }; + uint8_t rvd_data[33] = { 0 }; + + bzero(&wifi_config, sizeof(wifi_config_t)); + memcpy(wifi_config.sta.ssid, evt->ssid, sizeof(wifi_config.sta.ssid)); + memcpy(wifi_config.sta.password, evt->password, sizeof(wifi_config.sta.password)); + +#ifdef CONFIG_SET_MAC_ADDRESS_OF_TARGET_AP + wifi_config.sta.bssid_set = evt->bssid_set; + if (wifi_config.sta.bssid_set == true) { + ESP_LOGI(TAG, "Set MAC address of target AP: "MACSTR" ", MAC2STR(evt->bssid)); + memcpy(wifi_config.sta.bssid, evt->bssid, sizeof(wifi_config.sta.bssid)); + } +#endif + + memcpy(ssid, evt->ssid, sizeof(evt->ssid)); + memcpy(password, evt->password, sizeof(evt->password)); + ESP_LOGI(TAG, "SSID:%s", ssid); + ESP_LOGI(TAG, "PASSWORD:%s", password); + if (evt->type == SC_TYPE_ESPTOUCH_V2) { + ESP_ERROR_CHECK( esp_smartconfig_get_rvd_data(rvd_data, sizeof(rvd_data)) ); + ESP_LOGI(TAG, "RVD_DATA:"); + for (int i=0; i<33; i++) { + printf("%02x ", rvd_data[i]); + } + printf("\n"); + } + + ESP_ERROR_CHECK( esp_wifi_disconnect() ); + ESP_ERROR_CHECK( esp_wifi_set_config(WIFI_IF_STA, &wifi_config) ); + esp_wifi_connect(); + } else if (event_base == SC_EVENT && event_id == SC_EVENT_SEND_ACK_DONE) { + xEventGroupSetBits(s_wifi_event_group, ESPTOUCH_DONE_BIT); + } +} +``` + +- `WIFI_EVENT_STA_START`:当Wi-Fi Station模式启动时,创建智能配网任务。 +- `WIFI_EVENT_STA_DISCONNECTED`:当Wi-Fi断开连接时,重新尝试连接。 +- `IP_EVENT_STA_GOT_IP`:当获取到IP地址时,设置`CONNECTED_BIT`标志位。 +- `SC_EVENT_GOT_SSID_PSWD`:当获取到SSID和密码时,配置Wi-Fi并尝试连接。 +- `SC_EVENT_SEND_ACK_DONE`:当智能配网完成时,设置`ESPTOUCH_DONE_BIT`标志位。 + +最后看看当Wi-Fi Station模式启动时,创建智能配网任务内容: + +```c +static void smartconfig_example_task(void * parm) +{ + EventBits_t uxBits; + ESP_ERROR_CHECK(esp_smartconfig_set_type(SC_TYPE_ESPTOUCH_AIRKISS)); + smartconfig_start_config_t cfg = SMARTCONFIG_START_CONFIG_DEFAULT(); + ESP_ERROR_CHECK( esp_smartconfig_start(&cfg) ); + while (1) { + uxBits = xEventGroupWaitBits(s_wifi_event_group, CONNECTED_BIT | ESPTOUCH_DONE_BIT, true, false, portMAX_DELAY); + if(uxBits & CONNECTED_BIT) { + ESP_LOGI(TAG, "WiFi Connected to ap"); + } + if(uxBits & ESPTOUCH_DONE_BIT) { + ESP_LOGI(TAG, "smartconfig over"); + esp_smartconfig_stop(); + vTaskDelete(NULL); + } + } +} +``` + +程序内容: +- 设置智能配网类型为`SC_TYPE_ESPTOUCH_AIRKISS`。(对应EspTouch或AirKiss) +- 启动智能配网。 +- 等待`CONNECTED_BIT`和`ESPTOUCH_DONE_BIT`事件。 +- 当Wi-Fi连接成功时,打印日志。 +- 当智能配网完成时,停止智能配网并删除任务。 \ No newline at end of file diff --git a/docs/09.其他实用内容/9.1-ESP32配网/9.1.2-Smartconfig配网/attachments/Pasted image 20250222114852.png b/docs/09.其他实用内容/9.1-ESP32配网/9.1.2-Smartconfig配网/attachments/Pasted image 20250222114852.png new file mode 100644 index 0000000..24458c1 Binary files /dev/null and b/docs/09.其他实用内容/9.1-ESP32配网/9.1.2-Smartconfig配网/attachments/Pasted image 20250222114852.png differ diff --git a/docs/09.其他实用内容/9.1-ESP32配网/9.1.2-Smartconfig配网/attachments/Pasted image 20250222114936.png b/docs/09.其他实用内容/9.1-ESP32配网/9.1.2-Smartconfig配网/attachments/Pasted image 20250222114936.png new file mode 100644 index 0000000..39c136e Binary files /dev/null and b/docs/09.其他实用内容/9.1-ESP32配网/9.1.2-Smartconfig配网/attachments/Pasted image 20250222114936.png differ diff --git a/docs/09.其他实用内容/9.1-ESP32配网/9.1.2-Smartconfig配网/attachments/Pasted image 20250222115148.png b/docs/09.其他实用内容/9.1-ESP32配网/9.1.2-Smartconfig配网/attachments/Pasted image 20250222115148.png new file mode 100644 index 0000000..1278c54 Binary files /dev/null and b/docs/09.其他实用内容/9.1-ESP32配网/9.1.2-Smartconfig配网/attachments/Pasted image 20250222115148.png differ diff --git a/docs/09.其他实用内容/9.1-ESP32配网/9.1.2-Smartconfig配网/attachments/Pasted image 20250222115304.png b/docs/09.其他实用内容/9.1-ESP32配网/9.1.2-Smartconfig配网/attachments/Pasted image 20250222115304.png new file mode 100644 index 0000000..98c4f49 Binary files /dev/null and b/docs/09.其他实用内容/9.1-ESP32配网/9.1.2-Smartconfig配网/attachments/Pasted image 20250222115304.png differ diff --git a/docs/09.其他实用内容/9.1-ESP32配网/9.1.2-Smartconfig配网/attachments/Pasted image 20250222115412.png b/docs/09.其他实用内容/9.1-ESP32配网/9.1.2-Smartconfig配网/attachments/Pasted image 20250222115412.png new file mode 100644 index 0000000..9e72f4a Binary files /dev/null and b/docs/09.其他实用内容/9.1-ESP32配网/9.1.2-Smartconfig配网/attachments/Pasted image 20250222115412.png differ diff --git a/docs/09.其他实用内容/9.1-ESP32配网/9.1.2-Smartconfig配网/attachments/Pasted image 20250222115451.png b/docs/09.其他实用内容/9.1-ESP32配网/9.1.2-Smartconfig配网/attachments/Pasted image 20250222115451.png new file mode 100644 index 0000000..2916ba4 Binary files /dev/null and b/docs/09.其他实用内容/9.1-ESP32配网/9.1.2-Smartconfig配网/attachments/Pasted image 20250222115451.png differ diff --git a/docs/09.其他实用内容/9.1-ESP32配网/9.1.3-SoftAP配网/SoftAP配网.md b/docs/09.其他实用内容/9.1-ESP32配网/9.1.3-SoftAP配网/SoftAP配网.md new file mode 100644 index 0000000..da25a44 --- /dev/null +++ b/docs/09.其他实用内容/9.1-ESP32配网/9.1.3-SoftAP配网/SoftAP配网.md @@ -0,0 +1,17 @@ +# SoftAP配网 + +## 一、介绍 + + +## 二、尝试编译使用官方示例 + + +## 三、示例代码解读 + + + + + +## 参考 + +1. https://blog.csdn.net/Gr1ef/article/details/132385647 \ No newline at end of file diff --git a/docs/09.其他实用内容/ESP32实现OTA/ESP32-OTA初探.md b/docs/09.其他实用内容/ESP32实现OTA/ESP32-OTA初探.md new file mode 100644 index 0000000..fe91c0b --- /dev/null +++ b/docs/09.其他实用内容/ESP32实现OTA/ESP32-OTA初探.md @@ -0,0 +1,38 @@ +# ESP32-OTA初探 + +> [!TIP] 🚀 **ESP32 OTA 固件升级 | 让设备秒变“自我进化”!** +> - 💡 **碎碎念**😎:本文档记录如何实现 ESP32 从指定的 URL 更新固件的 OTA 功能,并讲解官方示例程序。
+> - 📺 **视频教程**:🚧 *开发中*
+> - 💾 **示例程序**:✅ [点击查看代码]
+> - 📚 **官网文档**: [API 参考 » 系统 API » 空中升级 (OTA)](https://docs.espressif.com/projects/esp-idf/zh_CN/stable/esp32/api-reference/system/ota.html)
+> - 💻 **官方示例程序**: [esp-idf/examples/system/ota](https://github.com/espressif/esp-idf/tree/v5.2.4/examples/system/ota) + +## 一、OTA介绍 + +OTA(Over-The-Air) 技术是通过无线网络对设备进行远程更新和管理的方式。简单来说,就是“空中下载”技术,让设备不需要物理连接就能接收固件、软件更新,或者配置变更。 + +OTA的基本流程如下: +1. 检测更新:设备通过HTTP/MQTT等协议向服务器请求检查是否有新固件。 +2. 下载固件:确认有新版本后,设备开始下载固件,一般采用分块下载以减少错误率。 +3. 校验完整性:下载完成后通过校验(如MD5、SHA256)确保文件未损坏。 +4. 写入并重启:将固件写入Flash的特定分区,然后重启设备进入新固件。 +5. 回滚机制(可选):若新固件启动失败,设备自动回滚到旧版本。 + +ESP32原生支持OTA,使用ESP-IDF提供的API可以方便地实现远程升级。ESP32通常使用双分区(A/B分区)模式进行OTA,这样可以确保升级失败时还能从旧版本启动。 +## 二、尝试编译使用官方示例 + + + + + +## 三、示例程序解读 + + + + + + + +## 参考: + +5. https://espressif-docs.readthedocs-hosted.com/projects/espressif-esp-moonlight/zh-cn/latest/firmwareupgrade.html \ No newline at end of file diff --git a/docs/09.其他实用内容/WEB服务程序(Vue3+element-plus)/WEB服务程序.md b/docs/09.其他实用内容/WEB服务程序(Vue3+element-plus)/WEB服务程序.md index 4fb3814..13e74e7 100644 --- a/docs/09.其他实用内容/WEB服务程序(Vue3+element-plus)/WEB服务程序.md +++ b/docs/09.其他实用内容/WEB服务程序(Vue3+element-plus)/WEB服务程序.md @@ -1,7 +1,10 @@ # ESP32实现WEB服务程序(Vue3+element-plus) ->[!INFO] ->本文档基于官方[restful_server](https://github.com/espressif/esp-idf/tree/master/examples/protocols/http_server/restful_server)历程,官方历程基于老旧的 Vue2和vuetify2,本文我们进一步优化前端开发体验,将其替换为Vue3+element-plus,并记录配置过程中会遇到的一些问题。 +> [!TIP] 🚀 **ESP32 WEB服务 | Vue3 + Element-Plus 构建现代化前端** +> - 💡 **碎碎念**😎:本文档基于官方 [restful_server](https://github.com/espressif/esp-idf/tree/master/examples/protocols/http_server/restful_server) 示例进行改进,官方示例使用的是 Vue2 和 Vuetify2,本文将其替换为 Vue3 和 Element-Plus,优化前端开发体验。 +> - 📺 **视频教程**:暂无 +> - 💾 **示例程序**:暂无 +> - 📚 **官方示例程序**:[ESP32 RESTful Server 示例](https://github.com/espressif/esp-idf/tree/master/examples/protocols/http_server/restful_server) ## 一、测试原始官方历程