在 VSCode 中使用 PlatformIO 开发 ESP32

罗大富 BigRich大约 8 分钟ESP32Arduino

我们已经学会了 Arduino IDE 的基本使用了,这节课,我们来学习使用另一款软件进行 Arduino 开发,他就是 PlatformIO。

PlatformIO 是一个开源的跨平台的物联网(IoT)开发平台,用于嵌入式系统和物联网设备的开发。它提供了一个统一的开发环境和工具链,支持多种硬件平台(如 Arduino、ESP8266、ESP32、Raspberry Pi 等)和开发框架(如 Arduino 框架、ESP-IDF、STM32Cube等),使开发者可以更轻松地进行嵌入式开发。

PlatformIO 的主要特点和优势包括:

  1. 跨平台支持:可以在 Windows、Mac 和 Linux 等操作系统上运行,并支持多种开发板和处理器架构。
  2. 统一的开发环境:提供了集成开发环境(IDE)插件,如 VS Code、Clion 等,使开发者可以在一个统一的界面中进行代码编辑、编译、调试和上传。
  3. 库管理和依赖管理:内置了强大的库管理器,可以方便地搜索、安装和更新开源库,同时支持管理项目的依赖关系。
  4. 丰富的功能:支持代码自动完成、语法检查、固件升级、调试器、单元测试等功能,提供了全面的开发工具和功能。
  5. 强大的扩展性:可以通过插件系统扩展功能,支持自定义构建脚本、添加新的开发板和框架等。
  6. 社区支持:PlatformIO 拥有活跃的社区,开发者可以在社区中获取技术支持、交流经验和分享项目。

使用 PlatformIO 可以简化嵌入式开发的流程,提高开发效率,并使项目更易于管理和维护。无论是初学者还是有经验的嵌入式开发者,都可以受益于 PlatformIO 提供的功能和工具。

PlatformIO 只是一个插件,因此,我们需要先选择一个 IDE,在 IDE 中安装 PlatformIO 插件,这里我推荐一下两种:VSCode 与 Clion。具体该怎么选择呢?

  1. 如果你是经验丰富的程序员或者重度依赖 JetBrains 系列开发工具,建议使用 Clion;
  2. 如果你是初学者,且对 C/C++ 语言的认识仅停留在学习阶段,没有实战经验或商业项目,建议选择 VSCode,而且 VSCode 是免费。

为了照顾初学者,本套教程,使用 VSCode 安装 PlatformIO。

1. 安装 VSCode

前往 VSCode 官网 ,建议下载 System Installer 版本的安装包,该版本安装在非用户目录,例如 C 盘根目录。

下载完毕后进行安装,安装时建议按如下进行勾选。

安装完毕后打开软件,安装中文插件。

2. 安装 PlatformIO 插件

在 VSCode 中根据下图步骤安装 PlatformIO IDE 插件。

插件安装完毕后,VSCode 右下角会出现 PlatformIO 的下载进程,等待其下载完毕后即可。由于 PlatformIO 的服务器在国外,下载速度特别慢,耐心等待即可。

下载完毕后,PlatformIO 只下载了公共的数据包,没有下载特定板子的数据包,因此如需使用他人的工程,需依照该工程所用芯片新建一个工程,在第一次新建工程时,PlatformIO 会下载好该工程所需的文件。

假设需运行的工程所使用的芯片为 ESP32,使用的框架为 arduino,那么在第一次运行该工程前需先按照如下步骤新建一次工程,只有第一次需要,后续就可以直接运行了。

点击 VSCode 左下角的桌面图标。

点击 New Project,即可创建新项目。

设置项目的名称,选择开发板型号,开发框架以及项目路径。

点击 Finish 后,需要较长的一段时间,此阶段 PlatformIO 会下载该工程所需的文件,新建完成后,即可关闭此工程(直接关闭 VSCode 软件)。接着打开我们所需运行的工程即可(在工程路径下,鼠标右键后,选择通过 Code 打开)。

