实验:点亮 ESP32-S3-DevKitC-1 的 RGB LED
本实验通过 Adafruit NeoPixel 驱动点亮 ESP32-S3-DevKitC-1 的板载可寻址 RGB LED,所有版本固定,使编译可复现。若不确定自己的板卡修订,先读板卡识别指南:LED 的 GPIO 取决于修订。
本实验验证什么
- 板卡记录中的可寻址 RGB LED 接线事实(v1.1 在 GPIO38 / v1.0 在 GPIO48)——
digitalWrite()点不亮这个 LED,见板载 LED 为什么在 GPIO38 或 GPIO48。 - 固定工具链(下表 Arduino core + 驱动库版本)对 sketch 的 ESP32-S3 编译。
- 首烧路径:按首次连接指南经 USB 转 UART 口烧录。
固定版本
| 组件 | 版本 | 为什么固定 |
|---|---|---|
| 板卡 | ESP32-S3-DevKitC-1 | 实验从板卡记录读取 LED GPIO 事实 |
| 板卡修订 | v1.1(LED 在 GPIO38);BOARD_REV=10 选择 v1.0 接线(GPIO48) | 修订移动了 LED;两个常量都在 sketch 里 |
| 编译目标 | FQBN esp32:esp32:esp32s3(core 默认菜单值;blink sketch 不用 PSRAM 或非默认 flash 设置,因此二进制不绑定某个订购 SKU) | 精确陈述,不为所有 SKU 声称 |
| arduino-cli | 1.5.1 | 工具链入口 |
| arduino-esp32 core | 3.3.12 | sketch 编译所对的 SDK 版本 |
| Adafruit_NeoPixel | 1.15.5 | LED 驱动,版本锁定 |
Sketch
源码在仓库中:site/labs/esp32-s3-blink-led/esp32-s3-blink-led.ino。
#include <Adafruit_NeoPixel.h>
// The RGB LED GPIO moved between board revisions; both constants come from
// the official Espressif user guides pinned on the board page.
constexpr int LED_PIN_V1_0 = 48; // v1.0: GPIO48, J3 contact 16
constexpr int LED_PIN_V1_1 = 38; // v1.1: GPIO38, J3 contact 10
// Select your board revision: 10 for v1.0, 11 for v1.1.
#ifndef BOARD_REV
#define BOARD_REV 11
#endif
#if BOARD_REV == 10
constexpr int LED_PIN = LED_PIN_V1_0;
#elif BOARD_REV == 11
constexpr int LED_PIN = LED_PIN_V1_1;
#else
#error "BOARD_REV must be 10 (v1.0, GPIO48) or 11 (v1.1, GPIO38)"
#endif
constexpr int LED_COUNT = 1;
constexpr unsigned long BLINK_INTERVAL_MS = 800;
constexpr uint32_t COLOR_ORDER = NEO_GRB + NEO_KHZ800;
Adafruit_NeoPixel strip(LED_COUNT, LED_PIN, COLOR_ORDER);
const uint32_t COLORS[] = {
Adafruit_NeoPixel::Color(20, 0, 0), // dim red
Adafruit_NeoPixel::Color(0, 20, 0), // dim green
Adafruit_NeoPixel::Color(0, 0, 20), // dim blue
};
constexpr int COLOR_COUNT = sizeof(COLORS) / sizeof(COLORS[0]);
int colorIndex = 0;
bool ledOn = false;
unsigned long lastToggle = 0;
void setup() {
strip.begin();
strip.setBrightness(32);
strip.show(); // start dark: init state must be explicit, not assumed
}
void loop() {
unsigned long now = millis();
if (now - lastToggle < BLINK_INTERVAL_MS) {
return;
}
lastToggle = now;
ledOn = !ledOn;
if (ledOn) {
strip.setPixelColor(0, COLORS[colorIndex % COLOR_COUNT]);
colorIndex++;
} else {
strip.setPixelColor(0, 0); // explicit off
}
strip.show();
}仓库中的完整 sketch 还在头部注释里写明识别指南链接、工具链表和 WS2812/digitalWrite 注意事项。
编译与烧录
arduino-cli compile --fqbn esp32:esp32:esp32s3 site/labs/esp32-s3-blink-led
arduino-cli upload --fqbn esp32:esp32:esp32s3 -p /dev/<your-usb-serial-port> site/labs/esp32-s3-blink-led编译回执
2026-11-09 00:49 CST 用下表固定工具链编译;两个板卡修订在各自独立干净构建路径中编译,另有一次负例构建证明 BOARD_REV 宏真实到达 sketch。
实际使用的工具链(版本从构建读回,非假设):
| 组件 | 版本 | 证据 |
|---|---|---|
| arduino-cli | 1.5.1 | arduino-cli 入口 |
| arduino-esp32 core | 3.3.12 | Used platform 行:esp32:esp32 3.3.12 |
| xtensa-esp-elf-gcc | 14.2.0(crosstool-NG esp-14.2.0_20260121) | xtensa-esp32s3-elf-gcc --version |
| Adafruit NeoPixel | 1.15.5 | Used library 行 |
| builtin ctags | 5.8-arduino11 | platform 构建依赖 |
命令(每个修订一条,构建路径分开):
arduino-cli compile --fqbn esp32:esp32:esp32s3 \
--build-property "compiler.cpp.extra_flags=-DBOARD_REV=11" \
--build-path build/r11 site/labs/esp32-s3-blink-led
arduino-cli compile --fqbn esp32:esp32:esp32s3 \
--build-property "compiler.cpp.extra_flags=-DBOARD_REV=10" \
--build-path build/r10 site/labs/esp32-s3-blink-led结果:
| 构建 | 退出码 | Sketch 大小 | RAM | esp32-s3-blink-led.ino.bin SHA-256(前 16 位) |
|---|---|---|---|---|
BOARD_REV=11(v1.1,LED 在 GPIO38) | 0 | 289858 / 1310720 bytes (22%) | 22208 / 327680 (6%) | 3eb838864030eb06… |
BOARD_REV=10(v1.0,LED 在 GPIO48) | 0 | 289858 / 1310720 bytes (22%) | 22208 / 327680 (6%) | 89d1e4bac804483f… |
BOARD_REV=99(负例对照) | 1 | — | — | 无产物 |
宏证据(修订常量真实驱动二进制,而不只是源码):
- 两个修订产出不同的二进制(
3eb83886…vs89d1e4ba…)与不同.elf——LED 引脚常量(GPIO38 与 GPIO48)在编译输出中不同。 - 负例
-DBOARD_REV=99在 sketch 自己的守卫处构建失败:esp32-s3-blink-led.ino:37: error: #error "BOARD_REV must be 10 (v1.0, GPIO48) or 11 (v1.1, GPIO38)"——证明宏到达翻译单元。
状态:已用固定工具链编译,未烧录硬件
两个板卡修订都以上表固定版本干净编译——这是已验证的声明。未发生任何硬件烧录或板载观察:本环境未见过实体板上的闪烁结果,上面的 upload 命令仍是读者自己的步骤。LED GPIO 事实、可寻址 LED 驱动选择与修订注意事项全部来自板卡页上的固定官方来源。