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

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 

#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中配置。

示例下载地址

你可能感兴趣的:(ESP32,makefile,wifi)