ESP32 ESP-IDF增加自定义components 注意事项

本文详细介绍了如何在ESP-IDF框架下管理组件,包括ESP-IDF自带的组件、项目组件以及自定义组件。通过示例展示了如何引用系统组件和自定义组件,特别强调了在头文件引用、CMakelists.txt和component.mk文件的编写。此外,还提供了一个使用ESP32连接SHT20传感器并通过MQTT上传数据的项目示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.概述

随着项目的功能增多,按照以前编写STM32的习惯,不同功能组件会单列出来,方便项目的移植,同时也让主函数更美观简洁,方便阅读。ESP-IDF中按照项目定义可以分为几种components。按照优先级分别是

1.esp-idf自带的components 位于源代码根目录下;

- esp-idf/
        
            -build
            -components    //为ESP-IDF自带的component
            -docs
            -examples
            -make
            -tools
            -user_project  //此为自定义项目的主目录

2.项目自带的components 位于项目目录根目录下;

 - user_project/mqtt_tcp/
             - CMakelists.txt
             - Makefile
             - sdkconfig
             - components/   //此目录为项目components共有2个组件,SHT20和local_mqtt_protocols
                          
                           - SHT20/ - component.mk
                                    -CMakelists.txt
                                         - Kconfig
                                         - sht20.c

                           - local_mqtt_protocols/ - component.mk
                                                   - CMakelists.txt
                                                   - Kconfig
                                                   - local_mqtt_protocols.c
                                                   - include/ - local_mqtt_protocols.h
             - main/       - app_main.c
                           - CMakelists.txt
                           - component.mk

             - build/

3.主程序自定义的部分组件,其地址由项目根目录下的CMakelist.txt和Makefile 定义出来,本例程项目的两个文件分别如下

 

# The following four lines of boilerplate have to be in your project's CMakeLists
# in this exact order for cmake to work correctly
cmake_minimum_required(VERSION 3.5)

# (Not part of the boilerplate)
# This example uses an extra component for common functions such as Wi-Fi and Ethernet connection.
set(EXTRA_COMPONENT_DIRS $ENV{IDF_PATH}/examples/common_components/protocol_examples_common)

include($ENV{IDF_PATH}/tools/cmake/project.cmake)
project(mqtt_tcp)
#
# This is a project Makefile. It is assumed the directory this Makefile resides in is a
# project subdirectory.
#
PROJECT_NAME := mqtt_tcp

EXTRA_COMPONENT_DIRS = $(IDF_PATH)/examples/common_components/protocol_examples_common

include $(IDF_PATH)/make/project.mk
EXTRA_COMPONENT_DIRS = $(IDF_PATH)/examples/common_components/protocol_examples_common

上面代码表示项目除了从系统、项目component引用代码以外,还从 $(IDF_PATH)/examples/common_components/protocol_examples_common这个地址引用了一个组件common_components。此为主程序自定义使用的组件。

2.项目components的使用要求

在上述项目中,我就将local_mqtt_protocols作为一个项目的组件使用,但是其主要目的是将系统组件中的mqtt进行了一下二次包装,按照STM32的书写习惯,在头文件里引用一下就可以了,但是在ESP-IDF中编译却发生找不到头文件。因此需要按照make的方式进行编写。

ocal_mqtt_protocols中共引用了三个组件:两个系统组件,json和mqtt,一个自定义的组件SHT20。

=============================================================================

以下方法可能会随着对ESP-IDF和make编译方式的熟悉而发生变化,现在只是一个临时的解决方案!

=============================================================================

1.在local_mqtt_protocols.h文件中正常引用三个要使用到的组件的头文件

#ifndef _LOCAL_MQTT_PROTOCOLS_H_
#define _LOCAL_MQTT_PROTOCOLS_H_
#include <stdio.h>

#include "cJSON.h"        //要引用的三个头文件-1
#include "mqtt_client.h"  //要引用的三个头文件-2
#include "sht20.h"        //要引用的三个头文件-3

#ifdef __cplusplus
extern "C" {
#endif

void vlocal_mqtt_protocols_task(void *arg);


#ifdef __cplusplus
} // extern "C"
#endif

#endif //_LOCAL_MQTT_PROTOCOLS_H_

2.编写local_mqtt_protocols组件下的CMakelist.txt文件如下:

idf_component_register(SRCS "local_mqtt_protocols.c"
                    INCLUDE_DIRS "include"
                    PRIV_REQUIRES mqtt json SHT20)
                     

其中要在PRIV_REQUIRES后面跟上要引用的三个组件的名字,这样才能引导编译系统找到需要引用的组件头文件。

3.编写local_mqtt_protocols组件下的component.mk文件如下:

#
# Component Makefile
#
# (Uses default behaviour of compiling all source files in directory, adding 'include' to include path.)
COMPONENT_ADD_INCLUDEDIRS:=include

4.完成以上三个步骤,就能将正常能够使用的自定义组件做出来了。

5.以上的理解来源于乐鑫官方的开发文档,连接如下:点我直达

3.项目示例

附一个简单的示例,使用ESP32连接SHT20温度传感器,IIC管脚使用GPIO 18---SDA   GPIO19---SCL 定时将MQTT消息上传到192.168.1.1(使用的是OPENWRT的路由器,安装mosquitto组件来实现智能家居的控制中心)

以上MQTT broker的地址和IIC管脚都可以在menuconfig中配置。

示例下载地址

如果你想在ESP-IDF项目中添加自定义组件,有以下几个步骤: 1. 创建自定义组件文件夹:在ESP-IDF项目的`components`目录下创建一个新的文件夹,用于存放自定义组件的代码和头文件。你可以为该文件夹取一个有意义的名称,以便在项目中使用。 2. 添加组件源代码和头文件:将自定义组件的源代码和头文件放入新创建的文件夹中。确保这些文件是与ESP32芯片兼容的,并且符合ESP-IDF编程规范。 3. 创建组件CMakeLists.txt文件:在自定义组件文件夹中创建一个CMakeLists.txt文件,用于描述组件的配置信息。其中包括组件的源文件、头文件和依赖项等。示例内容如下: ``` idf_component_register(SRCS "component_source_file1.c" "component_source_file2.c" INCLUDE_DIRS "include" REQUIRES dependency1 dependency2 ) ``` 确保将"component_source_file1.c"和"component_source_file2.c"替换为你组件的实际源文件名称,将"include"替换为你组件的头文件所在的文件夹名称,将"dependency1"和"dependency2"替换为你组件所依赖的其他组件的名称。 4. 在主项目中引用自定义组件:在主项目的CMakeLists.txt文件中,添加对自定义组件的引用。示例代码如下: ``` set(EXTRA_COMPONENT_DIRS "path_to_custom_component_folder" "path_to_another_custom_component_folder" ) ``` 将"path_to_custom_component_folder"和"path_to_another_custom_component_folder"替换为你自定义组件所在的文件夹路径。 5. 构建和编译项目:在完成以上步骤后,重新构建和编译ESP-IDF项目。确保自定义组件被成功添加并正确引用。 如此,你就成功地将自定义组件添加到ESP-IDF项目中啦!
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值