init:创建教程

This commit is contained in:
DuRuofu
2024-12-26 16:03:29 +08:00
commit 6fe395792e
67 changed files with 1254 additions and 0 deletions
+477
View File
@@ -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 STAStation)和APAccess 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打开示例程序:
![](attachments/20240218170437.png)
使用自定义的命令 `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/)):
![](attachments/20240218170817.png)
使用`idf.py set-target esp32`配置开发板为ESP32,按照提示使用`idf.py build`命令编译程序:
![](attachments/20240218171102.png)
使用`ls /dev/ttyUSB*`查询串口(linux):
![](attachments/20240218171312.png)
使用`idf.py -p {PORT} flash`命令烧录代码到esp32
![](attachments/20240218171506.png)
烧录完成如下:
![](attachments/20240218171516.png)
使用`idf.py -p {PORT} monitor` 命令打开串口监视器:
![](attachments/20240218171709.png)
成功输出:
![](attachments/20240218171754.png)
## 二、新建工程
### 新建基础工程
加载idf.py环境变量后,使用`idf.py create-project filename` 创建工程
![](attachments/20240218172510.png)
创建好的工程如下:
![](attachments/20240218174120.png)
进入刚刚创建好的工程下,配置目标芯片,我以ESP32为例 `idf.py set-target esp32`
![](attachments/20240218174256.png)
设置目标芯片后,会出现如图结构 , 其中build是编译过程中会出现的文件,sdkconfig是运行用于保存menuconfig的文件。
### 新建组件
不知道组件是啥也不打紧,后面会系统学习,这里只说明如何新建自定义组件:
使用命令:`idf.py -C components create-component my_component`
![](attachments/20240218175156.png)
## 三、工程结构
### 项目目录
esp-idf的标准目录如下所示:
![](attachments/20240218174718.png)
- `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
Binary file not shown.

After

Width:  |  Height:  |  Size: 120 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 89 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 106 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

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` (配置菜单)
![](attachments/20240218212849.png)
运行命令后,我们得到了一个位于终端的可视化配置菜单。
选择 `Example Configuration` 选项:
![](attachments/20240218212956.png)
会看到两个选项,修改Blink GPIO为自己开发板上的引脚,我这里是2号。
![](attachments/20240218213211.png)
重新编译工程,烧录代码。
![](attachments/20240218213648.png)
成功点亮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` 文件:
![](attachments/20240218215404.png)
文件内容如下:
```
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`
![](attachments/20240218221414.png)
我们删除原有的 `Kconfig.projbuild` 文件,自己重新写一个,原来的`Kconfig.projbuild`里有三个配置项:分别是:
- `BLINK_LED`: 控制LED模式(选项)
- `BLINK_GPIO`LED连接的引脚
- `BLINK_PERIOD`LED闪烁的时间
### 创建框架(menu
我们先创建个框架:
``` Kconfig
menu "点灯配置"
endmenu
```
这里菜单项可以使用中文,打开配置菜单可以看到:
![](attachments/20240218222722.png)
### ### 创建单选选项(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
```
效果:
![](attachments/20240218223154.png)
![](attachments/20240218223205.png)
### 创建菜单项目(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.
```
效果:
![](attachments/20240218224055.png)
# 参考链接
1. https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/api-reference/kconfig.html
Binary file not shown.

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 201 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

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项目的结构如下:
![](attachments/20240218174718.png)
其中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`的组件
![](attachments/20240218231930.png)
组件的代码结构如下:
```
- 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
Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

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库,现在只要一行命令就能移植完成。
![](attachments/20240219001357.png)
## 二、组件管理器使用示例:
下面我们基于[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)组件为例:
![](attachments/20240229163020.png)
按键组件实现了 GPIO 和 ADC 两种按键,并允许同时创建两种不同的按键。并且提供多种按键事件,包括按下,弹起,按下弹起 1 次,按下弹起 2 次等。
这里是该组件的中文文档:[按键组件使用](https://docs.espressif.com/projects/esp-iot-solution/zh_CN/latest/input_device/button.html)
![](attachments/20240229163215.png)
### 2.2 引入组件
输入命令添加依赖 `idf.py add-dependency "espressif/button^3.2.0"`
![](attachments/20240229164040.png)
添加完成:
![](attachments/20240229164107.png)
main下多出组件依赖文件,里面写上了我们依赖的组件`espressif/button`
编译项目:`idf.py build`
idf会自动下载我们依赖的组件,存放到`managed_components`文件夹中,如下图:
![](attachments/20240229164459.png)
### 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
Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 128 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 118 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Some files were not shown because too many files have changed in this diff Show More