左下角的图标含义如图。

3. 如何使用 PlatformIO

当使用 PlatformIO 创建 ESP32 Arduino 项目时,项目目录的结构通常如下所示:

  1. .pio:该文件夹是 PlatformIO 的工作目录,包含编译生成的二进制文件、日志文件等。
  2. .vscode:如果你在 VSCode 中使用 PlatformIO 插件,该文件夹包含了与项目相关的配置文件,如任务配置、调试配置等。
  3. include:存放头文件。
  4. lib:该文件夹用于存放项目依赖的库文件。你可以通过 PlatformIO 的库管理器安装所需的库,并它们会自动下载到该文件夹。
  5. src:该文件夹是存放源代码的主目录。你的主要代码文件(通常是.cpp和.h文件)应放在这个目录下。
  6. test:用于存放项目的测试代码和测试数据。这个目录通常用于编写单元测试或集成测试的代码,用于验证项目的功能和逻辑是否正确。
  7. .gitignore:如果你使用版本控制系统如Git进行项目管理,你可以在这个文件中指定需要忽略的文件和文件夹。
  8. platformio.ini:这是 PlatformIO 的配置文件,用于指定项目的配置选项,如目标硬件平台、编译选项、上传设置等。

在 PlatformIO 创建的项目中,libinclude 目录都是用于存放代码文件的特定目录。它们的区别如下:

  • lib 目录:用于存放项目的依赖库文件。在这个目录下,可以放置项目需要引用的第三方库或自己编写的库。这些库文件通常是以源代码的形式提供,可以是单个文件或多个文件的集合。在构建过程中,这些库文件会被编译并链接到项目中。
  • include 目录:用于存放项目的头文件。头文件包含了函数、类、变量的声明,供其他源文件在编译时引用。在这个目录下,可以放置项目自定义的头文件,或者是一些需要被其他文件引用的第三方库的头文件。在编译过程中,编译器会在该目录下查找所需的头文件。

总结一下,lib 目录主要用于存放项目的依赖库文件,而 include 目录用于存放项目的头文件。这样的组织结构可以方便地管理项目所需的库文件和头文件,并在构建过程中正确引用和链接它们。

主要的代码,我们可以写在 main.cpp 中,src 目录下的 main.cpp 文件基本等同于 Arduino IDE 中创建的 .ino 文件。

只不过,在 main.cpp 文件的第一行需要 #include <Arduino.h>,其余的代码部分内容一致,我们可以直接把上节课读取串口输入的代码复制过来,但是不要忘了 #include <Arduino.h>

#include <Arduino.h>
#include <LiquidCrystal_I2C.h>


LiquidCrystal_I2C lcd(0x27, 16, 2); // set the LCD address to 0x27 for a 16 chars and 2 line display

void setup()
{
  lcd.init(); // initialize the lcd
  lcd.backlight();
  Serial.begin(9600);
}

void loop()
{
  // when characters arrive over the serial port...
  if (Serial.available())
  {
    // wait a bit for the entire message to arrive
    delay(100);
    // clear the screen
    lcd.clear();
    // read all the available characters
    while (Serial.available() > 0)
    {
      // display each character to the LCD
      lcd.write(Serial.read());
    }
  }
}

想要运行该程序,可以点击左下角的或者右上角的上传选项,或者使用快捷键 ctrl + alt + u

这时候,我们还没有导入 LiquidCrystal_I2C 库,所以,代码会运行失败,想要在 PlatformIO 中导入第三方库比 Arduino IDE 方便的多,我们可以打开 PlatformIO Home 页面,点击 libraries,输入我们想要导入的库名称,添加到项目中即可。

PlatformIO 还会非常贴心的给你一个使用示例,

所以,如果你想要使用 ESP32 在 Arduino 框架下实现一个稍微复杂一点的项目的话,Platform 是你最佳的选择。

上次编辑于:
贡献者: Luo