跳至内容
本页目录

实验:点亮 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-cli1.5.1工具链入口
arduino-esp32 core3.3.12sketch 编译所对的 SDK 版本
Adafruit_NeoPixel1.15.5LED 驱动,版本锁定

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-cli1.5.1arduino-cli 入口
arduino-esp32 core3.3.12Used platform 行:esp32:esp32 3.3.12
xtensa-esp-elf-gcc14.2.0(crosstool-NG esp-14.2.0_20260121)xtensa-esp32s3-elf-gcc --version
Adafruit NeoPixel1.15.5Used library 行
builtin ctags5.8-arduino11platform 构建依赖

命令(每个修订一条,构建路径分开):

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 大小RAMesp32-s3-blink-led.ino.bin SHA-256(前 16 位)
BOARD_REV=11(v1.1,LED 在 GPIO38)0289858 / 1310720 bytes (22%)22208 / 327680 (6%)3eb838864030eb06…
BOARD_REV=10(v1.0,LED 在 GPIO48)0289858 / 1310720 bytes (22%)22208 / 327680 (6%)89d1e4bac804483f…
BOARD_REV=99(负例对照)1——无产物

宏证据(修订常量真实驱动二进制,而不只是源码):

  • 两个修订产出不同的二进制(3eb83886… vs 89d1e4ba…)与不同 .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 驱动选择与修订注意事项全部来自板卡页上的固定官方来源。