如何将 arduino-esp32 库作为 ESP-IDF 组件使用?

news2024/10/7 4:22:33

相关文档

  • arduino-esp32 SDK
  • ESP-IDF SDK
  • ESP-IDF 软件环境搭建说明
  • Arduino 软件环境使用说明
  • Arduino as an ESP-IDF component (官方说明)

环境准备

目前,最新 Master 版本的 arduino-esp32 SDK 要求使用 v4.4 版本的 ESP-IDF SDK 软件编译环境。

  • 不同版本的 arduino-esp32 SDK 对应的 ESP-IDF SDK 版本的说明参见 “ESP32 Arduino Release” 说明
  • arduino-esp32 SDK 发布的版本可在 arduino-esp32 SDK 管理目录下查看,如下:
    在这里插入图片描述
  • ESP-IDF 软件编译环境
    • 如何您使用的是 Windows 环境, 它非常简单. 您只需要使用离线版本的 “ESP-IDF 工具安装器” 来安装 esp-idf SDK 版本的编译环境。 可参考 “Windows 上搭建 ESP-IDF SDK 编译环境 + Visual Studio Code 软件编程环境” 指南,视频教程参见 “使用一键安装工具快速搭建 ESP-IDF 开发环境 (Windows)”。
    • 如果您使用的是 Ubuntu 环境,请阅读 “Linux 和 macOS 平台工具链的标准设置” 说明。您也可以参考 “Ubuntu18.04 上通过 Gitee 完成 ESP32-S3 的 ESP-IDF 编译环境搭建” 指南。

接下来,我们将基于 windows 环境来演示如何将 arduino-esp32 库作为 ESP-IDF SDK 组件使用,包含:

  • 将 arduino-esp32 库作为工程的组件来使用
  • 将 arduino-esp32 库作为 ESP-IDF SDK 库里的组件来使用

1、 将 arduino-esp32 库作为工程的组件来使用

  • 创建一个自定义工程
  • 为当前工程创建组件文件夹
  • 克隆 arduino-esp32 库作为当前工程的组件
  • 对工程文件名做相应修改
  • 对工程配置选项做相应修改
  • 编译、下载当前工程进行测试

1.1 创建一个自定义工程

基于 ESP-IDF SDK 可复制一个工程来进行测试,例如复制 hello-world 工程,改名为 hello-world_Arduino , 如下:

在这里插入图片描述

1.2 为当前工程创建组件文件夹

可使用如下指令,为当前自定义的工程文件创建组件文件夹

cd hello-world_Arduino
mkdir components

在这里插入图片描述

1.3 克隆 arduino-esp32 库作为当前工程的组件

  • 进入到 components 文件目录下,运行如下指令,克隆 arduino-esp32 库
cd components

git clone https://github.com/espressif/arduino-esp32.git

在这里插入图片描述

  • arduino-esp32 SDK 克隆完成后,进入到 arduino-esp32 文件目录下,运行如下指令,克隆 arduino-esp32 库的子仓库
cd arduino-esp32

git submodule update --init --recursive

在这里插入图片描述

以上步骤完成后,工程结构如下:

在这里插入图片描述


1.4 对工程文件名做相应修改

这里我们在 hello-world_Arduino 的工程文件下,使用 Arduino setup()loop() 来测试

  • hello-world_Arduino 工程文件夹下,将文件 main.c 重命名为 main.cpp , 如下:

    在这里插入图片描述

  • 在工程文件夹下的 main 文件夹中,打开文件 CMakeLists.txt 并将 main.c 更改为 main.cpp,如下
    在这里插入图片描述

  • hello-world_Arduino 工程下的 hello_world_main.cpp 文件中可基于 Arduino 库编写测试代码,如下:

#include "Arduino.h"

#define RGB_BUILTIN 26

void setup() {
  // No need to initialize the RGB LED
  Serial.begin(115200);
  pinMode(RGB_BUILTIN, OUTPUT);
  Serial.printf("GPIO is %d \r\n", RGB_BUILTIN);
}

// the loop function runs over and over again forever
void loop() {
#ifdef RGB_BUILTIN
  digitalWrite(RGB_BUILTIN, HIGH);
   Serial.printf("Light on \r\n ");
  delay(1000);
  
  digitalWrite(RGB_BUILTIN, LOW);   // Turn the RGB LED off
  Serial.printf("Light off \r\n");
  delay(1000);

#endif
}

在这里插入图片描述


