init:创建教程
@@ -0,0 +1,477 @@
|
||||
|
||||
### 前言:
|
||||
|
||||
本教程文档旨在记录并分享个人学习ESP32过程中的经验和心得,以帮助其他初学者快速上手ESP32开发。这是一份从初学者视角出发,整理了学习ESP32的一条较为合理的路径和方法的笔记汇编。
|
||||
|
||||
文档内容基于对大量优质ESP32教程、官方文档以及实际项目实践的总结和理解,力求做到内容清晰、条理分明,既注重基础知识的巩固,也兼顾实战技能的提升。希望通过本教程,读者能少走弯路,从初学到实战开发,逐步掌握ESP32的开发技能。
|
||||
|
||||
文档内容从基础到进阶,适合循序渐进地学习。如果您是初学者,可以按照章节顺序逐步学习;如果您已有一定的开发经验,可以直接跳转到感兴趣的部分阅读。同时,鼓励读者在学习过程中动手实践,以便更好地理解相关知识点。
|
||||
|
||||
<div STYLE="page-break-after: always;"></div>
|
||||
|
||||
### 修订历史:
|
||||
|
||||
| 文档名称 | 版本 | 作者 | 时间 | 备注 |
|
||||
| :-------------: | :----: | :-----: | :--------: | :-------: |
|
||||
| ESP32学习计划 | v1.0.0 | DuRuofu | 2023-08-28 | 首次建立 |
|
||||
| ESP32学习计划 | v1.0.1 | DuRuofu | 2023-09-2 | 补充 |
|
||||
| ESP32学习计划 | v1.1.0 | DuRuofu | 2023-09-13 | 补充 |
|
||||
| ESP32学习计划 | v1.2.0 | DuRuofu | 2024-01 | 补充环境搭建 |
|
||||
| ESP32学习计划 | v1.3.0 | DuRuofu | 2024-02 | 补充IDF基础 |
|
||||
| ESP32学习计划 | v1.4.0 | DuRuofu | 2024-03 | 补充外设学习 |
|
||||
| ESP32学习计划 | v1.4.0 | DuRuofu | 2024-04 | 补充WIFI部分 |
|
||||
| ESP32从菜鸟到入门(一稿) | v1.5.0 | DuRuofu | 2024-12-26 | 整理汇总,重新编排 |
|
||||
|
||||
|
||||
<div STYLE="page-break-after: always;"></div>
|
||||
|
||||
### 当前进度:
|
||||
|
||||
| 章节 | 教程 | 文字教程 | 视频教程 | 配套代码 |
|
||||
| -------------- | ---------------------- | :--: | :--: | :--: |
|
||||
| 一、认识ESP32 | 1.1 什么是ESP32 | | | 无 |
|
||||
| 一、认识ESP32 | 1.2 ESP32开发环境搭建 | | | |
|
||||
| 一、认识ESP32 | 1.3 初试ESP32-HelloWorld | | | |
|
||||
| 二、IDF基础与工具使用 | 2.1 ESP32工程结构及构建 | | | |
|
||||
| 二、IDF基础与工具使用 | 2.2 ESP-IDF项目配置 | | | |
|
||||
| 二、IDF基础与工具使用 | 2.3 ESP-IDF自定义组件 | | | |
|
||||
| 二、IDF基础与工具使用 | 2.4 ESP-IDF组件管理器 | | | |
|
||||
| 三、FreeRTOS基础 | 3.1 FreeRTOS概述 | | | |
|
||||
| 三、FreeRTOS基础 | 3.2 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通信 | | | |
|
||||
| 四、外设学习 | 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软件定时器教程 | | | |
|
||||
| 六、Wi-Fi功能与相关协议 | 6.1.1 Wi-Fi模式与基础操作 | | | |
|
||||
| 六、Wi-Fi功能与相关协议 | 6.1.2 Wi-Fi STA与AP配置 | | | |
|
||||
| 六、Wi-Fi功能与相关协议 | 6.2.1 TCP协议应用 | | | |
|
||||
| 六、Wi-Fi功能与相关协议 | 6.2.2 UDP协议应用 | | | |
|
||||
|
||||
<div STYLE="page-break-after: always;"></div>
|
||||
|
||||
# 一、认识ESP32
|
||||
|
||||
> 目标:学会安装ESP-IDF开发环境,并使用其烧录代码,掌握ESP32的基本特点及工具使用。
|
||||
|
||||
## 1.1 什么是ESP32
|
||||
|
||||
本节主要介绍ESP32的基本概念,包括其硬件特点、应用场景及功能优势。通过本节内容,初学者可以快速了解ESP32的核心能力以及在物联网开发中的广泛应用。
|
||||
|
||||
> 在线文字教程:[ESP32及开发环境介绍](./docs/01.认识ESP32/1.1-ESP32及开发环境介绍/ESP32及开发环境介绍)
|
||||
> 在线视频教程:[ESP32及开发环境介绍]
|
||||
|
||||
## 1.2 ESP32开发环境搭建
|
||||
|
||||
本节将详细讲解如何在不同操作系统(Windows/Linux/Mac)上搭建ESP-IDF开发环境,涵盖工具链安装、环境变量配置及调试工具的准备等内容。通过本节,读者可以完成开发环境的搭建,为后续开发做好准备。
|
||||
|
||||
> 在线文字教程:[ESP-IDF开发环境搭建](./docs/01.认识ESP32/1.2-ESP32开发环境搭建/ESP32开发环境搭建)
|
||||
> 在线视频教程:[ESP-IDF开发环境搭建]
|
||||
|
||||
## 1.3 初试ESP32-HelloWorld
|
||||
|
||||
本节通过“Hello World”示例代码,指导读者创建第一个ESP32工程,并完成编译、烧录及运行调试流程。通过本节内容,初学者可以初步体验ESP-IDF的开发流程,快速进入ESP32开发的世界。
|
||||
|
||||
> 在线文字教程:[ESP32初体验-HelloWorld](./docs/01.认识ESP32/1.3-初试ESP32-HelloWorld/初试ESP32-HelloWorld)
|
||||
> 在线视频教程:[ESP32初体验-HelloWorld]
|
||||
> 教程配套代码:[HelloWorld 示例代码]
|
||||
|
||||
---
|
||||
|
||||
# 二、IDF基础与工具使用
|
||||
|
||||
> 目标:熟悉ESP-IDF的架构与开发流程,掌握常用开发工具及调试方法,建立高效开发基础。
|
||||
|
||||
## 2.1 ESP32工程结构及构建
|
||||
|
||||
本节详细介绍ESP-IDF项目的基本目录结构与构建流程,包括CMake工具的基础知识,帮助读者掌握ESP32工程的整体组织方式,为日后开发复杂项目奠定基础。
|
||||
|
||||
> 在线文字教程:[ESP32工程结构及构建](./docs/02.IDF基础与工具使用/2.1-ESP32工程结构及构建/ESP32工程结构及构建)
|
||||
> 在线视频教程:[ESP32工程结构及构建]
|
||||
> 教程配套代码:[基础工程模板](#)
|
||||
|
||||
## 2.2 ESP-IDF项目配置
|
||||
|
||||
本节将重点讲解如何使用`menuconfig`工具配置项目,包含常见的配置选项及其实际用途。通过本节学习,读者可以根据项目需求快速定制和优化ESP32项目配置。
|
||||
|
||||
> 在线文字教程:[ESP-IDF项目配置](./docs/02.IDF基础与工具使用/2.2-ESP-IDF项目配置/ESP-IDF项目配置)
|
||||
> 在线视频教程:[ESP-IDF项目配置详解]
|
||||
> 教程配套代码:[项目配置示例代码](#)
|
||||
|
||||
## 2.3 ESP-IDF自定义组件
|
||||
|
||||
本节讲解如何创建和管理ESP-IDF的自定义组件,包括组件的目录结构、声明与调用方法,以及组件的复用和共享技巧,帮助读者构建模块化项目。
|
||||
|
||||
> 在线文字教程:[ESP-IDF自定义组件](./docs/02.IDF基础与工具使用/2.3-ESP-IDF自定义组件/ESP-IDF自定义组件)
|
||||
> 在线视频教程:[ESP-IDF自定义组件开发详解]
|
||||
> 教程配套代码:[组件示例代码](#)
|
||||
|
||||
## 2.4 ESP-IDF组件管理器
|
||||
|
||||
本节重点介绍ESP-IDF组件管理器的功能与使用方法,涵盖如何通过组件管理器导入外部库、配置组件依赖,以及解决组件冲突的问题,帮助读者高效管理复杂项目的依赖关系。
|
||||
|
||||
> 在线文字教程:[ESP-IDF组件管理器](./docs/02.IDF基础与工具使用/2.4-ESP-IDF组件管理器/ESP-IDF组件管理器)
|
||||
> 在线视频教程:[ESP-IDF组件管理器详解]
|
||||
> 教程配套代码:[组件管理器示例代码](#)
|
||||
|
||||
---
|
||||
|
||||
# 三、FreeRTOS基础
|
||||
|
||||
> 目标:学习FreeRTOS的核心概念与基本功能,掌握任务管理与调度机制,为实时系统开发打下基础。
|
||||
|
||||
## 3.1 FreeRTOS概述
|
||||
|
||||
本节将介绍FreeRTOS的核心概念,包括实时操作系统的特点、FreeRTOS的基本架构和设计思想,以及其在嵌入式开发中的应用场景,帮助读者快速了解FreeRTOS的基础知识。
|
||||
|
||||
> 在线文字教程:[FreeRTOS概述](./docs/03.FreeRTOS基础/3.1-FreeRTOS概述/FreeRTOS概述)
|
||||
> 在线视频教程:[FreeRTOS概述讲解]
|
||||
> 教程配套代码:[FreeRTOS初体验示例代码](#)
|
||||
|
||||
## 3.2 FreeRTOS多任务与任务管理
|
||||
|
||||
本节讲解FreeRTOS中的多任务机制及任务管理方法,包括任务创建、任务删除、任务优先级和任务状态的管理。通过本节学习,读者可以初步掌握在FreeRTOS中实现并发任务的基本技巧。
|
||||
|
||||
> 在线文字教程:[FreeRTOS多任务与任务管理](./docs/03.FreeRTOS基础/3.2-FreeRTOS多任务与任务管理/FreeRTOS多任务与任务管理)
|
||||
> 在线视频教程:[FreeRTOS任务管理详解]
|
||||
> 教程配套代码:[FreeRTOS多任务示例代码](#)
|
||||
|
||||
---
|
||||
|
||||
# 四、外设学习
|
||||
|
||||
> 目标:掌握ESP32常用外设的基本操作方法,学会与硬件交互并控制外设设备。
|
||||
|
||||
## 4.1 基础外设
|
||||
|
||||
### 4.1.1 GPIO
|
||||
|
||||
本节介绍GPIO(通用输入输出)的基本功能,包括输入、输出及中断操作。通过实际案例,学习如何控制外部设备并响应硬件信号。
|
||||
|
||||
> 在线文字教程:[GPIO入门](./docs/04.外设学习/4.1-基础外设/4.1.1-GPIO/GPIO入门)
|
||||
> 在线视频教程:[GPIO开发详解]
|
||||
> 教程配套代码:[GPIO示例代码](#)
|
||||
|
||||
### 4.1.2 UART
|
||||
|
||||
本节讲解UART串口通信的原理及在ESP32中的实现,内容涵盖UART初始化、数据收发及常见调试方法。
|
||||
|
||||
> 在线文字教程:[UART串口通信](./docs/04.外设学习/4.1-基础外设/4.1.2-UART/UART串口通信)
|
||||
> 在线视频教程:[UART开发详解]
|
||||
> 教程配套代码:[UART示例代码](#)
|
||||
|
||||
### 4.1.3 定时器
|
||||
|
||||
本节内容包括ESP32硬件定时器的初始化、配置及应用,通过案例学习如何实现精确的时间控制与定时任务。
|
||||
|
||||
> 在线文字教程:[定时器](./docs/04.外设学习/4.1-基础外设/4.1.3-定时器/定时器)
|
||||
> 在线视频教程:[定时器开发详解]
|
||||
> 教程配套代码:[定时器示例代码](#)
|
||||
|
||||
### 4.1.4 ADC(模数转换)
|
||||
|
||||
本节讲解ESP32的ADC模块,包括采样的基本配置与信号转换,并通过示例学习如何读取模拟信号。
|
||||
|
||||
> 在线文字教程:[ADC模数转换](./docs/04.外设学习/4.1-基础外设/4.1.4-ADC/ADC模数转换)
|
||||
> 在线视频教程:[ADC开发详解]
|
||||
> 教程配套代码:[ADC示例代码](#)
|
||||
|
||||
### 4.1.5 DAC(数模转换)
|
||||
|
||||
本节讲解DAC模块的基本操作,学习如何将数字信号转换为模拟信号输出。
|
||||
|
||||
> 在线文字教程:[DAC数模转换](./docs/04.外设学习/4.1-基础外设/4.1.5-DAC/DAC数模转换)
|
||||
> 在线视频教程:[DAC开发详解]
|
||||
> 教程配套代码:[DAC示例代码](#)
|
||||
|
||||
### 4.1.6 LED PWM
|
||||
|
||||
本节介绍LED PWM(脉宽调制)的原理及操作方法,通过实际案例学习如何控制LED亮度。
|
||||
|
||||
> 在线文字教程:[LED PWM控制](./docs/04.外设学习/4.1-基础外设/4.1.6-LED_PWM/LED_PWM控制)
|
||||
> 在线视频教程:[PWM开发详解]
|
||||
> 教程配套代码:[PWM示例代码](#)
|
||||
|
||||
### 4.1.7 I2C
|
||||
|
||||
本节讲解I2C通信协议及在ESP32中的实现,内容涵盖设备寻址、数据收发及实际应用。
|
||||
|
||||
> 在线文字教程:[I2C通信](./docs/04.外设学习/4.1-基础外设/4.1.7-I2C/I2C通信)
|
||||
> 在线视频教程:[I2C开发详解]
|
||||
> 教程配套代码:[I2C示例代码](#)
|
||||
|
||||
### 4.1.8 SPI
|
||||
|
||||
本节介绍SPI通信协议及其在ESP32中的使用,学习如何通过SPI与外部设备通信。
|
||||
|
||||
> 在线文字教程:[SPI通信](./docs/04.外设学习/4.1-基础外设/4.1.8-SPI/SPI通信)
|
||||
> 在线视频教程:[SPI开发详解]
|
||||
> 教程配套代码:[SPI示例代码](#)
|
||||
|
||||
## 4.2 存储外设
|
||||
|
||||
### 4.2.1 分区表设计
|
||||
|
||||
本节讲解ESP32的分区表结构及设计方法,学习如何规划存储空间以满足不同开发需求。
|
||||
|
||||
> 在线文字教程:[分区表设计](./docs/04.外设学习/4.2-存储外设/4.2.1-分区表/分区表)
|
||||
> 在线视频教程:[分区表开发详解]
|
||||
> 教程配套代码:[分区表示例代码](#)
|
||||
|
||||
### 4.2.2 非易失性存储(NVS)
|
||||
|
||||
本节介绍NVS的使用方法,学习如何在ESP32中存储和读取持久化数据。
|
||||
|
||||
> 在线文字教程:[非易失性存储](./docs/04.外设学习/4.2-存储外设/4.2.2-非易失性存储/非易失性存储)
|
||||
> 在线视频教程:[NVS开发详解]
|
||||
> 教程配套代码:[NVS示例代码](#)
|
||||
|
||||
### 4.2.3 FAT文件系统
|
||||
|
||||
本节讲解FAT文件系统的基本操作,学习如何在ESP32中管理文件及目录。
|
||||
|
||||
> 在线文字教程:[FAT文件系统](./docs/04.外设学习/4.2-存储外设/4.2.3-FAT文件系统/FAT文件系统)
|
||||
> 在线视频教程:[FAT文件系统开发详解]
|
||||
> 教程配套代码:[FAT文件系统示例代码](#)
|
||||
|
||||
### 4.2.4 SPIFFS文件系统
|
||||
|
||||
本节介绍SPIFFS文件系统的基本操作,学习如何在ESP32中使用轻量级文件系统进行数据存储与读取。
|
||||
|
||||
> 在线文字教程:[SPIFFS文件系统](./docs/04.外设学习/4.2-存储外设/4.2.4-SPIFFS文件系统/SPIFFS文件系统)
|
||||
> 在线视频教程:[SPIFFS开发详解]
|
||||
> 教程配套代码:[SPIFFS文件系统示例代码](#)
|
||||
|
||||
---
|
||||
|
||||
# 五、FreeRTOS进阶
|
||||
|
||||
> 目标:深入学习FreeRTOS任务间通信与系统优化技术,提升实时应用的开发能力。
|
||||
|
||||
## 5.1 队列 (Queue)
|
||||
|
||||
学习FreeRTOS中队列的基本概念及用法,掌握如何在任务之间传递数据,并理解阻塞与优先级特性。
|
||||
|
||||
>在线文字教程:[FreeRTOS队列使用教程](./docs/05.FreeRTOS进阶/5.1-队列/FreeRTOS队列使用教程)
|
||||
在线视频教程:[队列开发详解]
|
||||
教程配套代码:[队列示例代码](#)
|
||||
|
||||
## 5.2 信号量 (Semaphore)
|
||||
|
||||
理解信号量的分类(计数信号量与二值信号量),学习如何通过信号量实现任务同步及资源管理。
|
||||
|
||||
> 在线文字教程:[FreeRTOS信号量教程](./docs/05.FreeRTOS进阶/5.2-信号量/FreeRTOS信号量教程)
|
||||
> 在线视频教程:[信号量开发详解]
|
||||
> 教程配套代码:[信号量示例代码](#)
|
||||
|
||||
## 5.3 互斥量 (Mutex)
|
||||
|
||||
掌握互斥量的作用及优先级反转问题,学习如何保护共享资源以避免竞争条件。
|
||||
|
||||
> 在线文字教程:[FreeRTOS互斥量教程](./docs/05.FreeRTOS进阶/5.3-互斥量/FreeRTOS互斥量教程)
|
||||
> 在线视频教程:[互斥量开发详解]
|
||||
> 教程配套代码:[互斥量示例代码](#)
|
||||
|
||||
## 5.4 事件组 (Event Group)
|
||||
|
||||
学习如何通过事件组实现复杂的任务同步逻辑及事件管理。
|
||||
|
||||
> 在线文字教程:[FreeRTOS事件组教程](./docs/05.FreeRTOS进阶/5.4-事件组/FreeRTOS事件组教程)
|
||||
> 在线视频教程:[事件组开发详解]
|
||||
> 教程配套代码:[事件组示例代码](#)
|
||||
|
||||
## 5.5 任务通知 (Task Notifications)
|
||||
|
||||
了解任务通知的特点,掌握其在任务间高效通信中的实际应用。
|
||||
|
||||
> 在线文字教程:[FreeRTOS任务通知教程](./docs/05.FreeRTOS进阶/5.5-任务通知/FreeRTOS任务通知教程)
|
||||
> 在线视频教程:[任务通知开发详解]
|
||||
> 教程配套代码:[任务通知示例代码](#)
|
||||
|
||||
## 5.6 软件定时器 (Software Timer)
|
||||
|
||||
通过软件定时器实现定时触发任务逻辑,学习其管理及高级用法。
|
||||
|
||||
> 在线文字教程:[FreeRTOS软件定时器教程](./docs/05.FreeRTOS进阶/5.6-软件定时器/FreeRTOS软件定时器教程)
|
||||
> 在线视频教程:[软件定时器开发详解]
|
||||
> 教程配套代码:[软件定时器示例代码](#)
|
||||
|
||||
|
||||
---
|
||||
|
||||
# 六、Wi-Fi功能与相关协议
|
||||
|
||||
> 目标:学会使用ESP32的Wi-Fi功能,实现无线网络连接及常见通信协议的应用开发。
|
||||
|
||||
## 6.1 Wi-Fi功能入门
|
||||
|
||||
### 6.1.1 Wi-Fi模式与基础操作
|
||||
|
||||
本节介绍ESP32的Wi-Fi模式,包括STA模式和AP模式,以及如何进行基本的Wi-Fi操作,如连接网络和设置路由器等。
|
||||
|
||||
> 在线文字教程:[Wi-Fi模式与基础操作](./docs/06. Wi-Fi功能与相关协议/6.1- Wi-Fi功能入门/6.1.1-Wi-Fi模式与基础操作/ Wi-Fi模式与基础操作)
|
||||
> 在线视频教程:[Wi-Fi模式开发详解]
|
||||
> 教程配套代码:[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配置)
|
||||
> 在线视频教程:[Wi-Fi配置详解]
|
||||
> 教程配套代码:[Wi-Fi配置示例代码](#)
|
||||
|
||||
## 6.2 网络协议应用
|
||||
|
||||
### 6.2.1 TCP协议
|
||||
|
||||
本节讲解TCP协议的原理及在ESP32中的实现,包含连接、数据传输及断开连接的操作步骤。
|
||||
|
||||
> 在线文字教程:[TCP协议应用](./docs/06. Wi-Fi功能与相关协议/6.2-网络协议应用/6.2.1-TCP协议/TCP协议应用)
|
||||
> 在线视频教程:[TCP协议开发详解]
|
||||
> 教程配套代码:[TCP协议示例代码](#)
|
||||
|
||||
### 6.2.2 UDP协议
|
||||
|
||||
本节介绍UDP协议的工作原理及在ESP32上的应用,包含数据发送与接收的实现方法。
|
||||
|
||||
> 在线文字教程:[UDP协议应用](./docs/06. Wi-Fi功能与相关协议/6.2-网络协议应用/6.2.2-UDP协议/UDP协议应用)
|
||||
> 在线视频教程:[UDP协议开发详解]
|
||||
> 教程配套代码:[UDP协议示例代码](#)
|
||||
|
||||
### 6.2.3 HTTP协议
|
||||
|
||||
本节介绍ESP32如何实现HTTP协议,包括创建HTTP客户端和服务器的步骤,以及常见的应用场景。
|
||||
|
||||
> 在线文字教程:[HTTP协议应用](./docs/06. Wi-Fi功能与相关协议/6.2-网络协议应用/6.2.3- HTTP协议/HTTP协议应用)
|
||||
> 在线视频教程:[HTTP协议开发详解]
|
||||
> 教程配套代码:[HTTP协议示例代码](#)
|
||||
|
||||
### 6.2.4 WebSocket协议
|
||||
|
||||
本节讲解WebSocket协议在ESP32中的应用,如何通过WebSocket实现实时双向通信。
|
||||
|
||||
> 在线文字教程:[WebSocket协议应用](./docs/06. Wi-Fi功能与相关协议/6.2-网络协议应用/6.2.4-WebSocket协议/WebSocket协议应用)
|
||||
> 在线视频教程:[WebSocket协议开发详解]
|
||||
> 教程配套代码:[WebSocket协议示例代码](#)
|
||||
|
||||
### 6.2.5 MQTT协议
|
||||
|
||||
本节介绍ESP32如何实现MQTT协议,包括客户端连接、订阅和发布消息的基本操作。
|
||||
|
||||
> 在线文字教程:[MQTT协议应用](./docs/06. Wi-Fi功能与相关协议/6.2-网络协议应用/6.2.5-MQTT协议/MQTT协议应用)
|
||||
> 在线视频教程:[MQTT协议开发详解]
|
||||
> 教程配套代码:[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协议应用)
|
||||
> 在线视频教程:[ESP-NOW协议开发详解]
|
||||
> 教程配套代码:[ESP-NOW协议示例代码](#)
|
||||
|
||||
## 6.3 Wi-Fi配网技术
|
||||
|
||||
### 6.3.1 智能配网(SmartConfig)
|
||||
|
||||
本节讲解ESP32的智能配网技术(SmartConfig),以及如何实现将ESP32设备快速接入Wi-Fi网络。
|
||||
|
||||
> 在线文字教程:[智能配网](./docs/06. Wi-Fi功能与相关协议/6.3- Wi-Fi配网技术/6.3.1-智能配网/ 智能配网)
|
||||
> 在线视频教程:[智能配网开发详解]
|
||||
> 教程配套代码:[智能配网示例代码](#)
|
||||
|
||||
---
|
||||
|
||||
# 七、蓝牙功能与相关协议
|
||||
|
||||
> 目标:掌握ESP32蓝牙功能的配置与使用,实现蓝牙低功耗和经典蓝牙的通信功能。
|
||||
|
||||
## 7.1 蓝牙功能基础
|
||||
|
||||
|
||||
- BLE与经典蓝牙的区别
|
||||
- 蓝牙开发环境配置
|
||||
|
||||
## 7.2 BLE开发
|
||||
|
||||
- BLE广播与扫描
|
||||
- BLE连接与数据传输
|
||||
|
||||
## 7.3 经典蓝牙开发
|
||||
- SPP协议基础
|
||||
- 经典蓝牙数据传输
|
||||
|
||||
---
|
||||
|
||||
# 八、图形界面开发
|
||||
|
||||
> 目标:学习LVGL图形库的基础知识,掌握图形界面开发的核心方法,设计简单的GUI界面。
|
||||
|
||||
## 8.1 LVGL基础
|
||||
- LVGL环境搭建
|
||||
- LVGL的基本架构
|
||||
|
||||
## 8.2 常用组件与布局
|
||||
- 常用控件的使用(按钮、标签等)
|
||||
- 布局系统与屏幕适配
|
||||
|
||||
## 8.3 图形界面项目开发
|
||||
- 动态界面更新
|
||||
- 图形界面优化技巧
|
||||
|
||||
---
|
||||
|
||||
# 九、项目实战
|
||||
|
||||
> 目标:通过综合项目实践,整合所学知识,独立开发基于ESP32的完整应用,提升实战能力。
|
||||
|
||||
## 9.1 实战项目:智能家庭控制中心
|
||||
|
||||
- 多外设联动
|
||||
- 无线通信与协议实现
|
||||
- 图形界面集成
|
||||
|
||||
## 9.2 开发经验总结
|
||||
- 常见问题与解决方法
|
||||
- 代码优化与性能调试
|
||||
|
||||
|
||||
# 参考链接
|
||||
|
||||
- 孤独的二进制:https://space.bilibili.com/1375767826
|
||||
- Augtons正(单片机):https://blog.csdn.net/m0_50064262/article/details/120250151
|
||||
- 乐鑫文档:https://docs.espressif.com/projects/esp-idf/zh_CN/release-v4.4/esp32c3/index.html
|
||||
- 第九个下弦月:https://space.bilibili.com/34165842?spm_id_from=333.999.0.0
|
||||
- **Michael_ee**:https://space.bilibili.com/505630520/fans/follow?tagid=529812
|
||||
# 常用指令
|
||||
|
||||
ESP-IDF:
|
||||
- 创建工程:`idf.py create-project main`
|
||||
- 新建组件`idf.py -C components create-component {componentName}`
|
||||
- 清除之前的编译:` idf.py fullclean`
|
||||
- 编译: `idf.py build`
|
||||
- 向串口烧录固件: `idf.py -p /dev/ttyUSB0 flash` (`/dev/ttyUSB0` 为目标串口参数,根据实际填写)
|
||||
- 打开串口监视器:`idf.py -p /dev/ttyUSB0 monitor` (`/dev/ttyUSB0` 为目标串口参数,根据实际填写)
|
||||
- 配置菜单 :`idf.py menuconfig `
|
||||
- 选择芯片型号:` idf.py set-target esp32 ` 不输入参数的话,会列出所有可用型号
|
||||
- 一次性执行构建、烧录和监视过程:`idf.py -p /dev/ttyUSB0 flash monitor` (`/dev/ttyUSB0` 为目标串口参数,根据实际填写)
|
||||
|
||||
- 获取ADC基准值:`espefuse.py -p /dev/ttyUSB0 adc_info`
|
||||
其他:
|
||||
|
||||
- 查询可用串口:`ls /dev/ttyUSB*`
|
||||
- 添加串口权限(需重启):`sudo usermod -aG dialout username`
|
||||
@@ -0,0 +1,139 @@
|
||||
|
||||
| 文档名称 | 版本 | 作者 | 时间 | 备注 |
|
||||
| ------------ | ------ | ------- | ---------- | ---- |
|
||||
| ESP32工程结构及构建 | v1.0.0 | DuRuofu | 2024-02-18 | 首次建立 |
|
||||
|
||||
## 一、编译并烧录示例程序
|
||||
|
||||
首先编译一个示例程序:hello_world
|
||||
|
||||
示例程序目录:esp-idf/examples/get-started/hello_world
|
||||
|
||||
使用vscode打开示例程序:
|
||||
|
||||

|
||||
|
||||
使用自定义的命令 `get_idf_v5` 获取环境变量([关于自定义命令](https://duruofu.github.io/2024/01/25/4.%E7%A1%AC%E4%BB%B6%E7%9B%B8%E5%85%B3/MCU/ESP32/%E6%90%AD%E5%BB%BAesp-idf%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83/)):
|
||||
|
||||

|
||||
|
||||
使用`idf.py set-target esp32`配置开发板为ESP32,按照提示使用`idf.py build`命令编译程序:
|
||||
|
||||

|
||||
|
||||
使用`ls /dev/ttyUSB*`查询串口(linux):
|
||||
|
||||

|
||||
|
||||
使用`idf.py -p {PORT} flash`命令烧录代码到esp32:
|
||||
|
||||

|
||||
|
||||
烧录完成如下:
|
||||
|
||||

|
||||
|
||||
使用`idf.py -p {PORT} monitor` 命令打开串口监视器:
|
||||
|
||||

|
||||
|
||||
成功输出:
|
||||
|
||||

|
||||
|
||||
## 二、新建工程
|
||||
|
||||
### 新建基础工程
|
||||
|
||||
加载idf.py环境变量后,使用`idf.py create-project filename` 创建工程
|
||||
|
||||

|
||||
|
||||
创建好的工程如下:
|
||||
|
||||

|
||||
|
||||
进入刚刚创建好的工程下,配置目标芯片,我以ESP32为例 `idf.py set-target esp32`
|
||||
|
||||

|
||||
设置目标芯片后,会出现如图结构 , 其中build是编译过程中会出现的文件,sdkconfig是运行用于保存menuconfig的文件。
|
||||
|
||||
### 新建组件
|
||||
|
||||
不知道组件是啥也不打紧,后面会系统学习,这里只说明如何新建自定义组件:
|
||||
|
||||
使用命令:`idf.py -C components create-component my_component`
|
||||
|
||||

|
||||
## 三、工程结构
|
||||
|
||||
### 项目目录
|
||||
|
||||
esp-idf的标准目录如下所示:
|
||||
|
||||

|
||||
|
||||
- `CMakeLists.txt` 文件,这是 CMake 用于学习如何构建项目的主要文件,可以在这个文件中设置项目全局的 CMake 变量。顶层项目 CMakeLists.txt 文件会导入 /tools/cmake/project.cmake 文件,由它负责实现构建系统的其余部分。该文件最后会设置项目的名称,并定义该项目。
|
||||
|
||||
- `sdkconfig` 项目配置文件,执行 idf.py menuconfig 时会创建或更新此文件,文件中保存了项目中所有组件(包括 ESP-IDF 本身)的配置信息。 sdkconfig 文件可能会也可能不会被添加到项目的源码管理系统中。
|
||||
|
||||
- 可选的 `components` 目录中包含了项目的部分自定义组件,并不是每个项目都需要这种自定义组件,但它有助于构建可复用的代码或者导入第三方(不属于 ESP-IDF)的组件。或者,您也可以在顶层 CMakeLists.txt 中设置 EXTRA_COMPONENT_DIRS 变量以查找其他指定位置处的组件。有关详细信息,请参阅 重命名 main 组件。如果项目中源文件较多,建议将其归于组件中,而不是全部放在 “main” 中
|
||||
|
||||
- - `main` 目录是一个特殊的组件,它包含项目本身的源代码。”main” 是默认名称,CMake 变量 COMPONENT_DIRS 默认包含此组件,但您可以修改此变量。
|
||||
|
||||
- `build` 目录是存放构建输出的地方,如果没有此目录,idf.py 会自动创建。CMake 会配置项目,并在此目录下生成临时的构建文件。随后,在主构建进程的运行期间,该目录还会保存临时目标文件、库文件以及最终输出的二进制文件。此目录通常不会添加到项目的源码管理系统中,也不会随项目源码一同发布。
|
||||
|
||||
### 项目 CMakeList.txt 文件
|
||||
|
||||
每个项目都有一个顶层 `CMakeLists.txt` 文件,包含整个项目的构建设置。默认情况下,项目 CMakeLists 文件会非常小。
|
||||
|
||||
``` CMake
|
||||
cmake_minimum_required(VERSION 3.16)
|
||||
include($ENV{IDF_PATH}/tools/cmake/project.cmake)
|
||||
project(teat)
|
||||
```
|
||||
|
||||
> `cmake_minimum_required(VERSION 3.5)` 必须放在 CMakeLists.txt 文件的第一行,它会告诉 CMake 构建该项目所需要的最小版本号。ESP-IDF 支持 CMake 3.5 或更高的版本。
|
||||
`include($ENV{IDF_PATH}/tools/cmake/project.cmake)` 会导入 CMake 的其余功能来完成配置项目、检索组件等任务。
|
||||
`project(teat)` 会创建项目本身,括号内容作为项目名称。
|
||||
|
||||
上面的内容为 项目**必要部分**,除此之外,还有一些 **可选部分**。
|
||||
|
||||
- `COMPONENT_DIRS`:组件的搜索目录,默认为 `IDF_PATH/components`、 `工程文件夹/components`、和变量 `EXTRA_COMPONENT_DIRS`。如果您不想在这些位置搜索组件,请覆盖此变量。(通常情况下此变量不需要覆盖,如果想要添加额外的组件,请放到) `工程文件夹/components`或者变`EXTRA_COMPONENT_DIRS`中
|
||||
- `EXTRA_COMPONENT_DIRS`:用于搜索组件的其它可选目录列表。路径可以是相对于项目目录的相对路径,也可以是绝对路径。
|
||||
- `COMPONENTS`:要构建进项目中的组件名称列表,默认为 `COMPONENT_DIRS` 目录下检索到的所有组件。使用此变量可以“精简”项目以缩短构建时间。请注意,如果一个组件通过 `COMPONENT_REQUIRES` 指定了它依赖的另一个组件,则会自动将其添加到 `COMPONENTS` 中,所以 `COMPONENTS` 列表可能会非常短。
|
||||
以上变量中的路径可以是绝对路径,或者是相对于项目目录的相对路径。
|
||||
要使用 cmake 中的 `set()` 命令 来设置这些变量。 如 `set(VARIABLE "VALUE")`。
|
||||
|
||||
### 组件 CMakeList.txt 文件
|
||||
|
||||
组件是 COMPONENT_DIRS 列表中的任何目录。此列表中的目录可以是组件自身(即包含 CMakeLists.txt 文件的目录),也可以是子目录为组件的顶级目录,例如`$ENV{PROJECT_DIR}/components`
|
||||
|
||||
`构建` 或 `编译` 时,ESP-IDF 搜索所有待构建的组件的顺序为`COMPONENT_DIRS` 指定的顺序依次进行。
|
||||
因此,在默认情况下:
|
||||
|
||||
1. 搜索 ESP-IDF 内部组件(`$ENV{IDF_PATH}/components`)
|
||||
2. 搜索 `EXTRA_COMPONENT_DIRS` 中的组件
|
||||
3. 搜索项目组件(`$ENV{PROJECT_DIR}/components`)
|
||||
|
||||
> **注意** :
|
||||
如果这些目录中的两个或者多个包含具有相同名字的组件,则使用 **搜索到的最后一个** 位置的组件。这就允许将组件复制到项目目录中再修改以覆盖 ESP-IDF 组件。
|
||||
|
||||
|
||||
组件的最小的CMakeList.txt文件只有一句:
|
||||
|
||||
``` CMake
|
||||
idf_component_register(SRCS "my_component.c"
|
||||
INCLUDE_DIRS "include")
|
||||
```
|
||||
|
||||
- `SRCS` 是源文件列表(_.c、_.cpp、_.cc、_.S),里面所有的源文件都将会编译进组件库中。
|
||||
- `INCLUDE_DIRS` 是目录列表,里面的路径会被添加到所有需要该组件的组件(包括 main 组件)全局 include 搜索路径中。
|
||||
|
||||
除此之外,还有很多非必须的参数:
|
||||
|
||||
- `REQUIRES` 声明组件的public依赖,可供其他依赖者访问
|
||||
- `PRIV_REQUIRES`声明private依赖,只能被当前组件访问。
|
||||
# 参考链接
|
||||
|
||||
1. https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/api-guides/build-system.html
|
||||
|
After Width: | Height: | Size: 120 KiB |
|
After Width: | Height: | Size: 89 KiB |
|
After Width: | Height: | Size: 32 KiB |
|
After Width: | Height: | Size: 49 KiB |
|
After Width: | Height: | Size: 106 KiB |
|
After Width: | Height: | Size: 25 KiB |
|
After Width: | Height: | Size: 82 KiB |
|
After Width: | Height: | Size: 34 KiB |
|
After Width: | Height: | Size: 20 KiB |
|
After Width: | Height: | Size: 19 KiB |
|
After Width: | Height: | Size: 20 KiB |
|
After Width: | Height: | Size: 19 KiB |
|
After Width: | Height: | Size: 12 KiB |
@@ -0,0 +1,216 @@
|
||||
|
||||
| 文档名称 | 版本 | 作者 | 时间 | 备注 |
|
||||
| ---- | ---- | ---- | ---- | ---- |
|
||||
| ESP-IDF项目配置 | v1.0.0 | DuRuofu | 2024-02-18 | 首次建立 |
|
||||
|
||||
# ESP-IDF项目配置(组件配置)
|
||||
|
||||
|
||||
## 一、Menuconfig的使用
|
||||
|
||||
打开示例工程:esp-idf/examples/get-started/blink
|
||||
|
||||
这个历程是用来实现LED闪烁的程序,这个工程使用了一个叫`led_strip`的组件,所以代码稍显复杂,但这并不重要,我们的重点不再这里。
|
||||
|
||||
编译代码,烧录,发现并没有现象。(哈哈,这是由于我们并没有配置LED的引脚)
|
||||
|
||||
下面使用`idf.py menuconfig ` 命令打开 `Menuconfig` (配置菜单):
|
||||
|
||||

|
||||
|
||||
运行命令后,我们得到了一个位于终端的可视化配置菜单。
|
||||
|
||||
选择 `Example Configuration` 选项:
|
||||
|
||||

|
||||
|
||||
会看到两个选项,修改Blink GPIO为自己开发板上的引脚,我这里是2号。
|
||||
|
||||

|
||||
|
||||
重新编译工程,烧录代码。
|
||||
|
||||

|
||||
|
||||
成功点亮LED(😊),相信通过这一番操作,我们对menuconfig有了基本的认识,说人话就是这玩意可以方便的帮助我们修改程序里的参数,在不修改代码的情况下。
|
||||
## 二、为什么要用组件配置(Menuconfig)
|
||||
|
||||
1. 组件配置可以将相关配置常量移出代码,增强配置的可复用度
|
||||
2. 组件配置变量也可以被CMake访问,可以通过手写逻辑实现根据配置执行不同的构建方案。(如某个源文件要不要添加到构建系统)
|
||||
3. 组件配置生成的宏定义,配合C语言的预处理语句,可以针对不同的配置改变代码解结构。
|
||||
4. 组件配置生成的宏定义在C语言中是全局的宏定义,可以在任意处访问配置项。只需要#include "sdkconfig.h"即可。
|
||||
|
||||
|
||||
## 三、组件配置相关文件
|
||||
|
||||
在 ESP-IDF 构建系统中,有这么几种文件和组件配置相关。它们分别是:
|
||||
|
||||
1. Kconfig文件
|
||||
2. Kconfig.projbuild文件
|
||||
3. sdkconfig文件
|
||||
4. sdkconfig.default文件
|
||||
5. sdkconfig.old文件
|
||||
6. sdkconfig.ci文件
|
||||
7. sdkconfig.old文件
|
||||
|
||||
>`sdkconfig.default`文件还可以针对某种设备单独添加,例如:
|
||||
对于`ESP32`和`ESP32-S3`,则分别对应`sdkconfig.default.esp32`和`sdkconfig.default.esp32s3`。
|
||||
|
||||
在详细讲解组件配置之前,先分别概括这几个文件的作用分别是什么:
|
||||
|
||||
| 文件名 | 位置 | 作用 | 概述 |
|
||||
| ---- | ---- | ---- | ---- |
|
||||
| Kconfig | 组件目录 | 用于生成menuconfig中的菜单项 | 菜单模板 |
|
||||
| Kconfig.projbuild | 组件目录 | 用于生成menuconfig中的顶层菜单 | 菜单模板 |
|
||||
| sdkconfig | 项目根目录 | 用于保存 Kconfig 设置的键值对形式,手动更改无效 | 保存设置 |
|
||||
| sdkconfig.default | 项目根目录 | 自定义 sdkconfig 的默认值,不会被构建系统更改,格式与 sdkconfig 相同 | 缺省值清单 |
|
||||
| sdkconfig.old | 项目根目录 | 当保存旧的 menuconfig 设置时,自动备份原来的 sdkconfig 文件 | 备份 |
|
||||
其中`Kconfig` 和 `Kconfig.projbuild` 文件用于定义菜单,其余文件用于保存我们配置的值。
|
||||
|
||||
查看main组件文件夹,我们可以发现这个工程里的 `Kconfig.projbuild` 文件:
|
||||
|
||||

|
||||
|
||||
|
||||
文件内容如下:
|
||||
|
||||
```
|
||||
|
||||
menu "Example Configuration"
|
||||
|
||||
orsource "$IDF_PATH/examples/common_components/env_caps/$IDF_TARGET/Kconfig.env_caps"
|
||||
|
||||
choice BLINK_LED
|
||||
prompt "Blink LED type"
|
||||
default BLINK_LED_GPIO if IDF_TARGET_ESP32 || !SOC_RMT_SUPPORTED
|
||||
default BLINK_LED_RMT
|
||||
help
|
||||
Defines the default peripheral for blink example
|
||||
|
||||
config BLINK_LED_GPIO
|
||||
bool "GPIO"
|
||||
config BLINK_LED_RMT
|
||||
bool "RMT - Addressable LED"
|
||||
endchoice
|
||||
|
||||
config BLINK_GPIO
|
||||
int "Blink GPIO number"
|
||||
range ENV_GPIO_RANGE_MIN ENV_GPIO_OUT_RANGE_MAX
|
||||
default 5 if IDF_TARGET_ESP32
|
||||
default 18 if IDF_TARGET_ESP32S2
|
||||
default 48 if IDF_TARGET_ESP32S3
|
||||
default 8
|
||||
help
|
||||
GPIO number (IOxx) to blink on and off or the RMT signal for the addressable LED.
|
||||
Some GPIOs are used for other purposes (flash connections, etc.) and cannot be used to blink.
|
||||
|
||||
config BLINK_PERIOD
|
||||
int "Blink period in ms"
|
||||
range 10 3600000
|
||||
default 1000
|
||||
help
|
||||
Define the blinking period in milliseconds.
|
||||
|
||||
endmenu
|
||||
|
||||
```
|
||||
|
||||
不难发现,下面这部分就和我们刚才见到的配置项有关:
|
||||
|
||||
```
|
||||
config BLINK_GPIO
|
||||
int "Blink GPIO number"
|
||||
range ENV_GPIO_RANGE_MIN ENV_GPIO_OUT_RANGE_MAX
|
||||
default 5 if IDF_TARGET_ESP32
|
||||
default 18 if IDF_TARGET_ESP32S2
|
||||
default 48 if IDF_TARGET_ESP32S3
|
||||
default 8
|
||||
help
|
||||
GPIO number (IOxx) to blink on and off or the RMT signal for the addressable LED.
|
||||
Some GPIOs are used for other purposes (flash connections, etc.) and cannot be used to blink.
|
||||
|
||||
config BLINK_PERIOD
|
||||
int "Blink period in ms"
|
||||
range 10 3600000
|
||||
default 1000
|
||||
help
|
||||
Define the blinking period in milliseconds.
|
||||
|
||||
```
|
||||
|
||||
即使不了解 Kconfig (ps: Kconfig 上面这些就是依赖Kconfig写的),我们也能猜出这几行代码干了啥: 定义了两个配置项,`BLINK_GPIO` 和 `BLINK_PERIOD` , 然后添加默认值,添加说明等。
|
||||
|
||||
关于 Kconfig 的写法随便搜索一下就能学会,这里不在赘述。
|
||||
|
||||
## 四、创建组件配置
|
||||
|
||||
|
||||
下面我们试着自己写一个组件配置,复制`blink`历程到自己的目录,重命名为 `blink_menuconfig`
|
||||
|
||||

|
||||
|
||||
我们删除原有的 `Kconfig.projbuild` 文件,自己重新写一个,原来的`Kconfig.projbuild`里有三个配置项:分别是:
|
||||
|
||||
- `BLINK_LED`: 控制LED模式(选项)
|
||||
- `BLINK_GPIO`:LED连接的引脚
|
||||
- `BLINK_PERIOD`:LED闪烁的时间
|
||||
|
||||
### 创建框架(menu)
|
||||
|
||||
我们先创建个框架:
|
||||
|
||||
``` Kconfig
|
||||
menu "点灯配置"
|
||||
|
||||
endmenu
|
||||
|
||||
```
|
||||
|
||||
这里菜单项可以使用中文,打开配置菜单可以看到:
|
||||
|
||||

|
||||
|
||||
### ### 创建单选选项(choice)
|
||||
|
||||
```
|
||||
menu "点灯配置"
|
||||
choice BLINK_LED
|
||||
prompt "LED模式"
|
||||
default BLINK_LED_GPIO
|
||||
|
||||
config BLINK_LED_GPIO
|
||||
bool "GPIO"
|
||||
config BLINK_LED_RMT
|
||||
bool "RMT - Addressable LED"
|
||||
endchoice
|
||||
endmenu
|
||||
|
||||
```
|
||||
|
||||
效果:
|
||||

|
||||
|
||||

|
||||
### 创建菜单项目(config)
|
||||
|
||||
```
|
||||
config BLINK_GPIO
|
||||
int "LED引脚"
|
||||
default 2
|
||||
help
|
||||
This is an int BLINK_GPIO.
|
||||
|
||||
config BLINK_PERIOD
|
||||
int "LED周期"
|
||||
default 1000
|
||||
help
|
||||
This is a int BLINK_GPIO.
|
||||
```
|
||||
|
||||
效果:
|
||||
|
||||

|
||||
|
||||
# 参考链接
|
||||
|
||||
1. https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/api-reference/kconfig.html
|
||||
|
After Width: | Height: | Size: 61 KiB |
|
After Width: | Height: | Size: 48 KiB |
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 201 KiB |
|
After Width: | Height: | Size: 25 KiB |
|
After Width: | Height: | Size: 23 KiB |
|
After Width: | Height: | Size: 41 KiB |
|
After Width: | Height: | Size: 4.8 KiB |
|
After Width: | Height: | Size: 9.5 KiB |
|
After Width: | Height: | Size: 12 KiB |
@@ -0,0 +1,222 @@
|
||||
|
||||
### 说明:
|
||||
|
||||
1. 本文档由DuRuofu撰写,由DuRuofu负责解释及执行。
|
||||
|
||||
### 修订历史:
|
||||
|
||||
| 文档名称 | 版本 | 作者 | 时间 | 备注 |
|
||||
| ---- | ---- | ---- | ---- | ---- |
|
||||
| ESP-IDF自定义组件 | v1.0.0 | DuRuofu | 2024-02-18 | 首次建立 |
|
||||
|
||||
<div STYLE="page-break-after: always;"></div>
|
||||
|
||||
# ESP-IDF自定义组件
|
||||
|
||||
## 一 、自定义组件介绍:
|
||||
|
||||
之前在[ESP32工程结构及构建](../2.1-ESP32工程结构及构建/ESP32工程结构及构建.md)里提到esp-idf项目的结构如下:
|
||||
|
||||

|
||||
|
||||
其中components文件夹就是我们自定义的组件。ESP-IDF组件机制就是代码模块化的一种体现,将特定功能的代码封装为一个个组件并对外暴露接口,增强代码的可复用性,提高代码维护效率。
|
||||
|
||||
|
||||
## 二 、自定义组件示例:
|
||||
|
||||
|
||||
下面我们基于[ESP-IDF项目配置](../2.2-ESP-IDF项目配置/ESP-IDF项目配置.md)中编写的[blink_menuconfig](https://github.com/DuRuofu/ESP32_Learning/tree/master/02.idf_basis/blink_menuconfig)工程来实现一个自定义的控制闪烁的组件。
|
||||
|
||||
复制工程,重命名为`blink_component`
|
||||
|
||||
使用命令:`idf.py -C components create-component led_blink`
|
||||
|
||||
目录下多出一个叫`blink_component`的组件
|
||||
|
||||

|
||||
|
||||
组件的代码结构如下:
|
||||
|
||||
```
|
||||
- led_blink/ - CMakeLists.txt
|
||||
- Kconfig
|
||||
- led_blink.c
|
||||
- include/
|
||||
- led_blink.h
|
||||
|
||||
```
|
||||
|
||||
将点灯的函数定义裁剪到 `led_blink.c`
|
||||
|
||||
``` c
|
||||
#include <stdio.h>
|
||||
#include "led_blink.h"
|
||||
#include "freertos/FreeRTOS.h"
|
||||
#include "freertos/task.h"
|
||||
#include "driver/gpio.h"
|
||||
#include "esp_log.h"
|
||||
#include "led_strip.h"
|
||||
#include "sdkconfig.h"
|
||||
|
||||
|
||||
static const char *TAG = "led_blink";
|
||||
|
||||
/* Use project configuration menu (idf.py menuconfig) to choose the GPIO to blink,
|
||||
or you can edit the following line and set a number here.
|
||||
*/
|
||||
#define BLINK_GPIO CONFIG_BLINK_GPIO
|
||||
|
||||
|
||||
#ifdef CONFIG_BLINK_LED_RMT
|
||||
|
||||
led_strip_handle_t led_strip;
|
||||
|
||||
void blink_led(void)
|
||||
{
|
||||
/* If the addressable LED is enabled */
|
||||
if (s_led_state) {
|
||||
/* Set the LED pixel using RGB from 0 (0%) to 255 (100%) for each color */
|
||||
led_strip_set_pixel(led_strip, 0, 16, 16, 16);
|
||||
/* Refresh the strip to send data */
|
||||
led_strip_refresh(led_strip);
|
||||
} else {
|
||||
/* Set all LED off to clear all pixels */
|
||||
led_strip_clear(led_strip);
|
||||
}
|
||||
}
|
||||
|
||||
void configure_led(void)
|
||||
{
|
||||
ESP_LOGI(TAG, "Example configured to blink addressable LED!");
|
||||
/* LED strip initialization with the GPIO and pixels number*/
|
||||
led_strip_config_t strip_config = {
|
||||
.strip_gpio_num = BLINK_GPIO,
|
||||
.max_leds = 1, // at least one LED on board
|
||||
};
|
||||
led_strip_rmt_config_t rmt_config = {
|
||||
.resolution_hz = 10 * 1000 * 1000, // 10MHz
|
||||
};
|
||||
ESP_ERROR_CHECK(led_strip_new_rmt_device(&strip_config, &rmt_config, &led_strip));
|
||||
/* Set all LED off to clear all pixels */
|
||||
led_strip_clear(led_strip);
|
||||
}
|
||||
|
||||
#elif CONFIG_BLINK_LED_GPIO
|
||||
|
||||
void blink_led(int s_led_state)
|
||||
{
|
||||
/* Set the GPIO level according to the state (LOW or HIGH)*/
|
||||
gpio_set_level(BLINK_GPIO, s_led_state);
|
||||
}
|
||||
|
||||
void configure_led(void)
|
||||
{
|
||||
ESP_LOGI(TAG, "Example configured to blink GPIO LED!");
|
||||
gpio_reset_pin(BLINK_GPIO);
|
||||
/* Set the GPIO as a push/pull output */
|
||||
gpio_set_direction(BLINK_GPIO, GPIO_MODE_OUTPUT);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
```
|
||||
|
||||
|
||||
在头文件声明函数:
|
||||
``` c
|
||||
#ifndef LED_BLINK_H
|
||||
#define LED_BLINK_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
// Function declarations
|
||||
void blink_led(int s_led_state);
|
||||
void configure_led(void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* LED_BLINK_H */
|
||||
|
||||
```
|
||||
|
||||
组件下新建`idf_component.yml`文件引入组件依赖的`led_strip`组件
|
||||
|
||||
```
|
||||
dependencies:
|
||||
espressif/led_strip: "^2.0.0"
|
||||
```
|
||||
|
||||
新建Kconfig文件,移植组件配置,参考[ESP-IDF项目配置](../2.2-ESP-IDF项目配置/ESP-IDF项目配置.md)
|
||||
|
||||
```
|
||||
menu "点灯组件配置"
|
||||
choice BLINK_LED
|
||||
prompt "LED模式"
|
||||
default BLINK_LED_GPIO
|
||||
|
||||
config BLINK_LED_GPIO
|
||||
bool "GPIO"
|
||||
config BLINK_LED_RMT
|
||||
bool "RMT - Addressable LED"
|
||||
endchoice
|
||||
|
||||
config BLINK_GPIO
|
||||
int "LED引脚"
|
||||
default 2
|
||||
help
|
||||
This is an int BLINK_GPIO.
|
||||
|
||||
config BLINK_PERIOD
|
||||
int "LED周期"
|
||||
default 1000
|
||||
help
|
||||
This is a int BLINK_GPIO.
|
||||
|
||||
|
||||
endmenu
|
||||
|
||||
```
|
||||
|
||||
|
||||
这样就编写好了一个组件。
|
||||
|
||||
|
||||
然后在main组件里引入模块使用即可:
|
||||
|
||||
```c
|
||||
#include <stdio.h>
|
||||
#include "freertos/FreeRTOS.h"
|
||||
#include "freertos/task.h"
|
||||
#include "esp_log.h"
|
||||
#include "led_blink.h"
|
||||
|
||||
static const char *TAG = "example";
|
||||
uint8_t s_led_state = 0;
|
||||
|
||||
void app_main(void)
|
||||
{
|
||||
/* Configure the peripheral according to the LED type */
|
||||
configure_led();
|
||||
|
||||
while (1) {
|
||||
ESP_LOGI(TAG, "Turning the LED %s!", s_led_state == true ? "ON" : "OFF");
|
||||
blink_led(s_led_state);
|
||||
/* Toggle the LED state */
|
||||
s_led_state = !s_led_state;
|
||||
vTaskDelay(CONFIG_BLINK_PERIOD / portTICK_PERIOD_MS);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
这样就完成了代码的模块化,关于组件依赖,嵌套还有一些值得注意的地方,不过目前入门阶段不必深究,后续学习过程中会娓娓道来。
|
||||
# 参考链接
|
||||
|
||||
1. https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/api-guides/build-system.html
|
||||
|
After Width: | Height: | Size: 19 KiB |
|
After Width: | Height: | Size: 40 KiB |
@@ -0,0 +1,200 @@
|
||||
|
||||
### 说明:
|
||||
|
||||
1. 本文档由DuRuofu撰写,由DuRuofu负责解释及执行。
|
||||
2. 本文介绍ESP-IDF组件管理器的使用
|
||||
|
||||
### 修订历史:
|
||||
|
||||
| 文档名称 | 版本 | 作者 | 时间 | 备注 |
|
||||
| ---- | ---- | ------------ | ------ |
|
||||
| ESP-IDF组件管理器 |v1.0.0| DuRuofu | 2024-02-18 | 首次建立 |
|
||||
|
||||
<div STYLE="page-break-after: always;"></div>
|
||||
|
||||
# ESP-IDF组件管理器
|
||||
|
||||
## 一、啥是组件管理器
|
||||
|
||||
ESP-IDF官方对组件管理器的描述是这样的:
|
||||
|
||||
>The IDF Component Manager is a tool that allows developers to manage components for the ESP-IDF development framework. The tool is compatible with ESP-IDF versions 4.1 and later, and is included by default starting with ESP-IDF version 4.4.
|
||||
>
|
||||
The ESP Component Registry is a central repository for components that can be used with the ESP-IDF. It is hosted at [https://components.espressif.com](https://components.espressif.com/) and provides a convenient way for developers to discover and download components for their projects.
|
||||
>
|
||||
With the IDF Component Manager, developers can easily install components from the ESP-IDF Component Registry, streamlining the process of adding new functionality to their projects.
|
||||
|
||||
说人话就是,世上本没有组件管理器,自定义组件多了,就有了组件库,就有了组件管理器。
|
||||
|
||||
如果用学过node,那我们可以把组件管理器比作npm包管理器,把`idf_component.yml`比作`package.jso`,真的一模一样。(不知道node,npm当我没说)。
|
||||
|
||||
我们可以在这:[ ESP-IDF components](https://components.espressif.com) 找到乐鑫发布的一些他们帮我们写好的”自定义组件“。
|
||||
|
||||
使用这些组件我们可以快速的完成一些功能的实现,比如移植还有点难度的LVGL库,现在只要一行命令就能移植完成。
|
||||
|
||||

|
||||
|
||||
|
||||
## 二、组件管理器使用示例:
|
||||
|
||||
下面我们基于[ESP-IDF自定义组件](../2.3-ESP-IDF自定义组件/ESP-IDF自定义组件.md)教程中编写的[blink_component](https://github.com/DuRuofu/ESP32_Learning/tree/master/02.idf_basis/blink_component)工程来实现使用一下官方的组件管理器,复制工程,重命名为`button_component`
|
||||
|
||||
### 2.1 组件介绍
|
||||
|
||||
在这部分,我们学着使用官方提供的组件,这里以[button](https://components.espressif.com/components/espressif/button?language=en)组件为例:
|
||||
|
||||

|
||||
|
||||
按键组件实现了 GPIO 和 ADC 两种按键,并允许同时创建两种不同的按键。并且提供多种按键事件,包括按下,弹起,按下弹起 1 次,按下弹起 2 次等。
|
||||
|
||||
这里是该组件的中文文档:[按键组件使用](https://docs.espressif.com/projects/esp-iot-solution/zh_CN/latest/input_device/button.html)
|
||||
|
||||

|
||||
|
||||
|
||||
### 2.2 引入组件
|
||||
|
||||
输入命令添加依赖 `idf.py add-dependency "espressif/button^3.2.0"` :
|
||||
|
||||

|
||||
|
||||
添加完成:
|
||||
|
||||

|
||||
|
||||
main下多出组件依赖文件,里面写上了我们依赖的组件`espressif/button`
|
||||
|
||||
编译项目:`idf.py build`
|
||||
|
||||
idf会自动下载我们依赖的组件,存放到`managed_components`文件夹中,如下图:
|
||||
|
||||

|
||||
|
||||
### 2.3 组件的使用
|
||||
|
||||
组件的使用各不相同,使用时具体参考对应的组件文档即可:[ESP-IoT-Solution 编程指南](https://docs.espressif.com/projects/esp-iot-solution/zh_CN/latest/index.html)
|
||||
|
||||
下面的内容参考文档也能完成,这里不再详细描述:
|
||||
|
||||
#### 创建按键
|
||||
|
||||
``` c
|
||||
// create gpio button
|
||||
button_config_t gpio_btn_cfg = {
|
||||
.type = BUTTON_TYPE_GPIO,
|
||||
.long_press_time = CONFIG_BUTTON_LONG_PRESS_TIME_MS,
|
||||
.short_press_time = CONFIG_BUTTON_SHORT_PRESS_TIME_MS,
|
||||
.gpio_button_config = {
|
||||
.gpio_num = 0,
|
||||
.active_level = 0,
|
||||
},
|
||||
};
|
||||
button_handle_t gpio_btn = iot_button_create(&gpio_btn_cfg);
|
||||
if(NULL == gpio_btn) {
|
||||
ESP_LOGE(TAG, "Button create failed");
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
详解:
|
||||
|
||||
1. `button_config_t gpio_btn_cfg`:定义了一个名为 `gpio_btn_cfg` 的结构体变量,用于配置按钮的参数。
|
||||
2. `.type = BUTTON_TYPE_GPIO`:指定按钮的类型为 GPIO 类型,表示这是一个基于 GPIO 的按钮。
|
||||
3. `.long_press_ticks = CONFIG_BUTTON_LONG_PRESS_TIME_MS`:设置长按触发的时间阈值,单位为毫秒。
|
||||
4. `.short_press_ticks = CONFIG_BUTTON_SHORT_PRESS_TIME_MS`:设置短按触发的时间阈值,单位为毫秒。
|
||||
5. `.gpio_button_config`:GPIO 按钮的具体配置信息。
|
||||
- `.gpio_num = 0`:指定了 GPIO 编号为 0,即对应 ESP32 开发板上的某个 GPIO 引脚。
|
||||
- `.active_level = 0`:指定了按钮的触发电平为低电平(0),即当 GPIO 引脚为低电平时被认为按钮被按下。
|
||||
6. `button_handle_t gpio_btn = iot_button_create(&gpio_btn_cfg)`:调用 `iot_button_create` 函数创建一个按钮实例,并将配置信息传递给该函数,返回一个按钮句柄 `gpio_btn`。
|
||||
7. `if(NULL == gpio_btn)`:检查按钮实例是否成功创建。
|
||||
- 如果 `gpio_btn` 为 `NULL`,则打印错误日志,提示按钮创建失败。
|
||||
|
||||
|
||||
#### 注册回调函数
|
||||
|
||||
Button 组件支持为多个事件注册回调函数,每个事件都可以注册一个回调函数,当事件发生时,回调函数将会被调用。
|
||||
|
||||
``` c
|
||||
|
||||
static void button_single_click_cb(void *arg,void *usr_data)
|
||||
{
|
||||
ESP_LOGI(TAG, "BUTTON_SINGLE_CLICK");
|
||||
}
|
||||
|
||||
iot_button_register_cb(gpio_btn, BUTTON_SINGLE_CLICK, button_single_click_cb,NULL);
|
||||
|
||||
```
|
||||
|
||||
详解:
|
||||
1. `static void button_single_click_cb(void *arg, void *usr_data)`:定义了一个静态的回调函数 `button_single_click_cb`,该函数在按钮单击事件发生时被调用。函数接受两个参数,一个是 `arg`,用于传递按钮相关的参数,另一个是 `usr_data`,用于传递用户数据。
|
||||
|
||||
2. `iot_button_register_cb(gpio_btn, BUTTON_SINGLE_CLICK, button_single_click_cb, NULL)`:调用 `iot_button_register_cb` 函数注册了一个按钮单击事件的回调函数。
|
||||
- `gpio_btn`:表示要注册回调函数的按钮实例。
|
||||
- `BUTTON_SINGLE_CLICK`:指定注册的是单击事件的回调函数。
|
||||
- `button_single_click_cb`:指定要注册的回调函数,即单击事件发生时调用的函数。
|
||||
- `NULL`:表示没有用户数据需要传递给回调函数。
|
||||
|
||||
|
||||
结合上一篇教程的LED闪烁的代码,最终代码如下:`blink_example_main.c`
|
||||
|
||||
``` c
|
||||
|
||||
#include <stdio.h>
|
||||
#include "freertos/FreeRTOS.h"
|
||||
#include "freertos/task.h"
|
||||
#include "esp_log.h"
|
||||
#include "led_blink.h"
|
||||
#include "iot_button.h"
|
||||
|
||||
|
||||
static const char *TAG = "example";
|
||||
uint8_t s_led_state = 0;
|
||||
|
||||
|
||||
// 按键回调函数(单击,led灯状态取反)
|
||||
static void button_single_click_cb(void *arg,void *usr_data)
|
||||
{
|
||||
ESP_LOGI(TAG, "BUTTON_SINGLE_CLICK");
|
||||
ESP_LOGI(TAG, "Turning the LED %s!", s_led_state == true ? "ON" : "OFF");
|
||||
s_led_state = !s_led_state;
|
||||
blink_led(s_led_state);
|
||||
}
|
||||
|
||||
|
||||
void app_main(void)
|
||||
{
|
||||
/* Configure the peripheral according to the LED type */
|
||||
configure_led();
|
||||
// create gpio button
|
||||
button_config_t gpio_btn_cfg = {
|
||||
.type = BUTTON_TYPE_GPIO,
|
||||
.long_press_time = CONFIG_BUTTON_LONG_PRESS_TIME_MS,
|
||||
.short_press_time = CONFIG_BUTTON_SHORT_PRESS_TIME_MS,
|
||||
.gpio_button_config = {
|
||||
.gpio_num = 0,
|
||||
.active_level = 0,
|
||||
},
|
||||
};
|
||||
|
||||
button_handle_t gpio_btn = iot_button_create(&gpio_btn_cfg);
|
||||
if(NULL == gpio_btn) {
|
||||
ESP_LOGE(TAG, "Button create failed");
|
||||
}
|
||||
|
||||
// 注册按键回调
|
||||
iot_button_register_cb(gpio_btn, BUTTON_SINGLE_CLICK, button_single_click_cb,NULL);
|
||||
|
||||
while (1) {
|
||||
vTaskDelay(CONFIG_BLINK_PERIOD / portTICK_PERIOD_MS);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
```
|
||||
|
||||
实现的效果为:单击开发板上的按键,可以控制LED翻转。
|
||||
|
||||
以上就是ESP32组件管理器及第三方组件的使用。
|
||||
# 参考链接
|
||||
|
||||
1. https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/api-guides/tools/idf-component-manager.html
|
||||
|
After Width: | Height: | Size: 96 KiB |
|
After Width: | Height: | Size: 81 KiB |
|
After Width: | Height: | Size: 128 KiB |
|
After Width: | Height: | Size: 21 KiB |
|
After Width: | Height: | Size: 118 KiB |
|
After Width: | Height: | Size: 21 KiB |