1. 课程导学与环境搭建
各位同学好,我是老周。做嵌入式十几年了,从最早的 8051 一路折腾到现在的双核 Xtensa。说实话,ESP32 是我见过最「折腾得起」的芯片——性能够用、外设丰富、价格还便宜。但越是这样,坑也越多。
这一章我们不急着写代码。先把家伙事儿备齐,把概念理清。你想想看,工具没选对、环境没配好,后面调试起来那叫一个痛苦。我在项目里吃过这个亏,所以开篇咱们稳扎稳打。
1.1 ESP32 开发板选型:别买错了
市面上的 ESP32 开发板五花八门。我建议你按项目需求来选,别只看价格。
| 型号 | Flash 大小 | PSRAM | 适用场景 | 我的建议 |
|---|---|---|---|---|
| ESP32-DevKitC V4 | 4MB | 无 | 入门、简单传感器 | 学习首选,资料最多 |
| ESP32-WROVER-B | 8MB | 8MB | Web 服务器、大文件存储 | 本课程推荐,跑 SPIFFS 很稳 |
| ESP32-S3-DevKitC-1 | 16MB | 8MB | 需要更多算力、LCD 显示 | 新项目可以考虑 |
| ESP32-C3-DevKitM-1 | 4MB | 无 | 低功耗、简单 WiFi | 注意不支持 PSRAM |
我个人习惯用 ESP32-WROVER-B 做原型验证。8MB PSRAM 跑异步服务器时,内存压力小很多。如果你手头只有 DevKitC V4,也能学,就是后面做大文件上传时可能会卡。
1.2 开发环境配置:Arduino IDE vs ESP-IDF
很多新手会纠结选哪个。我的看法很简单:
- Arduino IDE:上手快,库多,适合快速验证想法。本课程前半部分用它。
- ESP-IDF:功能全,调试能力强,适合做产品。课程后半部分会切过去。
1.2.1 Arduino IDE 环境搭建
步骤其实就三步:
- 下载安装 Arduino IDE(建议 2.x 版本,界面清爽很多)
- 添加 ESP32 开发板地址:
https://espressif.github.io/arduino-esp32/package_esp32_index.json - 在「开发板管理器」中搜索 ESP32,安装最新版
1.2.2 ESP-IDF 环境搭建
ESP-IDF 稍微复杂一点。我建议用 VS Code + ESP-IDF 插件的方式:
- 安装 VS Code
- 安装 Espressif IDF 插件
- 在插件里选择「Configure ESP-IDF Extension」,自动下载工具链
嗯,这里要注意:ESP-IDF 的版本。我踩过坑——v4.4 和 v5.0 的 SPIFFS API 有变化。本课程基于 ESP-IDF v5.0.1,如果你用其他版本,遇到编译报错别慌,先看 API 文档。
1.3 SPIFFS 概念扫盲:文件系统怎么跑在 Flash 上?
SPIFFS 全称是 SPI Flash File System。说白了,就是把 Flash 芯片当成一个小硬盘用。你可以在上面创建文件、读写数据、删除文件。
为什么会需要它?
- ESP32 的 Flash 除了存程序,还有剩余空间
- Web 服务器需要 HTML、CSS、JS 文件
- 配置参数、日志数据需要持久化存储
我刚开始做物联网项目时,习惯把网页代码直接写在程序里。结果改个按钮颜色都要重新编译、烧录。后来换成 SPIFFS,爽多了——网页文件单独上传,程序不用动。
1.4 异步服务器概念扫盲:别再阻塞了
传统的 ESP32 Web 服务器,用的是 WiFiServer + WiFiClient。每个请求都要等上一个处理完。如果某个客户端慢,整个服务器就卡住了。
异步服务器不一样。它用事件驱动的方式:
- 收到请求后,注册一个回调函数
- CPU 立刻回去处理其他事情
- 等数据准备好了,再执行回调
你想想看,这就像你去餐厅吃饭。同步模式是:一个厨师做完你的菜,才做下一个。异步模式是:厨师同时接好几个单,哪个菜好了就出哪个。
在 ESP32 上,最常用的异步服务器库是 ESPAsyncWebServer。它和 SPIFFS 配合起来,简直是绝配——网页文件从 SPIFFS 读取,通过异步服务器发送,不占内存、不卡顿。
1.5 本章知识体系总览
下面这张图,把本章的核心逻辑串起来了。你可以把它当成一张地图,后面每章都会回到这里。
1.6 本章小结
这一章我们做了三件事:
- 选了板子:我推荐 WROVER-B,但其他板子也能用
- 搭了环境:Arduino IDE 和 ESP-IDF 二选一,或者都装
- 扫了盲:SPIFFS 是文件系统,异步服务器是事件驱动
别急着往下翻。先把环境配好,编译一个 SPIFFS 示例跑通。我当年就是图快,跳过这一步,结果后面调试时才发现工具链有问题,浪费了两天时间。