1.5 对工程配置选项做相应修改

  • 修改 sdkconfig 文件中的 CONFIG_FREERTOS_HZ 配置为 1000, 默认是 100

    在这里插入图片描述

  • 在 工程目录下,运行 idf.py menuconfig 指令进入工程配置选项界面,开启 Autostart Arduino setup and loop on boot 配置选项

    在这里插入图片描述

    idf.py menuconfig → Arduino Configuration [*] Autostart Arduino setup and loop on boot

    在这里插入图片描述

1.6 编译、下载当前工程进行测试

  • 在当前工程目录下,运行如下指令编译工程

    idf.py build
    

    在这里插入图片描述

    固件编译完成将打印如下日志,提示编译生成的固件和对应的下载地址

    在这里插入图片描述

  • 在当前工程目录下运行如下指令下载固件并打印固件运行日志

    idf.py -p COM4 flash monitor
    

    在这里插入图片描述


2、arduino-esp32 库作为 ESP-IDF SDK 库里的组件来使用

  • esp-idf SDK 目录下创建 components-Arduino 文件夹
  • components-Arduino 文件夹下克隆 arduino-esp32 SDK
  • 在工程目录下的 CmakeLists.txt 文件中增加 arduino-esp32 组件的路径

2.1 在 esp-idf SDK 目录下创建 components-Arduino 文件夹

mkdir components-Arduino

在这里插入图片描述

2.2 components-Arduino 文件夹下克隆 arduino-esp32 SDK

cd components-Arduino

git clone https://github.com/espressif/arduino-esp32.git

cd arduino-esp32

git submodule update --init --recursive

在这里插入图片描述

2.3 在工程目录下的 CmakeLists.txt 文件中增加 arduino-esp32 组件的路径

基于 esp-idf SDK 目录下增加 arduino-esp32 库作为组件,只需要在工程目录下的 CmakeLists.txt 文件中增加 arduino-esp32 组件的路径,如下:

set(EXTRA_COMPONENT_DIRS $ENV{IDF_PATH}/components-Arduino/arduino-esp32)

在这里插入图片描述

其他步骤与 1 完全相同


【说明】

  • 如果需要切换芯片环境,只需要在工程目录下运行如下指令:
 idf.py set-target esp32s3
  • 如果需要使用 ESP-IDF 中的 app_main() 来运行代码,并调用 Arduino 库的 API 函数,工程文件名必须是 main.cpp 。同时需要关闭 Autostart Arduino setup and loop on boot 配置选项,并使用 extern "C" void app_main() 来定义 app_main() , 例如如下测试代码:
#include "Arduino.h"

#include <stdio.h>
#include <inttypes.h>
#include "sdkconfig.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_chip_info.h"
#include "esp_flash.h"

#define RGB_BUILTIN 21

extern "C" void app_main()
{

      // ESP-IDF API Usage
 printf("Hello world!\n");

    /* Print chip information */
    esp_chip_info_t chip_info;
    uint32_t flash_size;
    esp_chip_info(&chip_info);
    printf("This is %s chip with %d CPU core(s), %s%s%s%s, ",
           CONFIG_IDF_TARGET,
           chip_info.cores,
           (chip_info.features & CHIP_FEATURE_WIFI_BGN) ? "WiFi/" : "",
           (chip_info.features & CHIP_FEATURE_BT) ? "BT" : "",
           (chip_info.features & CHIP_FEATURE_BLE) ? "BLE" : "",
           (chip_info.features & CHIP_FEATURE_IEEE802154) ? ", 802.15.4 (Zigbee/Thread)" : "");

    unsigned major_rev = chip_info.revision / 100;
    unsigned minor_rev = chip_info.revision % 100;
    printf("silicon revision v%d.%d, ", major_rev, minor_rev);
    if(esp_flash_get_size(NULL, &flash_size) != ESP_OK) {
        printf("Get flash size failed");
        return;
    }

    printf("%" PRIu32 "MB %s flash\n", flash_size / (uint32_t)(1024 * 1024),
           (chip_info.features & CHIP_FEATURE_EMB_FLASH) ? "embedded" : "external");

    printf("Minimum free heap size: %" PRIu32 " bytes\n", esp_get_minimum_free_heap_size());

    for (int i = 5; i >= 0; i--) {
        printf("Restarting in %d seconds...\n", i);
        vTaskDelay(1000 / portTICK_PERIOD_MS);
    }

    // Arduino-like setup()
  Serial.begin(115200);
   pinMode(RGB_BUILTIN, OUTPUT);
  Serial.printf("GPIO is %d \r\n", RGB_BUILTIN);
 
  // Arduino-like loop()
  while(true){
    #ifdef RGB_BUILTIN
  digitalWrite(RGB_BUILTIN, HIGH);
   Serial.printf("Light on \r\n ");
  delay(1000);
  
  digitalWrite(RGB_BUILTIN, LOW);   // Turn the RGB LED off
  Serial.printf("Light off \r\n");
  delay(1000);

#endif
    
    }

}
  • Arduino 中的 setup() 函数在 app_main() 中只需要调用一次,不需要 while(!Serial){} 循环
  • Arduino 中的 loop() 函数使用在 app_main() 中必须要使用 while(true){}while(1){} 无线循环
  • 固件运行日志:
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/720551.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

