在 ESP-IDF 中使用 Arduino 框架和Arduino的第三方库
ESP-IDF 是 Espressif 提供的官方开发框架,适用于其系列芯片(如 ESP32、ESP8266)。它提供了强大的底层功能,但学习曲线较陡。而 Arduino 框架则更加简洁易用,广受开发者欢迎。幸运的是,我们可以将 Arduino 框架 API 与 ESP-IDF 结合使用,既能享受 Arduino 的易用性,也能充分利用 ESP-IDF 的底层功能。
本篇博客将讲解如何在 ESP-IDF 中集成 Arduino 框架 API,并添加 Arduino 的第三方库,这样在开发过程中轻松使用这两者的优势。
也可直接从包含Arduino组件的模板创建新项目
在idf终端粘贴下面命令
idf.py create-project-from-example "espressif/arduino-esp32^3.0.2:hello_world"
一、在 ESP-IDF 中集成 Arduino 框架
1. 创建 ESP-IDF 项目并启用 Arduino 框架
在 ESP-IDF 中使用 Arduino 框架 API 需要进行一些设置。
步骤 1:创建一个 ESP-IDF 项目
我们先创建一个标准的IDf工程这里我起名esp_idf_to_arduino
步骤 2:添加 Arduino 组件
将 Arduino 作为 ESP-IDF 的组件使用,具体操作如下:
在项目目录下创建 components
文件夹,然后将 Arduino 库克隆到该目录中:
cd your_project_name
mkdir components
cd components
git clone https://github.com/espressif/arduino-esp32.git arduino
直接克隆文件大小太大,可能会失败,建议直接去github下载然后解压到components
文件夹内,要注意不同版本的 arduino-esp32 SDK 对应的 ESP-IDF SDK 版本不同,版本直接的对应关系在此处查看arduino-esp32
我使用的ESP-IDF版本为4.4.7所以这里我应该下载的arduino组件为2.0.16
步骤 3:修改menuconfig配置
对工程配置选项做修改,以适配arduino
修改 sdkconfig 文件中的 CONFIG_FREERTOS_HZ 配置为 1000, 默认是 100,从这里可见arduino 对应的task是1ms
3. 示例代码
arduino组件配置完成就,就开始写代码了
在IDF中使用arduino的api,首先要使用initArduino();
进行初始化
#include "Arduino.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_log.h"
extern "C" void app_main()
{
initArduino();
Serial.begin(115200);
while(!Serial){
//等待串口初始化完成
}
for(;;){
Serial.print("Hello ");
printf("World\n");
ESP_LOGI("TAG", "Hello arduino");
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
}
同样也可以使用 Arduino 风格代码
在终端 执行 idf.py menuconfig
指令进入工程配置选项界面,开启 Autostart Arduino setup and loop on boot 配置选项
这下就可以执行 Arduino 风格代码了
#include "Arduino.h"
void setup() {
pinMode(2, OUTPUT); // 设置 GPIO 2 为输出
}
void loop() {
digitalWrite(2, HIGH); // 点亮 LED
delay(1000); // 延时 1 秒
digitalWrite(2, LOW); // 关闭 LED
delay(1000); // 延时 1 秒
}
4. 编译和运行项目
-
配置目标设备(以 ESP32 为例):
idf.py set-target esp32
-
编译并烧写项目:
idf.py build idf.py flash
-
启动串口监视器查看输出:
idf.py monitor
二、在 ESP-IDF 中使用 Arduino 第三方库
Arduino 社区有大量的第三方库,可以大大简化开发工作。通过将这些库集成到 ESP-IDF 项目中,我们可以快速实现复杂功能。
1. 下载 Arduino 第三方库
你可以通过以下几种方式获取 Arduino 库:
- 从 Arduino Library Manager 搜索并下载。
- 访问 GitHub 或其他资源网站获取库。
假设我们使用 WS2812
库来点亮WS2812。
2 在 ESP-IDF 中使用 WS2812 库
WS2812 是一种广泛使用的 RGB LED 控制芯片,通过一个单线协议实现对多个 LED 灯的控制。许多 Arduino 开发者使用 FastLED
或 Adafruit NeoPixel
库来控制 WS2812。在 ESP-IDF 项目中,我们可以引入 Arduino 库来实现对 WS2812 灯带的控制。
1️⃣下载 WS2812 库
我们使用 Adafruit NeoPixel
库来控制 WS2812。你可以从 GitHub 下载库。
如果找不到库的地址,我们可以在arduino IDE上搜索,点击更多信息跳转到github仓库进行下载
2️⃣.将 WS2812 库添加到 ESP-IDF 项目中
- 创建库的目录
在项目的 components
目录下拉取Adafruit_NeoPixel库:
cd your_project_name/components
git clone https://github.com/adafruit/Adafruit_NeoPixel.git
- 配置
CMakeLists.txt
我们先来了解下arduino库的主要目录结构,一般会有以下两种
library_name/
├── src/ # 源代码文件夹
│ ├── library_name.cpp # 主源文件
│ └── library_name.h # 主头文件
├── examples/ # 示例代码文件夹
│ └── example/ # 示例项目
│ └── example.ino # 示例代码
├── keywords.txt # 关键字定义(用于语法高亮)
├── library.properties # 库属性文件(包含版本、依赖等信息)
└── README.md # 说明文档
对于没有src文件夹的Arduino库,源文件通常直接放在库的根目录下。这种情况下,库的结构可能如下
library_name/
├── library_name.cpp # 主源文件
├── library_name.h # 主头文件
├── additional_file.cpp # 其他源文件
├── examples/ # 示例代码文件夹
├── keywords.txt # 关键字定义
├── library.properties # 库属性文件
└── README.md # 说明文档
我们打开下载好的Adafruit_NeoPixel文件夹
可见这个目录结构属于第二种没有src文件夹的我们在Adafruit_NeoPixel
目录下创建CMakeLists.txt
idf_component_register(SRC_DIRS "."
INCLUDE_DIRS "."
REQUIRES arduino-esp32
)
如果是第一种目录结构使用下面这种
idf_component_register(SRC_DIRS "src"
INCLUDE_DIRS "src"
REQUIRES arduino-esp32
)
使用这两种cmake模板,基本可以实现大部分的arduino库了
重新编译项目: 使用 idf.py build
重新编译你的项目,确保所有新添加的库都能正确集成
⚠️如果编译失败,请清除构建后,在尝试
3️⃣使用 WS2812 库
- 在代码中包含 WS2812 库
在主程序文件 main.cpp
中引入 Adafruit_NeoPixel
库:
#include "Arduino.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_log.h"
#include <Adafruit_NeoPixel.h>
// 定义灯带引脚和 LED 数量
#define LED_PIN 4
#define LED_COUNT 16
Adafruit_NeoPixel strip(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);
extern "C" void app_main()
{
initArduino();
Serial.begin(115200);
while(!Serial){
//等待串口初始化完成
}
strip.begin();
strip.show(); // 初始化所有像素为"关"
for(;;){
// 设置所有 LED 为红色
for (int i = 0; i < LED_COUNT; i++) {
strip.setPixelColor(i, strip.Color(255, 0, 0)); // 红色
}
strip.show(); // 更新显示
delay(1000);
// 设置所有 LED 为绿色
for (int i = 0; i < LED_COUNT; i++) {
strip.setPixelColor(i, strip.Color(0, 255, 0)); // 绿色
}
strip.show();
delay(1000);
}
}
- 编译和运行
同样使用 idf.py build
编译项目,idf.py flash
将程序烧录到设备上。
总结
通过将 Arduino 框架 API 与 ESP-IDF 相结合,你可以简化开发工作,轻松使用 Arduino 的库和函数,同时享受 ESP-IDF 提供的强大功能。通过将 Arduino 的第三方库引入 ESP-IDF 项目,你还可以扩展项目的功能,快速实现复杂的硬件控制与数据处理。
无论你是想要简单的 Arduino 风格开发,还是需要 ESP-IDF 的底层控制和优化,这种结合都可以为你的 ESP32 项目带来更多灵活性与效率。