PlatformIO + Arduino 开发流程#
Standard Guide for ESP32 Development with PlatformIO in VS Code#
适用课程:物联网关键技术与应用(IoT Key Technologies and Applications)
开发平台:Espressif ESP32 (ESP-WROVER-KIT) · Arduino 框架
文档版本:V1.0 · 2025–2026 学年
目录#
一、开发环境概述#
本指南基于以下开发环境组合:
项目 |
说明 |
|---|---|
编辑器/IDE |
Visual Studio Code (VS Code) |
开发插件 |
PlatformIO IDE Extension |
硬件平台 (Platform) |
Espressif 32 ( |
框架 (Framework) |
Arduino |
开发板 (Board) |
Espressif ESP-WROVER-KIT ( |
MCU 芯片 |
ESP32 (Xtensa dual-core 240 MHz) |
编程语言 |
C / C++ (Arduino 风格) |
为什么选择 PlatformIO?
PlatformIO 是面向嵌入式开发的专业级开发平台,相比 Arduino IDE 具有以下优势:
专业代码编辑体验:基于 VS Code,支持智能补全(IntelliSense)、跳转定义、代码重构等功能。
多平台统一管理:一个工具支持 1000+ 种开发板,无需手动安装 Board Support Package。
依赖库自动管理:通过
platformio.ini声明依赖,自动下载并管理版本。集成调试器:支持 JTAG 硬件调试(ESP-WROVER-KIT 板载 FT2232HL 调试芯片)。
项目可移植性:
platformio.ini配置文件确保团队成员在不同电脑上获得一致的开发环境。
二、软件安装与配置#
2.1 安装 Visual Studio Code#
访问 VS Code 官方网站:https://code.visualstudio.com/
下载对应操作系统的安装包(Windows / macOS / Linux)。
按照安装向导完成安装,建议勾选以下选项:
✅ 将 “通过 Code 打开” 操作添加到文件/目录的右键菜单
✅ 将 Code 注册为受支持的文件类型的编辑器
✅ 添加到 PATH(自动配置系统环境变量)
2.2 安装 PlatformIO IDE 插件#
打开 VS Code,点击左侧边栏的 扩展 图标(或按
Ctrl+Shift+X)。在搜索框中输入
PlatformIO IDE。找到由 PlatformIO 官方发布的插件,点击 Install(安装)。
安装完成后,VS Code 左侧边栏会出现 PlatformIO 的小蚂蚁图标 🐜,底部状态栏也会出现 PlatformIO 的快捷工具栏(Home、Build、Upload、Serial Monitor 等按钮)。
首次安装需要等待:PlatformIO 会自动下载 PlatformIO Core(CLI 工具链),根据网络环境可能需要 5–15 分钟,请耐心等待底部状态栏提示安装完成。
💡 提示:如果安装过程中出现网络超时,可以配置国内镜像源。在 VS Code 设置中搜索
platformio-ide.customPATH,或在~/.platformio/目录下的platformio.ini全局配置中设置。
2.3 安装 USB 串口驱动#
ESP-WROVER-KIT 使用 FTDI FT2232HL 作为 USB 转串口/JTAG 芯片,通常需要安装对应驱动:
操作系统 |
驱动说明 |
|---|---|
Windows |
下载并安装 FTDI VCP 驱动:https://ftdichip.com/drivers/vcp-drivers/ |
macOS |
macOS 10.15+ 通常已内置 FTDI 驱动,若未识别可从 FTDI 官网下载 |
Linux |
内核通常已包含 |
安装驱动后,通过 USB 线连接 ESP-WROVER-KIT 到电脑,确认系统能识别到串口设备:
Windows:打开设备管理器 → 端口(COM 和 LPT)→ 应出现两个 COM 端口(一个用于串口通信,一个用于 JTAG 调试)。
macOS/Linux:终端执行
ls /dev/tty.usb*(macOS)或ls /dev/ttyUSB*(Linux),应出现对应设备节点。
三、创建 PlatformIO 项目#
3.1 通过 PlatformIO Home 创建项目#
在 VS Code 中点击左侧边栏的 PlatformIO 图标,或使用快捷键
Ctrl+Shift+P输入PlatformIO: Home打开 PlatformIO 主页。在 PlatformIO Home 页面中,点击 “New Project”(新建项目)。
填写项目参数:
参数 |
值 |
说明 |
|---|---|---|
Name |
|
项目名称,建议使用英文无空格 |
Board |
|
在下拉框中搜索 “wrover” 即可快速定位 |
Framework |
|
从下拉菜单中选择 Arduino |
Location |
自定义路径或默认 |
默认位于 |
点击 Finish 按钮,PlatformIO 会自动创建项目目录并下载所需的 Espressif 32 平台工具链和 Arduino 框架(首次创建可能需要较长时间)。
3.2 项目目录结构说明#
项目创建完成后,目录结构如下:
ESP32_Arduino_Demo/
├── .pio/ # PlatformIO 构建缓存(自动生成,无需手动修改)
│ └── build/
│ └── esp-wrover-kit/ # 编译输出目录(固件二进制文件)
├── .vscode/ # VS Code 配置(IntelliSense 路径等,自动生成)
│ ├── c_cpp_properties.json
│ ├── extensions.json
│ └── launch.json # 调试配置
├── include/ # 项目头文件目录(.h 文件)
│ └── README # 说明文件
├── lib/ # 项目私有库目录(自定义库)
│ └── README # 说明文件
├── src/ # 源代码目录 ★
│ └── main.cpp # 主程序文件(Arduino 入口)
├── test/ # 单元测试目录
│ └── README # 说明文件
├── platformio.ini # ★ PlatformIO 项目配置文件(核心)
└── .gitignore # Git 忽略规则
关键目录说明:
src/:所有源代码文件(.cpp、.c)放在此目录下,main.cpp是 Arduino 框架的入口文件,包含setup()和loop()函数。include/:项目级头文件(.h)放在此目录下,编译器会自动搜索。lib/:项目私有库,每个子目录作为一个独立库,拥有自己的源文件和头文件。platformio.ini:项目核心配置文件,定义平台、框架、开发板、依赖库、编译选项等。
3.3 platformio.ini 配置文件详解#
platformio.ini 是 PlatformIO 项目的核心配置文件,采用 INI 格式。以下是本项目的标准配置及逐行解析:
; ============================================================
; PlatformIO 项目配置文件
;
; 课程:物联网关键技术与应用
; 开发板:Espressif ESP-WROVER-KIT
; 框架:Arduino
; ============================================================
[env:esp-wrover-kit]
platform = espressif32
board = esp-wrover-kit
framework = arduino
; --- 串口配置 ---
monitor_speed = 115200 ; 串口监视器波特率,需与代码中 Serial.begin() 一致
upload_speed = 921600 ; 固件上传波特率(加快上传速度)
; --- 编译选项 ---
build_flags =
-D CORE_DEBUG_LEVEL=3 ; ESP32 日志级别:0=None, 1=Error, 2=Warn, 3=Info, 4=Debug, 5=Verbose
-D CONFIG_ARDUHAL_LOG_COLORS=1 ; 串口日志彩色输出
; --- 串口监视器选项 ---
monitor_filters =
esp32_exception_decoder ; 自动解析 ESP32 崩溃堆栈信息(Backtrace 解码)
colorize ; 串口输出彩色高亮
配置项详细说明:
配置项 |
值 |
说明 |
|---|---|---|
|
|
指定硬件平台为乐鑫 ESP32 系列 |
|
|
指定开发板型号,PlatformIO 据此自动配置 Flash 大小、分区表、PSRAM 等参数 |
|
|
使用 Arduino 框架(另一个选项是 |
|
|
串口监视器波特率,必须与代码中 |
|
|
固件上传(烧录)波特率,越高越快,ESP-WROVER-KIT 支持高波特率上传 |
|
|
编译时传递的预处理器宏定义 |
|
过滤器列表 |
串口监视器的输出处理插件 |
四、示例项目:ESP32 系统信息输出#
4.1 示例代码说明#
本示例程序用于验证开发环境搭建是否成功,功能包括:
在 ESP32 上电或复位时,通过串口打印芯片型号、修订版本、CPU 频率、Flash 容量、可用堆内存、SDK 版本等系统信息。
进入主循环后,每 2 秒打印一次计数器值、运行时间和当前可用堆内存。
该示例不依赖任何外部传感器或外设,仅通过 USB 串口即可观察输出,适合作为环境搭建后的第一个验证程序。
4.2 代码清单(main.cpp)#
将以下代码保存到项目的 src/main.cpp 文件中:
#include <Arduino.h>
void setup() {
Serial.begin(115200);
delay(1000); // 等待串口稳定
Serial.println("=== ESP32 Arduino Demo ===");
Serial.printf("Chip Model: %s\n", ESP.getChipModel());
Serial.printf("Chip Revision: %d\n", ESP.getChipRevision());
Serial.printf("CPU Freq: %d MHz\n", ESP.getCpuFreqMHz());
Serial.printf("Flash Size: %d bytes\n", ESP.getFlashChipSize());
Serial.printf("Free Heap: %d bytes\n", ESP.getFreeHeap());
Serial.printf("SDK Version: %s\n", ESP.getSdkVersion());
Serial.println("==========================");
}
void loop() {
static uint32_t count = 0;
Serial.printf("[%lu] Hello from ESP32! Uptime: %lu ms | Free Heap: %d bytes\n",
count++, millis(), ESP.getFreeHeap());
delay(2000);
}
4.3 代码逐行解析#
头文件引入:
#include <Arduino.h>
在 PlatformIO 的 Arduino 框架下,必须显式包含 <Arduino.h>。这一点与 Arduino IDE 不同 —— Arduino IDE 会在编译前自动为 .ino 文件插入该头文件,而 PlatformIO 使用标准 .cpp 文件,需要手动引入。Arduino.h 提供了 Serial、delay()、millis() 等 Arduino 核心 API 的声明。
setup() 函数 —— 初始化阶段:
Serial.begin(115200);
初始化串口通信,波特率设置为 115200 bps。此值需要与 platformio.ini 中的 monitor_speed 配置一致,否则串口监视器显示乱码。
delay(1000);
延时 1 秒,等待串口连接稳定。ESP32 上电后 USB 串口建立连接需要短暂时间,如果不等待,最初的几行输出可能丢失。
ESP.getChipModel() // 返回芯片型号字符串,如 "ESP32-D0WDQ6"
ESP.getChipRevision() // 返回芯片硅版本号(整数),如 1
ESP.getCpuFreqMHz() // 返回当前 CPU 时钟频率(MHz),如 240
ESP.getFlashChipSize() // 返回 Flash 芯片容量(字节),如 4194304 (4 MB)
ESP.getFreeHeap() // 返回当前可用堆内存(字节)
ESP.getSdkVersion() // 返回底层 ESP-IDF SDK 版本字符串
以上 API 均来自 Arduino-ESP32 核心库中的 Esp 类,用于在运行时获取硬件和固件信息。
loop() 函数 —— 主循环:
static uint32_t count = 0;
使用 static 局部变量作为计数器,在函数多次调用间保持值不丢失。
Serial.printf("[%lu] Hello from ESP32! Uptime: %lu ms | Free Heap: %d bytes\n",
count++, millis(), ESP.getFreeHeap());
Serial.printf() 是 ESP32 Arduino 核心提供的格式化输出函数(标准 Arduino 的 Serial 不支持 printf,这是 ESP32 扩展功能)。millis() 返回自上电以来的毫秒数。
delay(2000);
每次循环暂停 2 秒。在后续实验中会使用 FreeRTOS 的 vTaskDelay() 替代 delay(),以实现非阻塞延时。
五、编译与固件烧录#
5.1 编译项目(Build)#
操作方法(三选一):
底部工具栏:点击 VS Code 底部状态栏的 ✓(Build) 按钮。
快捷键:
Ctrl+Alt+B。命令面板:
Ctrl+Shift+P→ 输入PlatformIO: Build。
编译过程说明:
首次编译时,PlatformIO 会自动下载 ESP32 Arduino 核心库和交叉编译工具链
xtensa-esp32-elf-gcc,耗时较长(取决于网络速度)。编译成功后,终端会显示固件大小信息,类似如下输出:
RAM: [= ] 5.1% (used 16720 bytes from 327680 bytes)
Flash: [== ] 15.3% (used 200564 bytes from 1310720 bytes)
========================= [SUCCESS] Took 12.34 seconds =========================
编译产物位于
.pio/build/esp-wrover-kit/目录下,主要文件包括:firmware.bin:可直接烧录的固件二进制文件。firmware.elf:包含调试符号的 ELF 文件(用于 GDB 调试和堆栈解码)。
编译错误排查:
如果编译失败,请检查终端输出的错误信息,常见问题包括代码语法错误、缺少头文件、库依赖未安装等。PlatformIO 的错误信息通常会明确指出文件名和行号。
5.2 固件烧录(Upload)#
前提条件:
ESP-WROVER-KIT 已通过 USB 线连接到电脑。
USB 串口驱动已正确安装,系统可识别 COM 端口。
操作方法(三选一):
底部工具栏:点击 →(Upload) 按钮。
快捷键:
Ctrl+Alt+U。命令面板:
Ctrl+Shift+P→ 输入PlatformIO: Upload。
烧录过程说明:
PlatformIO 会自动检测 ESP32 连接的串口(如果有多个串口设备,可在
platformio.ini中通过upload_port指定)。烧录工具使用
esptool.py,会依次写入 Bootloader、分区表和应用固件。烧录成功后,终端输出类似:
Writing at 0x00010000... (100 %)
Wrote 200564 bytes (117432 compressed) at 0x00010000 in 2.6 seconds...
Hash of data verified.
Leaving...
Hard resetting via RTS pin...
========================= [SUCCESS] Took 8.56 seconds =========================
ESP32 会自动复位并开始运行新固件。
💡 提示:ESP-WROVER-KIT 板载自动下载电路(通过 DTR/RTS 信号),无需手动按住 BOOT 按钮即可进入烧录模式。如果使用其他 ESP32 开发板(如 ESP32-DevKitC),可能需要在烧录时手动按住 BOOT 按钮。
5.3 串口监视器(Serial Monitor)#
操作方法(三选一):
底部工具栏:点击 🔌(Serial Monitor) 按钮。
快捷键:
Ctrl+Alt+S。命令面板:
Ctrl+Shift+P→ 输入PlatformIO: Serial Monitor。
预期输出(示例):
=== ESP32 Arduino Demo ===
Chip Model: ESP32-D0WDQ6
Chip Revision: 1
CPU Freq: 240 MHz
Flash Size: 4194304 bytes
Free Heap: 298436 bytes
SDK Version: v4.4.7-dirty
==========================
[0] Hello from ESP32! Uptime: 1023 ms | Free Heap: 298436 bytes
[1] Hello from ESP32! Uptime: 3025 ms | Free Heap: 298436 bytes
[2] Hello from ESP32! Uptime: 5027 ms | Free Heap: 298436 bytes
...
串口监视器操作:
按
Ctrl+C退出监视器。如果显示乱码,请确认
monitor_speed与代码中Serial.begin()的波特率一致。按开发板上的 EN (Reset) 按钮可复位 ESP32,重新观察
setup()输出。
5.4 一键编译烧录监控#
PlatformIO 支持一条命令完成”编译 → 烧录 → 打开串口监视器”的完整流程:
命令面板:
Ctrl+Shift+P→ 输入PlatformIO: Upload and Monitor。CLI 命令:在 PlatformIO Terminal 中执行:
pio run -t upload --target monitor
此方式非常适合调试阶段的快速迭代。
六、常见问题排查#
Q1:PlatformIO 安装后无法识别插件 / 底部工具栏未出现#
解决方案:重启 VS Code;如果仍然不行,按 Ctrl+Shift+P 输入 PlatformIO: Rebuild IntelliSense Index 重建索引。确认 VS Code 版本不低于 1.70。
Q2:编译时报错 fatal error: Arduino.h: No such file or directory#
原因:Arduino 框架未正确下载。解决方案:打开 PlatformIO Terminal,执行 pio pkg update 更新平台和框架包。
Q3:上传失败,提示 A fatal error occurred: Failed to connect to ESP32#
可能原因与解决方案:
检查 USB 数据线是否为数据线(非纯充电线)。
确认串口驱动已正确安装。
如使用非 WROVER-KIT 的板子,尝试在点击 Upload 后按住 BOOT 按钮直到出现
Connecting...提示后松开。在
platformio.ini中手动指定端口:upload_port = COM3(Windows)或upload_port = /dev/ttyUSB0(Linux)。
Q4:串口监视器显示乱码#
解决方案:确认 platformio.ini 中 monitor_speed = 115200 与 Serial.begin(115200) 一致。ESP32 上电时 ROM Bootloader 会以 115200 波特率输出一段启动日志,这是正常现象。
Q5:编译速度非常慢#
解决方案:首次编译需要编译整个 Arduino 核心库,速度较慢属正常现象。后续增量编译会快很多。可以在 platformio.ini 中添加 board_build.partitions = min_spiffs.csv 减小 SPIFFS 分区以加快烧录速度。
Q6:代码中 #include 头文件出现红色波浪线(IntelliSense 报错但编译正常)#
解决方案:按 Ctrl+Shift+P 输入 PlatformIO: Rebuild IntelliSense Index,等待索引重建完成。
七、platformio.ini 进阶配置#
以下列出一些在后续实验中可能用到的进阶配置选项:
[env:esp-wrover-kit]
platform = espressif32
board = esp-wrover-kit
framework = arduino
; --- 指定平台版本(锁定版本,确保可复现性)---
platform_packages =
framework-arduinoespressif32 @ ^3.20014.231204 ; 锁定 Arduino-ESP32 核心版本
; --- 库依赖管理 ---
lib_deps =
knolleary/PubSubClient@^2.8 ; MQTT 客户端库(第 6 章实验)
adafruit/Adafruit Unified Sensor ; Adafruit 传感器统一接口
adafruit/DHT sensor library ; DHT22 温湿度传感器库(第 2 章实验)
claws/BH1750@^1.3.0 ; BH1750 光照传感器库(第 2 章实验)
; --- Flash 分区表 ---
board_build.partitions = default.csv ; 可选:min_spiffs.csv, no_ota.csv, huge_app.csv
; --- 上传端口(手动指定)---
; upload_port = COM3 ; Windows
; upload_port = /dev/ttyUSB0 ; Linux
; --- OTA 无线升级(第 10 章实验)---
; upload_protocol = espota
; upload_port = 192.168.1.100
; --- 文件系统(SPIFFS/LittleFS)---
; board_build.filesystem = littlefs
; --- 调试配置(ESP-WROVER-KIT 支持 JTAG 调试)---
; debug_tool = ftdi
; debug_init_break = tbreak setup
八、视频教程推荐#
以下为高质量中文视频教程资源,适合配合本指南进行学习:
PlatformIO 环境搭建与基础#
视频标题 |
平台 |
链接 |
|---|---|---|
《VSCode + PlatformIO 搭建 ESP32 开发环境》 |
Bilibili |
|
《PlatformIO 快速入门教程(ESP32 Arduino 开发)》 |
Bilibili |
|
《ESP32 开发从零开始 —— VS Code + PlatformIO 完整教程》 |
Bilibili |
ESP32 Arduino 开发进阶#
视频标题 |
平台 |
链接 |
|---|---|---|
《ESP32 物联网开发实战系列》—— 孤独的二进制 |
Bilibili |
|
《ESP32 Arduino 核心教程系列》—— 太极创客 |
Bilibili |
|
《乐鑫 ESP32 官方技术培训》 |
Bilibili / YouTube |
IoT 协议与云平台实践#
视频标题 |
平台 |
链接 |
|---|---|---|
《ESP32 MQTT 通信实战教程》 |
Bilibili |
|
《EMQX + Grafana + InfluxDB IoT 平台搭建》 |
Bilibili |
⚠️ 注意:视频链接可能随时间变化而失效,请在 Bilibili 等平台直接搜索关键词(如 “PlatformIO ESP32”、”VSCode ESP32 Arduino”)获取最新资源。
九、参考资料与文档#
9.1 官方文档#
资源 |
链接 |
说明 |
|---|---|---|
PlatformIO 官方文档 |
PlatformIO 全面使用文档 |
|
PlatformIO ESP32 平台页 |
https://docs.platformio.org/en/latest/platforms/espressif32.html |
ESP32 平台配置、支持的开发板列表 |
ESP-WROVER-KIT Board 配置 |
https://docs.platformio.org/en/latest/boards/espressif32/esp-wrover-kit.html |
开发板参数、引脚定义、调试配置 |
Arduino-ESP32 官方文档 |
https://docs.espressif.com/projects/arduino-esp32/en/latest/ |
乐鑫官方 Arduino 核心库文档 |
Arduino-ESP32 GitHub 仓库 |
源码、示例、Issue 讨论 |
|
ESP32 技术参考手册 |
https://www.espressif.com/sites/default/files/documentation/esp32_technical_reference_manual_cn.pdf |
芯片寄存器、外设技术细节(中文版) |
ESP-IDF 编程指南 |
https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/ |
底层 SDK 文档(Arduino-ESP32 基于此构建) |
ESP-WROVER-KIT 硬件设计指南 |
https://docs.espressif.com/projects/esp-dev-kits/en/latest/esp32/esp-wrover-kit/ |
开发板原理图、引脚分配、硬件特性 |
PlatformIO CLI 参考 |
https://docs.platformio.org/en/latest/core/userguide/index.html |
命令行工具完整参考 |
9.2 第三方优质技术资源#
资源 |
链接 |
说明 |
|---|---|---|
Random Nerd Tutorials (ESP32) |
优质英文 ESP32 教程网站,涵盖传感器、通信、云平台等大量实战项目 |
|
太极创客 ESP32 教程 |
中文 ESP32 Arduino 教程,适合入门 |
|
ESP32 开发指南 (Last Minute Engineers) |
英文,图文并茂的 ESP32 教程系列 |
|
Awesome ESP (GitHub) |
ESP32/ESP8266 优质资源合集 |
|
EMQX 官方文档 |
MQTT Broker 文档(中文),课程第 6、8 章实验参考 |
|
Home Assistant 官方文档 |
智能家居平台文档,课程第 12 章实验参考 |
|
InfluxDB 官方文档 |
时序数据库文档,课程第 8 章实验参考 |
|
Grafana 官方文档 |
数据可视化平台文档,课程第 8 章实验参考 |
附录 A:完整 platformio.ini 配置模板#
以下为本示例项目的完整配置文件,可直接复制使用:
; ============================================================
; PlatformIO Project Configuration File
;
; 课程:物联网关键技术与应用
; 项目:ESP32 Arduino Demo
; 开发板:Espressif ESP-WROVER-KIT
; ============================================================
[env:esp-wrover-kit]
platform = espressif32
board = esp-wrover-kit
framework = arduino
; --- 串口配置 ---
monitor_speed = 115200
upload_speed = 921600
; --- 编译选项 ---
build_flags =
-D CORE_DEBUG_LEVEL=3
-D CONFIG_ARDUHAL_LOG_COLORS=1
; --- 串口监视器过滤器 ---
monitor_filters =
esp32_exception_decoder
colorize
附录 B: PlatformIO CLI 常用命令速查#
在 VS Code 内置终端或 PlatformIO Terminal 中执行以下命令:
命令 |
功能说明 |
|---|---|
|
编译项目 |
|
编译并上传固件 |
|
打开串口监视器 |
|
编译上传后自动打开监视器 |
|
清理编译缓存 |
|
列出当前项目已安装的依赖包 |
|
更新所有依赖包 |
|
安装指定库 |
|
列出所有支持的 ESP32 开发板 |
|
在浏览器中打开 PlatformIO Home |
|
列出当前连接的串口设备 |
文档编制说明:本指南基于 PlatformIO 官方文档(docs.platformio.org)、乐鑫 Arduino-ESP32 官方文档(docs.espressif.com)及 ESP-WROVER-KIT 硬件设计指南编写。如有更新请以官方文档为准。