05、Nginx反向代理

一、网关、代理与反向代理&#xff1a; 在Nginx中&#xff0c;网关、代理和反向代理是三种常见的功能&#xff0c;用于转发和处理请求。下面是它们的简要介绍&#xff1a; 网关&#xff08;Gateway&#xff09;&#xff1a; 网关在网络通信中起到中介的作用&#xff0c;将客户…

【视觉SLAM入门】1. 基础知识,运动观测,旋转(旋转矩阵,轴角,欧拉角,四元数)和eigen库基础

"山薮藏疾" 1. 运动与观测1.1 通用运动方程1.2 通用观测方程1.3 对SLAM的认识 2. 三维运动2.1 旋转与平移2.2 变换矩阵2.3 矩阵知识补充2.4 旋转向量2.5 欧拉角2.6 四元数2.7 其他变换 3. 编程基础3.1 链接库说明3.2 eigen库 注&#xff1a; 以后的方程中如未说明&am…

面试官:一千万的数据,要怎么查?

一个老生常谈的问题&#xff0c;SELECT *和SELECT具体字段那个快&#xff1f;在数据量少的时候可能没什么差别&#xff0c;但是数据量达到千万级&#xff0c;差距就显现出来。废话不多说&#xff0c;往下看 ↓。 SELECT * 和 SELECT 具体字段的区别 在 MySQL 中&#xff0c;SE…

批量规范化

✨✨✨ 感谢优秀的你打开了小白的文章 “希望在看文章的你今天又进步了一点点&#xff0c;生活更加美好&#xff01;”&#x1f308;&#x1f308;&#x1f308; 目录 1.批量规范化基本原理 2.批量规范化的使用 2.1对于全连接层 2.2对于卷积层 3.代码实现 3.1方式一 …

26488-24-4,Cyclo(D-Phe-L-Pro),具有良好的生物相容性

资料编辑|陕西新研博美生物科技有限公司小编MISSwu​ 【产品描述】 Cyclo(D-Phe-L-Pro)环(D-苯丙氨酸-L-脯氨酸)&#xff0c;环二肽是由两个氨基酸通过肽键环合形成&#xff0c;是自然界中小的环状肽。由于其存在两个酰胺键即四个可以形成氢键的位点&#xff0c;环二肽可以在氢…

商业海外社交媒体营销10步指南 [2023]

如今&#xff0c;社交媒体是任何成功商业战略的重要组成部分。这不是奢侈品&#xff0c;而是必需品。全球有超过 36 亿人使用社交媒体&#xff0c;它是企业展示其产品和服务、建立品牌知名度以及与客户联系的数字游乐场。 但这不仅仅是娱乐和游戏。要在社交媒体上取得成功&…

Golang每日一练(leetDay0114) 矩阵中的最长递增路径、按要求补齐数组

目录 329. 矩阵中的最长递增路径 Longest Increasing Path In A Matrix &#x1f31f;&#x1f31f; 330. 按要求补齐数组 Patching Array &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Rust每日一练 专栏 Golang每日一练 专栏 Python每日…

数据结构--二叉树的性质

数据结构–二叉树的性质 二叉树常考性质 常见考点1: 设非空二叉树中度为0、1和2的结点个数分别为 n 0 、 n 1 和 n 2 &#xff0c;则 n 0 n 2 1 n_0、n_1和n_2&#xff0c;则n_0 n_2 1 n0​、n1​和n2​&#xff0c;则n0​n2​1 n 0 n 2 1 \color{red}n_0 n_2 1 n0​n2​…

图层中大型数据集的分块处理思路

