第一次拿到ESP32-S3-WROOM这块模组的时候,我其实是有点懵的:引脚多到让人眼花,板子上还藏着一颗小小的RGB灯,官方文档虽然详尽但新手根本不知道从哪看起。后来我用Arduino IDE把这块板子点亮、连上WiFi、再从串口里把调试信息一行行打印出来,整个过程走通也就花了一个多小时。这篇文章就是按我当时踩通的路径来写的,从硬件选型、环境搭建、GPIO点亮第一颗灯,到串口调试里的各种细节,全部是实测过的经验,希望能帮你少走点弯路。
这块板子比较适合两类人:一是以前玩过Arduino Uno、ESP8266的老朋友,想升级到带WiFi加蓝牙、性能更强的平台;二是做物联网原型验证的开发者,想在几天内把想法跑通而不是纠结底层寄存器。我会尽量把每个步骤里“为什么这么做”也讲清楚,毕竟光能复制代码不算会,知道背后的逻辑才是真玩转。
1. 先搞清楚ESP32-S3-WROOM是块什么样的板子
1.1 为什么选S3而不是老款ESP32
很多人问我,现在ESP32系列芯片一大堆,ESP32、ESP32-S2、ESP32-S3、ESP32-C3,到底选哪个?如果从Arduino开发的角度来挑,ESP32-S3是我目前最推荐的选择。
和经典ESP32相比,S3最大的变化是换成了双核Xtensa LX7架构,主频最高能到240MHz,内置512KB SRAM,比老ESP32的320KB SRAM大了不少。这意味着你在写复杂逻辑、跑大数组、做RTOS任务调度时,内存压力会小很多。我试过在老ESP32上同时跑WiFi、HTTP Server和一块ST7789屏幕,经常因为内存不足崩掉,换成S3之后再没遇到过这种问题。
另外S3还增加了一个对Arduino玩家非常友好的特性:原生USB。板子上的USB口可以直接当串口用,也可以模拟成键盘鼠标(USB HID),实测下来在开发环境调试阶段方便不少。而老ESP32的USB只是供电,串口必须依赖外部的USB转TTL芯片。S3还带向量指令集加速,虽然Arduino环境里很少直接用到,但跑一些轻量级机器学习推理的时候,性能确实比老ESP32高一截。
1.2 板级细节与外设速览
ESP32-S3-WROOM是乐鑫官方推出的模组,型号里的WROOM通常指带板载天线的封装。市面上常见的开发板是把这颗模组和USB转串口芯片、稳压电路、LED整合在一块小板上,插上Type-C线就能用。
硬件参数不用死记,但有几条建议先了解:
- 双核240MHz LX7处理器,内置512KB SRAM和8MB PSRAM(部分模组型号带PSRAM,买的时候注意看丝印)
- 2.4GHz WiFi 802.11 b/g/n,蓝牙BLE 5,不支持5GHz WiFi
- 引脚丰富,大部分GPIO可以复用为UART、SPI、I2C、PWM、ADC
- 部分引脚是Strapping引脚,比如GPIO0、GPIO3、GPIO46,上电时的电平状态会影响启动模式,外接电路时要谨慎
哪怕你已经很熟悉Arduino Uno,面对S3这颗芯片也要有个心理准备:它不是简单的“5V逻辑单片机”,而是跑在3.3V电平下的WiFi SoC。给传感器供电、接外设时,一定要记得电平匹配,不然容易烧引脚。
1.3 动手之前需要准备的硬件
别小看准备工作,我见过不少朋友拿到板子后发现没法用,原因常常不是板子坏了,而是线材不对。这里列一份清单:
- 一块ESP32-S3-WROOM开发板,优先选带串口芯片的版本(比如CP2102或CH340),调试起来省心很多
- 一根Type-C数据线,注意必须支持数据传输,很多充电线只能供电不能传数据,插上去电脑毫无反应
- 几根杜邦线,后续扩展传感器或者外设时会用到
- 一个面包板和几颗LED、电阻,用来做点亮实验
尤其要强调Type-C数据线这个坑。我工作室抽屉里翻出来的大半Type-C线都是纯充电线,插上开发板后设备管理器一片空白,我还一度以为是驱动问题,最后换了根线瞬间解决。所以你拿到板子第一件事,就是确认电脑能否正确识别到一个新的COM口。
2. Arduino IDE环境搭建:从安装到板包配置
2.1 安装Arduino IDE并配置ESP32板包
Arduino IDE 2.x是目前推荐使用的版本,相比老版1.8,编辑体验、自动补全、串口监视器都有了明显提升。去Arduino官网下载对应系统版本,安装过程一路默认就行,两个版本都可以用,但建议直接上2.x。
打开IDE之后,先别急着写代码,第一步是配置ESP32开发板支持包。因为Arduino IDE默认只支持自家AVR、ARM等系列板子,要支持ESP32-S3,需要手动添加“附加开发板管理器地址”。
具体操作路径:
- 打开Arduino IDE,进入“文件” -> “首选项”
- 找到“附加开发板管理器网址”,填入以下地址:
https://espressif.github.io/arduino-esp32/package_esp32_index.json- 点击“确定”,然后打开“工具” -> “开发板” -> “开发板管理器”
- 在搜索框输入“esp32”,找到“esp32 by Espressif Systems”,点击“安装”
板包体积比较大,实测可能需要一段时间下载。如果网速很慢,可以参考下面我用的离线安装办法:直接用浏览器下载官方板包压缩包,手动解压到Arduino的hardware目录里,效果和在线安装完全一样。装完之后,重启IDE,这时候“开发板”菜单下就能看到ESP32系列了。
2.2 选对开发板型号:ESP32S3 Dev Module
配置完支持包之后,在“工具” -> “开发板”里找到“ESP32 Arduino”分组,然后选择“ESP32S3 Dev Module”。这个选项是通用选项,适用于绝大多数以ESP32-S3-WROOM为核心的开发板。
接下来是几个关键设置,直接影响烧录和运行:
- USB CDC On Boot:建议选“Enabled”。这样板子的原生USB可以直接当作串口来用,不需要外接USB转串口芯片。但要注意,启用后烧录时板子可能不会自动进入下载模式,需要手动按住BOOT键操作,这点后面详细讲。
- Upload Speed:默认921600就行,如果烧录老失败,改成115200试试,稳定性会好很多。
- Flash Size:根据你板子实际Flash大小选择,常见的是4MB或8MB,选错一般也能跑,但会影响存储分区的分配。
- Port:务必确认选中了正确的COM口,Windows下可以在设备管理器里查看“端口(COM和LPT)”下的设备。
这里的BOOT按键技巧值得单独拿出来说:如果你的板子在点击“上传”后一直卡在“Connecting...”,或者报错“No serial data received”,多半是芯片没有进入下载模式。最稳的办法是:按住板子上的BOOT键不放,点击上传,看到“Connecting...”出现后,另一只手快速按一下EN/RST复位键并松开,然后再松开BOOT键。实测这个“先按住BOOT,再点上传,中途按一下RST,最后松开BOOT”的操作顺序成功率最高。
2.3 驱动与端口识别:板子插上电脑没反应
插上开发板后,如果电脑完全没有反应,或者在设备管理器里看到一个带黄色感叹号的未知设备,大概率是USB转串口驱动没装好。
常见芯片对应的驱动:
- CP2102/CP2104:去Silicon Labs官网下载最新的CP210x驱动
- CH340:去芯片厂商官网或驱动站下载CH340驱动,这是国产芯片,驱动安装要注意区分32位和64位系统
装完驱动后重新拔插USB线,正常情况下设备管理器里会多出一个COM口。如果你看到的是“USB JTAG/serial debug unit”,说明S3的原生USB已经被识别了,这也可以当串口用,但和板载USB转串口芯片是两个不同端口。
这里分享一个区分技巧:板载USB转串口芯片驱动的设备名通常会包含“CP2102”或“CH340”字样,而原生USB枚举出来的设备名通常是“USB JTAG/serial debug unit”。如果你板子上两种方式都支持,优先用板载串口芯片那个端口烧录,兼容性更好。
3. 第一个程序:点亮LED并搞懂GPIO映射
3.1 最小代码结构:setup与loop里发生了什么
Arduino的程序结构对新手来说非常友好,只有两个核心函数:setup()和loop()。setup()在芯片上电后只会执行一次,一般用来初始化引脚模式、串口波特率、连接WiFi等一次性操作。loop()会反复循环执行,里面放主逻辑。
理解这两个函数是玩转ESP32-S3的第一步,因为很多问题都出在“该初始化的事放到loop里每次重复做”这种低级错误上。比如把WiFi.begin()放在loop里,就会导致反复重连、日志刷屏;而把串口波特率设置放在loop里,则可能让串口输出乱码甚至卡死。
先来看一个NodeMCU-ESP32-S3开发板的上手程序,功能是让板载RGB灯循环显示红绿蓝三色:
#define RGB_PIN 48 // 根据你板载WS2812实际连接的引脚修改 #include <Adafruit_NeoPixel.h> Adafruit_NeoPixel pixels(1, RGB_PIN, NEO_GRB + NEO_KHZ800); void setup() { Serial.begin(115200); pixels.begin(); Serial.println("RGB LED test start"); } void loop() { pixels.setPixelColor(0, pixels.Color(255, 0, 0)); pixels.show(); delay(1000); pixels.setPixelColor(0, pixels.Color(0, 255, 0)); pixels.show(); delay(1000); pixels.setPixelColor(0, pixels.Color(0, 0, 255)); pixels.show(); delay(1000); }这里面有几个关键点:
- 我用了Adafruit_NeoPixel库来控制RGB灯,因为大多数ESP32-S3开发板上的彩色LED其实是一颗WS2812可编程灯珠,不是普通LED,不能直接用digitalWrite控制
- 不同厂家开发板的灯珠引脚不一样,有些是GPIO48,有些是GPIO40或GPIO38,最好查一下自己板子的原理图
- 如果只是点亮一颗普通LED,直接把LED阳极接到限流电阻再接到GPIO脚即可
3.2 基于Arduino框架的GPIO操作与注意事项
ESP32-S3的GPIO操作和Arduino Uno非常像,pinMode()、digitalWrite()、digitalRead()这些函数都可以直接用。但有几条S3特有的坑,我实测都踩过:
第一条是关于3.3V电平。ESP32-S3的GPIO不支持5V输入,如果外接5V传感器,输出端一定要做电平转换,不然轻则读数错误,重则直接烧毁引脚。
第二条是Strapping引脚的限制。GPIO0、GPIO3、GPIO46在芯片上电时会采样电平状态来决定启动模式。如果你把设备直接接在这几个引脚上,可能在复位时导致芯片进入错误的启动流程。更稳妥的做法是:需要外接按键或开关时,优先选择非Strapping引脚,比如GPIO4、GPIO5、GPIO6等。
第三条是ADC的精度问题。S3的ADC是12位的,参考电压可配置,但实际采集时噪声比较大。如果拿它来做高精度电压测量,建议用外部ADC芯片,或者至少对采集值做多次平均滤波。
我们来看一个用串口打印模拟电压值的例子,这个程序同时也能帮你验证串口调试环境:
#define BATTERY_PIN 4 void setup() { Serial.begin(115200); pinMode(BATTERY_PIN, INPUT); } void loop() { int raw = analogRead(BATTERY_PIN); float voltage = raw * 3.3 / 4095.0; Serial.print("Battery raw: "); Serial.print(raw); Serial.print(" voltage: "); Serial.println(voltage); delay(500); }这里有一个细节容易被忽略:analogRead返回的是0到4095之间的原始值,转换公式里的参考电压必须和实际ADC参考电压一致。如果你用的是外部参考电压,公式里的3.3也要改成对应值,否则算出来的电压永远是错的。
3.3 烧录失败的几个高频原因
我见过很多新手上手时卡在同样的几个问题上,这里直接排雷:
- 端口未选中: 上传前没在“工具” -> “端口”里选对COM口,IDE会一直提示找不到设备。注意拔插USB线后端口名可能会变化,每次插线后都要重新确认。
- Boot模式没进: 出现
A fatal error occurred: Failed to connect to ESP32-S3时,优先尝试上面提到的BOOT+RST组合操作。 - 线材问题: 如果经常一半卡死,或者烧录到一半失败,先排除USB线是否只能供电不能传数据。
- 波特率过高: 有些开发板或USB转串口芯片在921600下不稳定,把“Upload Speed”改成115200往往能解决。
- USB CDC On Boot设置不一致: 开启USB CDC后,串口监视器里会多一个端口,烧录用的端口和监视器用的端口可能是同一个也可能不是,容易搞混。最省心的做法是烧录和监视时都看着同一个端口。
4. 串口调试技巧:从打印日志到与上位机对话
4.1 Arduino IDE串口监视器要怎么用才不踩坑
串口是嵌入式开发最重要的调试手段,没有之一。不管板子运行得正不正常,先让它把状态打印出来,问题就能缩小一半。
Arduino IDE的串口监视器入口在“工具” -> “串口监视器”,或者直接点击右上角的放大镜图标。打开之后有三个关键设置:
- 波特率:必须和代码里
Serial.begin()设置的波特率一致。代码里如果写的是115200,监视器里就必须选115200,否则打印出来的全是乱码。 - 行尾结束符:如果你用串口监视器向上位机发送数据,右下角的行尾选择会决定发送时是否附带换行符。程序里用
Serial.readStringUntil('\n')接收时,这里要选“换行”或“换行和回车”。 - 自动滚动:当打印内容较多时,建议关闭自动滚动,方便回看历史记录。
串口监视器最常见的问题就是乱码。除了波特率不一致之外,中文乱码也很常见。Arduino IDE的串口监视器默认以UTF-8编码显示,如果你的代码源文件保存编码不对,或者串口助手用一种编码接收、另一种编码显示,中文就会变成乱码。最省心的做法是:调试日志全部用英文或拼音,中文只在需要给用户看的信息里用。
另外建议在每次开机初始化时,在setup()里打印一行启动信息:
Serial.begin(115200); Serial.println("[BOOT] ESP32-S3 start, free heap: " + String(ESP.getFreeHeap()));这样每次打开串口时,通过有没有打印这行就能快速判断芯片是否正常运行、内存还够不够用。
4.2 串口调试助手选型与基础使用
Arduino IDE自带串口监视器虽然方便,但功能比较基础。当你需要发十六进制数据、定时发送、打开多个端口、观察带时间戳的日志时,第三方串口调试助手会更顺手。
我常用并且推荐的工具主要有三个:
- SSCOM:老牌串口调试助手,支持中英文收发、文件发送、定时发送,功能稳定,很多单片机工程师桌面上常年挂着它。
- XCOM:界面简洁,支持十六进制和字符串双模式收发,打开速度快,适合快速测试。
- COMTool:跨平台,支持Python扩展,还能显示波形图。如果你要做传感器曲线可视化调试,这个工具很好用。
选型建议:Windows下日常调试用SSCOM或XCOM都行;如果要在Mac或Linux上调试,优先用COMTool。不要贪多,一个工具用熟就好。
使用串口调试助手时,连接参数一般选择“115200,8,N,1”,意思是波特率115200、数据位8、无校验、停止位1。这是绝大多数串口设备默认的配置,ESP32这边也是。
这里分享一个很实用的调试场景:让ESP32-S3通过串口接收上位机指令。比如电脑端的串口助手发送?temp,板子收到之后返回当前温度值。这样的主从结构在实际项目中很常用,代码也很简单:
void loop() { if (Serial.available()) { String command = Serial.readStringUntil('\n'); command.trim(); if (command == "?temp") { Serial.println("current temp = 25.6C"); } else { Serial.println("unknown command"); } } }注意代码里的trim()是用来去掉字符串结尾的换行符和回车符的,不然你明明发的?temp,因为带了\r\n,程序判断相等时会失败。这个细节我当年排查了很久才搞明白。
4.3 乱码、无法打开串口、数据丢帧:排查实录
串口调试过程中最常见的问题,我按实际出现频率整理成一张速查表:
| 现象 | 常见原因 | 处理方法 |
|---|---|---|
| 输出全是乱码 | 波特率不一致 | 确保Serial.begin()与监视器/助手选择一致 |
| 中文输出乱码 | 编码不匹配 | 日志用英文,或用支持UTF-8的串口助手 |
| 串口被占用无法打开 | 上次未关闭端口或别的软件占用 | 关闭所有占用端口的程序后重试,或者重启IDE |
| 上传成功但没输出 | USB CDC On Boot导致串口映射不同 | 尝试打开另一个端口,或在工具里把USB CDC改为Disabled再试 |
| 数据偶尔丢帧 | 波特率过高或上位机处理太慢 | 降低波特率,或者用缓冲区积累数据后再批量打印 |
| 板子上电后反复重启 | GPIO冲突或电源供电不足 | 断开可疑外设,换一根短粗的USB线或外接电源 |
有一次我在调试一个温湿度传感器时,发现串口打印的数据每隔几秒就跳一次乱码,检查半天发现是杜邦线接触不良,传感器供电时断时续。这类硬件问题在洞洞板和面包板场景下特别常见,排查时先用万用表量一下供电电压是否稳定,再逐步排查代码逻辑。
4.4 用Serial Plotter把日志画成波形
Arduino IDE 2.x自带了一个被很多人忽略的功能:串口绘图器(Serial Plotter)。它可以把串口输出的数据实时画成曲线,用来调试传感器数值变化、PID输出、电机转速等连续变量非常直观。
使用方式很简单:代码里用Serial.println()输出一个数值,或者用逗号分隔输出多个数值,比如:
Serial.print(sensorValue); Serial.print(","); Serial.println(pwmOutput);然后打开“工具” -> “串口绘图器”,选择同样的波特率,就能看到两条动态曲线。这个功能比盯着串口滚动数字直观得多,尤其在调试PID参数时,调节Kp、Ki、Kd的变化会直接反映在波形上。
我实测下来,串口绘图器在数据量不大时表现很好,但如果每秒打印几百行,绘图会明显卡顿。需要高频采样的时候,更推荐用COMTool自带的绘图功能,它会稳定很多。
5. 让板子联网:WiFi连接与HTTP请求实战
5.1 WiFi连接:让板子“上线”
ESP32-S3的核心能力是无线连接,ARDUINO环境下连接WiFi比原生ESP-IDF要简单太多。直接用官方WiFi库即可,不需要额外安装。
一个最简连接示例:
#include <WiFi.h> const char* ssid = "your_wifi_ssid"; const char* password = "your_wifi_password"; void setup() { Serial.begin(115200); WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); Serial.print("[WiFi] Connecting"); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(); Serial.print("[WiFi] Connected, IP: "); Serial.println(WiFi.localIP()); } void loop() { delay(1000); }这里有一个新手容易犯的错:把WiFi连接写在loop里。WiFi连接是一次性行为,放在loop里会导致反复断开重连。另外,连接超时时间也值得注意,如果WiFi信号弱,WiFi.begin()之后的while循环可能会一直等下去。建议加一个超时机制:
int retry = 0; while (WiFi.status() != WL_CONNECTED && retry < 30) { delay(1000); retry++; } if (WiFi.status() != WL_CONNECTED) { Serial.println("[WiFi] Connect timeout"); } else { Serial.println("[WiFi] Connected"); }这样即使连不上,板子也不会卡死在连接流程里,后续代码还能继续执行。
5.2 一个简单的HTTP GET请求示例
连上WiFi之后,下一步自然是请求网络数据。拿一个不需要鉴权的HTTP接口举例,比如获取当前时间或天气信息。
使用HTTPClient库可以简化请求流程:
#include <WiFi.h> #include <HTTPClient.h> void setup() { Serial.begin(115200); WiFi.mode(WIFI_STA); WiFi.begin("your_wifi_ssid", "your_wifi_password"); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(); } void loop() { if (WiFi.status() == WL_CONNECTED) { HTTPClient http; http.begin("http://worldtimeapi.org/api/ip"); int httpCode = http.GET(); if (httpCode > 0) { Serial.println(http.getString()); } else { Serial.printf("[HTTP] Request failed, error: %s\n", http.errorToString(httpCode).c_str()); } http.end(); } delay(10000); }几点注意:
- 上面这个接口是HTTP明文请求,如果是HTTPS接口,则需要处理证书验证,建议开发阶段先用HTTP,后续再补TLS配置
http.end()一定要调用,用来释放连接资源,否则长时间运行会出现内存泄漏- 请求频率不要太快,很多公开接口有频率限制,每10秒请求一次足够用了
实际项目里,你往往需要从JSON响应里解析字段,可以引入ArduinoJson库。软件包管理器的搜索框里输入“ArduinoJson”安装,然后配合deserializeJson()解析。这个库是全平台通用的,ESP32-S3上跑起来毫无压力。
5.3 内存与功耗贴士
ESP32-S3虽然比老ESP32内存大,但也不是无限用。WiFi协议栈、TLS加密、HTTP请求都会消耗大量内存,尤其是当你开了多个客户端连接时。
我用过一段时间之后总结了几个内存优化建议:
- 大字符串常量用
PROGMEM放到Flash里,不要全部堆在SRAM - HTTP响应体很大时,用
Stream方式逐段读取,而不是一次性getString()存到String对象里 - 用
ESP.getFreeHeap()打印剩余堆内存,观察一段时间内的趋势,如果持续下降,多半存在内存泄漏
功耗方面,S3支持多种休眠模式,但Arduino默认没有启用。如果项目要电池供电,可以在空闲时调用esp_light_sleep_start()让芯片进入浅睡眠,唤醒后继续执行。实际测试中,浅睡眠能把电流从几十毫安降到几毫安,续航能提升一个量级。不过睡眠期间串口会断,调试时先别开省电功能。
6. 常见问题与排查技巧实录:一张速查表
这里的“常见问题”我从自己的实操中整理出来,不说教科书式理论,只讲我亲身踩过的坑和验证过的解法。
| 问题 | 现象 | 我试过有效的方法 |
|---|---|---|
| 板子插上没新COM口 | USB设备管理器里看不到设备 | 先换数据线,再装CP2102/CH340驱动 |
| 烧录卡在“Connecting...” | 无法进入下载模式 | 按住BOOT,点上传,按一下RST再松开BOOT |
| 烧录成功但串口没输出 | 串口监视器一片空白 | 检查USB CDC On Boot,切换串口端口 |
| WiFi连不上 | 反复打印“Connecting...” | 确认密码和SSID,检查2.4GHz频段(不支持5G) |
| 串口中文乱码 | 中文显示为“??????” | 日志改英文输出,或用UTF-8编码的串口助手 |
| 外接传感器读数不准 | ADC值跳变厉害 | 在analogRead前加延时,多次采样取平均 |
| 板子跑着跑着自动重启 | 反复打印Boot信息 | 检查电源电流,确认GPIO没有短路或冲突 |
| 代码编译报错“No such file or directory” | 缺库 | 在库管理器里搜索并安装对应库 |
再单独讲一个高频坑:使用板载RGB灯的时候,如果忘记安装Adafruit_NeoPixel库,编译会直接报错。安装之后如果灯还是不亮,优先检查RGB引脚号,不同开发板的引脚差异很大。我手头三块ESP32-S3开发板,灯珠引脚分别是GPIO48、GPIO40和GPIO38,代码里写死引脚的话换块板子就废了。建议把引脚定义单独抽成一个宏,方便改。
另外还有一点是关于开发板型号的选择。如果你用的是类似合宙ESP32-S3、AirM2M等型号,工具菜单里的开发板名可能显示为别的选项,但只要核心是ESP32-S3,选“ESP32S3 Dev Module”一般都能正常工作。关键是把“USB CDC On Boot”和“Flash Size”这两个参数设置对,比纠结开发板名称更重要。
最后再分享一个串口调试的小技巧
串口调试这件事,设备端代码写得好不好,直接影响排查效率。我自己的习惯是:所有日志输出都带前缀标签,比如[WiFi]、[HTTP]、[SENSOR],这样刷屏时能快速过滤出关键信息。同时在关键事件点打印内存余量、时间戳或状态码,而不是单纯打印一句“OK”。
还有一个特别实用的小技巧:在调试阶段用Serial.println()打印出所有关键变量的值和单位,等程序稳定后再统一清理或加条件编译开关。比如这样:
#define DEBUG_ENABLE 1 #if DEBUG_ENABLE Serial.printf("[SENSOR] temp=%.2f C, humi=%.2f %%\n", temp, humi); #endif这样在正式版里把DEBUG_ENABLE改成0就能关掉所有调试输出,不必一行行删除代码。这个方式对后期维护特别友好,我非常推荐你养成这个习惯。
如果你手头正好有ESP32-S3-WROOM开发板,建议照着这篇文章从上到下跑一遍:先把板点亮,再把串口打通,然后连上WiFi请求一个网络接口。这一套流程走完,你对Arduino IDE开发ESP32-S3的基本功就算打牢了。接下来想做什么项目,无非是往这个框架里填传感器、显示屏、电机驱动这些外设而已。等你真正跑通第一个联网案例时,那种成就感还是相当有诱惑力的。