图层中大型数据集的分块处理思路 为改善要素叠加工具&#xff08;如联合和相交&#xff09;的性能和可伸缩性&#xff0c;软件采用了称为自适应细分处理的运算逻辑。当可用的物理内存不足以对数据进行处理时&#xff0c;就会触发系统使用此逻辑。由于保持在物理内存的可用范围…

助力企业完成等保2.0的重要工具

在当今数字化时代&#xff0c;企业面临着越来越多的网络安全威胁和数据泄露风险。为了保护敏感信息和维护业务的连续性&#xff0c;许多企业正在积极采取措施来实施等保2.0标准。在这一过程中&#xff0c;EventLog Analyzer作为一种全面的安全信息与事件管理解决方案&#xff0…

swagger2word使用(将swagger2转化为word)

开源项目地址 https://github.com/JMCuixy/swagger2word 项目使用 1、项目拉下来以后先修改application.xml配置文件红框内容&#xff0c;将其修改为要换为自己swagger文档的地址 2、运行项目后输入地址http://127.0.0.1:8080/toWord 即可下载word文档

结构体和数据结构--共用体

共用体&#xff0c;也称联合&#xff08;Union&#xff09;&#xff0c;是将不同类型的数据组织在一起共同占用同一段内存的一种构造数据类型。共用体与结构体的类型声明方法类似&#xff0c;只是关键字变为了Union。 例题&#xff1a;演示共用体所占内存字节数的计算方法 #i…

如何用手机制作3D人物模型素材

3D人物模型素材是现代3D游戏和电影制作中必不可少的一部分。它们是数字艺术家和设计师们用来创造逼真世界的关键。3D人物模型素材是用计算机程序制作的虚拟人物&#xff0c;可以被用于电影、电视、游戏和虚拟现实应用中。它们可以被用来代替实际演员&#xff0c;也可以被用来创…

小程序蓝牙通信

蓝牙通信能力封装 一开始是根据uniapp提供的蓝牙api写的蓝牙方法&#xff0c;之后发现复用性&#xff0c;以及一些状态的监听存在缺陷&#xff0c;之后整理成了类。这样复用性以及状态监听的问题就解决了。 蓝牙组件 创建蓝牙组件的类 单例模式是为了保证蓝牙长连接&#xff0…

前端(一)——前端开发遇到的普遍问题以及解决策略

&#x1f604;博主&#xff1a;小猫娃来啦 &#x1f604;文章核心&#xff1a;前端开发遇到的普遍问题以及解决策略 前端十万个为什么&#xff1f; 有人说vue框架是基于mvvm实现的&#xff1f;这种说法对吗&#xff1f; mvc和mvvm的区别是什么&#xff1f; mvvm是否是mvc的升…

内容文本生成二维码用excel表格导出(java)

内容文本生成二维码用excel表格导出(java) //若有问题可留言 效果如下: import java.io.ByteArrayOutputStream; import java.io.FileOutputStream; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map;import org.apache.po…

大厂股权就是这么“坑”,150万股票到账前被优化,损失惨重

某网友发文称&#xff1a;“自己还有47天就可以解锁股权&#xff0c;到时就有150万的股票到账&#xff0c;结果接到公司裁员通知&#xff0c;实在是淌血&#xff0c;我能反抗吗&#xff1f;” 对这我只能说&#xff0c;公司卡的就是这个点。所以大家在找工作的时候&#xff0c;…

SparkJDBC性能优化指南

前言 本文以Mysql为例。Spark作为一种强大且广泛应用于大数据处理的分布式计算框架,有着出色的性能和可伸缩性。在使用Spark处理大规模数据时,往往需要与关系型数据库MySQL进行交互。然而,由于MySQL和Spark本身的特性之间存在一些差异,直接使用Spark读写MySQL的默认配置可…

SQL 查找重复的电子邮箱

SQL 182 查找重复的电子邮箱 SQL架构 表: Person -------------------- | Column Name | Type | -------------------- | id | int | | email | varchar | -------------------- id 是该表的主键列。 此表的每一行都包含一封电子邮件。电子邮件不包含大写字母。 编写一个 SQ…

线性DP-入门篇

目录 数字三角形&#xff1a; 最长上升子序列&#xff1a; 魔族密码&#xff1a; 编辑距离&#xff1a; 线性动态规划的主要特点是状态转移的推导是按照问题规模 从小到大依次推导&#xff0c;较大规模的问题的解依赖较小规模的问题的解。 数字三角形&#xff1a; [USA…