ESP32-CAM 是最近群里问得最多的一块板子。几十块钱一套,板载 Wi-Fi 和摄像头,能拍照能推流,还能再接传感器做各种小项目,从门锁猫眼到遥控小车都有人用它。但要真正用起来,最磨人的其实是环境搭建和烧录这一步——很多人卡在“板子买了但跑不起来”的状态,于是就有了这篇从头到尾的实操记录。
我尽量把每一步都拆开讲清楚,包括为什么这样做、不这样做会怎样,以及我实际踩过哪些坑。这篇内容基于我常用的 Arduino IDE 2.x 版本和 ESP32-CAM(AI Thinker 方案)来写,一套流程走完后你可以跑通板载摄像头示例,直接浏览器看实时画面,之后再往里面加自己的逻辑就顺手了。
1. 板子到手先看懂这几件事:ESP32-CAM 的硬件与选型
1.1 这块板子到底强在哪里
ESP32-CAM 本质上是一块基于 ESP32-S 模组的开发板,集成了摄像头接口、MicroSD 卡槽、Wi-Fi/蓝牙天线和若干 GPIO。ESP32-S 本身是双核 240MHz 的处理器,带 520KB SRAM,再加上板载 PSRAM(通常 2MB 或 4MB),跑图像处理、HTTP 服务、视频推流这类任务不会太吃力。关键是它便宜、体积小、功耗可控,非常适合做物联网终端的“眼睛”。
我见过有人把它做成简易监控、门禁猫眼、小车图传、拍照延时摄影、人脸识别门锁,甚至配合舵机做云台追踪。也就是说,它不只是一个“能出画面的模块”,而是一个带完整 Wi-Fi 协议栈的嵌入式相机平台。刚开始接触时,先别指望它跟树莓派相提并论,但它的定位本来就是低功耗、低成本、快速原型验证。
1.2 不同版本怎么选:摄像头、Flash、PSRAM 的差异
市面上常见的 ESP32-CAM 有几种配置组合,别只看“ESP32-CAM”几个字就下单,具体版本差异会影响后续代码选择和画质表现。
| 配置项 | 常见版本 | 说明 |
|---|---|---|
| 摄像头传感器 | OV2640 | 默认款,支持 200 万像素,最大 1600x1200,性价比高 |
| 摄像头传感器 | OV5640 | 500 万像素,画质更好,但价格略高,部分示例需要改引脚 |
| Flash | 4MB 居多 | 足够存放固件和简单网页资源 |
| PSRAM | 2MB / 4MB / 8MB | 跑高分辨率推流时建议选大一点的 |
我建议新手直接选 OV2640 + 4MB Flash + 2MB PSRAM 的版本,这也是大多数教程和示例代码默认支持的配置。OV5640 虽然像素更高,但在 ESP32-CAM 上跑视频流时,编码压力和内存占用都更大,玩起来门槛高一些。另外要注意封装是“DIP 直插”还是“贴片”,如果计划用面包板或杜邦线频繁调试,直插款更方便。
1.3 配件清单:除了板子你还得准备哪些
ESP32-CAM 板子本身不带 USB 转串口芯片,这是新手最容易忽略的一点。它只能通过 UART 引脚烧录固件,所以必须准备一个 USB 转 TTL 下载器。我在实际使用中推荐 FTDI FT232RL 或 CP2102 模块,便宜稳定,驱动也好认。
还需要准备:
- 杜邦线若干(母对母、母对公都备一点)
- 面包板(用于扩展引脚和供电)
- 5V / 2A 以上电源(后面会讲为什么电脑 USB 口经常不够用)
- 摄像头排线(一般随板子附带,别弄丢)
- MicroSD 卡(可选,用于拍照存图或存录像)
2. 环境搭建:Arduino IDE 装好 ESP32 开发包
2.1 Arduino IDE 下载安装那些坑
Arduino IDE 目前有两个大版本线:1.8.x 经典版和 2.x 新版。我建议新用户直接上 2.x,界面更现代,自带自动补全和串口监视器增强。1.8.x 虽然简洁,但有些插件和第三方工具在 2.x 上适配更好。官方下载地址是 arduino.cc/en/software,进页面后选对应操作系统的安装包。
安装时需要注意几点:
- Windows 用户尽量别装到带空格的路径下,虽然现在大多数情况没问题,但避免某些老库解析路径出错。
- 安装完成后第一次启动,如果提示是否安装 USB 驱动,建议同意。
- 如果你之前装过别的 ESP32 工具链,先卸载干净,避免环境变量冲突。
我遇到过一个奇怪的问题:Arduino IDE 打不开,点击图标没反应。后来发现是安装包下载不完整,重新下载安装后就好了。所以如果遇到“打不开”这类问题,先怀疑安装文件完整性,别急着改系统环境。
2.2 给 Arduino IDE 添加 ESP32 开发板源
在 Arduino IDE 里使用 ESP32,本质上是安装乐鑫官方提供的“开发板管理包”。操作路径是:文件 -> 首选项 -> 附加开发板管理器网址,然后填入 ESP32 的 JSON 索引地址。
https://espressif.github.io/arduino-esp32/package_esp32_index.json填好之后,打开“工具 -> 开发板 -> 开发板管理器”,在搜索框输入esp32,找到esp32 by Espressif Systems,点击安装。这个包体积不小,官方最新版本通常有几百 MB,包含交叉编译工具链、烧录工具、库文件等。
安装过程最常遇到的问题是网络卡顿、下载到一半失败。我试过换个时间段重试,也试过挂代理加速,但对新手来说最省心的方式是:在开发板管理器里多试几次,或者用下面讲的离线安装方式。
2.3 离线安装开发板包和常见失败处理
如果在线安装一直失败,可以采用离线安装方案。在 GitHub 上找到espressif/arduino-esp32仓库的 Releases 页面,下载对应版本的esp32-xxxxxx.zip包,然后把压缩包放到 Arduino 的hardware/espressif目录下解压。
以 Windows 为例,默认硬件目录通常在:
C:\Users\你的用户名\Documents\Arduino\hardware\espressif如果你没有这个目录,手动新建即可。解压后还需要把tools目录里的工具链装好。最简单的方式是跑一遍 Arduino IDE 的开发板管理器安装,让 IDE 自动补全工具链;如果完全没有网络,就得手动下载对应的工具链压缩包并按版本要求放置。
我个人的经验是:能用在线安装就尽量在线安装,版本一致性最好。离线包有时候会因为版本不匹配导致编译时报奇奇怪怪的错误,比如找不到esp32-hal.h或者链接失败。
还有一点:不要从非官方渠道随意下载“精简版”或“加速版”开发板包,这类包可能被改动过,不光是稳定性问题,还有安全风险。遇到问题优先去官方仓库或官方文档找方案。
3. 接线与上电:这是烧录成败的关键一步
3.1 USB 转 TTL 下载器怎么选
USB 转 TTL 下载器是 ESP32-CAM 烧录的“桥梁”。常见芯片有 CH340、CP2102、FT232RL 等。CH340 最便宜,但有的山寨版驱动不稳定;CP2102 比较均衡;FT232RL 是我个人用得最顺手的,性能稳定但价格稍高。
选下载器时看一下页面说明:是否支持 3.3V 输出、是否有 RTS/DTR 引脚、驱动是否好装。ESP32-CAM 的 UART 电平是 3.3V,所以下载器最好能输出 3.3V,并支持 3.3V 逻辑电平。有些下载器可以通过跳线帽切换 5V/3.3V,用的时候必须切到 3.3V,否则可能烧坏板子。
3.2 接线表与供电注意事项
ESP32-CAM 的烧录引脚集中在板子边缘:3.3V、GND、U0RXD、U0TXD、5V、IO0 等。以最常用的 AI Thinker 版本为例,接线如下:
| 下载器端 | ESP32-CAM 端 | 说明 |
|---|---|---|
| 3.3V | 3.3V | 低电流供电,可用于烧录 |
| TXD | U0RXD | 下载器发送到板子 |
| RXD | U0TXD | 板子发送到下载器 |
| GND | GND | 必须共地 |
| DTR/CTS(可选) | 可接 IO0 和 RST | 自动下载电路,一般不用 |
如果是老式下载器没有 DTR/RTS 自动流控,就需要手动控制:先把 IO0 接到 GND,再给板子上电或按复位键,让板子进入下载模式。
这里必须强调供电问题。ESP32-CAM 在 Wi-Fi 开启和图像采集时,瞬时电流很容易超过 300mA,甚至到 500mA。很多 USB 转 TTL 下载器上的 3.3V 输出能力很弱,只有几十到一百多毫安,所以烧录时虽然能连上,一旦运行摄像头示例就反复重启或花屏。更稳妥的做法是:烧录时用下载器供电,运行时用独立 5V 电源给板子的 5V 引脚供电。
如果你手头有稳压电源或充电宝改装板,建议直接从 5V 引脚进电,注意 GND 要和下载器的 GND 连在一起,否则串口通信电平没有参考地,会乱码或完全无响应。
3.3 上电顺序与 GPIO0 下载模式
ESP32-CAM 没有独立复位按键,但很多版本板上有 RST 焊盘和 IO0 焊盘。如果要进下载模式,常规操作是:
- 用杜邦线把 IO0 和 GND 短接。
- 给板子上电或按一下复位(如果有)。
- 此时板子停留在“下载等待状态”,可以接收新固件。
- 烧录完成后,断开 IO0 与 GND 的连接,再按一次复位,板子才会正常运行。
如果烧录时提示“连接超时”或“Failed to connect to ESP32”,第一件事就检查 IO0 是否拉低。我调试时经常犯的错是:IO0 短接好后忘了给板子断电重启,结果一直连不上;或者上电顺序反了,先复位后拉低 IO0,导致板子已经跑起来进入正常模式。
真正的关键是“拉低 IO0 后复位一次”,而不是单纯把引脚接低就完事。
4. 实操烧录:跑通 CameraWebServer 示例
4.1 打开示例代码并修改 WiFi 参数
开发板包安装完成后,Arduino IDE 里会出现 ESP32 相关示例。用起来很简单:文件 -> 示例 -> ESP32 -> Camera -> CameraWebServer。
打开示例后,你会看到很多#define CAMERA_MODEL_XXX的宏定义,它们是用来选择摄像头型号的。AI Thinker 的板子需要在代码里取消注释这一行:
#define CAMERA_MODEL_AI_THINKER然后往下翻到 WiFi 配置位置,填上你自己的网络名称和密码:
const char* ssid = "你的WiFi名"; const char* password = "你的WiFi密码";这里有个小经验:ESP32-CAM 只支持 2.4GHz 频段的 Wi-Fi,如果你的路由器开了 5GHz 和 2.4GHz 同名的“双频合一”,它可能连不上或者反复掉线。我建议先在路由器后台关掉双频合一,或者给 2.4GHz 单独设一个名称,等跑通了再折腾其他功能。
4.2 开发板菜单里的几处关键配置
代码填写没问题后,还要在“工具”菜单里做几项配置,这些配置直接影响编译和运行结果:
| 配置项 | 推荐值 | 说明 |
|---|---|---|
| 开发板 | AI Thinker ESP32-CAM 或 ESP32 Wrover Module | 按你板子实际型号选择 |
| Flash Size | 4MB (32Mb) | 大部分 ESP32-CAM 是 4MB |
| Partition Scheme | Huge APP (3MB No OTA) 或 Default 4MB | 示例代码体积不小,建议选大分区 |
| PSRAM | Enabled | 摄像头帧缓冲需要 PSRAM,不开启会花屏或无法启动 |
| Upload Speed | 921600 或 115200 | 稳定优先选 115200,前面可直接 921600 |
| CPU Frequency | 240MHz | 全速运行,图像处理更流畅 |
我第一次用的时候没开 PSRAM,结果摄像头画面出来是花屏,串口日志一堆报错。后来翻文档才明白,OV2640 在较高分辨率下需要一块较大的帧缓冲,ESP32 内置 RAM 不够用,必须靠 PSRAM。这个问题特别典型,后面我会在问题排查里再讲一遍。
4.3 编译、烧录和首次运行
配置完成后,点击“上传”按钮,IDE 会自动编译然后烧录。如果用的是 921600 波特率,烧录速度很快,但下载器质量差时容易出现“串口无响应”或中途超时。我个人的习惯是:第一次烧录先选 115200,确保能稳定烧进去,之后再调高波特率追求速度。
烧录过程中,Arduino IDE 底部日志会输出类似这样的内容,表示正在连接芯片:
Connecting............._____....._____....._____如果卡在这一步很久,大概率就是 IO0 没拉低或没有复位进入下载模式。按我前面说的,把 IO0 接 GND 并复位一次,再点一次上传。
烧录完成后,断开 IO0 与 GND,按一下板子上的复位(或重新上电)。打开串口监视器,波特率设为 115200,正常情况下会看到 ESP32-CAM 连接 Wi-Fi 并打印出 IP 地址,类似:
Camera Ready! Use 'http://192.168.1.100' to connect把浏览器打开,输入这个 IP,就能看到 CameraWebServer 的控制页面。选择分辨率(比如 800x600),点击 Start Stream,实时画面就出来了。局域网内访问延迟很低,画面基本流畅,第一次跑通的时候还是很有成就感的。
到这里,你可能已经完成“ESP32-CAM + Arduino”的最小闭环。接下来就是自由发挥的阶段,比如加传感器、做远程拍照、接舵机做云台,或者把图像推送到自己的服务器。
5. 常见问题排查:编译失败、连接不上、花屏黑屏
5.1 编译阶段的问题
编译是新手很容易卡住的环节,常见错误有:
- 找不到开发板包:编译时报
esp32/esp32-hal.h: No such file or directory,说明开发板包没装好或没选对开发板。检查工具 -> 开发板菜单里是否有ESP32 Arduino选项,如果没有,重新安装开发板包。 - 选错分区:报
Sketch too big或Flash size over,说明固件超出 Flash 分区限制,改用 Huge APP 分区方案或者减小代码体积。 - 库冲突:如果项目里同时装了很多版本的摄像头库,可能导致函数重复定义。我建议示例项目尽量使用官方示例自带的库,不要额外安装来路不明的同名库。
- 中文路径问题:项目文件路径里有中文可能导致某些老版本工具链编译失败,尽量把工程放到纯英文目录下。
5.2 烧录阶段的问题
烧录失败是最打击热情的问题,但绝大多数原因就那几类:
| 现象 | 可能原因 | 解决办法 |
|---|---|---|
Failed to connect to ESP32 | IO0 没拉低,或没进入下载模式 | 拉低 IO0 后复位一次 |
Serial port not found | 驱动没装或下载器没识别 | 安装对应芯片驱动,检查设备管理器 |
| 烧录到一半卡死 | 供电不足或波特率过高 | 换独立 5V 供电,降低 Upload Speed 到 115200 |
| 烧录成功但板子无反应 | 没复位,或 IO0 仍接地 | 断开 IO0,重新上电复位 |
还有一个容易被忽视的:下载器端 TXD 和 RXD 与板子的连接方向。下载器的 TXD 要接板子的 RXD,下载器的 RXD 接板子的 TXD,简称“交叉连接”。很多人照着图接完发现收不到数据,基本都是把这两个线接反了。
5.3 WiFi 连接和画面问题
烧录成功后,紧接着就是网络和画面问题。最典型的有三种:
第一种是连不上路由器。ESP32-CAM 只支持 2.4GHz,且对一些奇怪加密方式兼容不好。建议先用 WPA2-PSK、AES 模式测试,等稳定了再优化。
第二种是能连上但浏览器打不开 IP。检查串口日志确认 IP 地址是否正常,电脑和 ESP32-CAM 是否在同一网段,关闭电脑防火墙试一下。
第三种是画面花屏或黑屏。花屏先确认 PSRAM 是否 Enabled,黑屏先检查摄像头排线是否插紧、有没有选对摄像头型号。我用过一块板子,排线松了一点,画面畸变、颜色异常,重插排线后问题消失。
有朋友反馈说电源线细、接口接触不良也会导致图像偶尔黑屏,这个我有同感。给 ESP32-CAM 供电的线尽量短而粗,插入前检查金属端子有没有氧化。
5.4 问题速查表
为了方便之后排查,我把常见问题整理成一个速查表,贴在下面:
| 问题现象 | 最高频原因 | 第一排查动作 |
|---|---|---|
| 编译报错找不到 esp32 头文件 | 开发板包未正确安装 | 重新安装 ESP32 开发板包 |
| 编译报错代码体积超大 | 分区方案不合适 | 切换 Huge APP 分区 |
| 上传失败,连接超时 | 未进入下载模式 | IO0 接 GND,复位 |
| 上传失败,找不到串口 | USB 转 TTL 驱动问题 | 安装驱动,检查设备管理器 |
| 运行时反复重启 | 供电不足 | 用 5V 独立电源 |
| 摄像头花屏 | PSRAM 未开启 | 工具菜单开启 PSRAM |
| 摄像头黑屏 | 排线松动或型号选错 | 重插排线,检查宏定义 |
| 连不上 Wi-Fi | 5GHz/2.4GHz 混用 | 单独设置 2.4GHz SSID |
| 画面卡顿 | 分辨率过高或信号弱 | 调低分辨率,靠近路由器 |
| 串口日志乱码 | 波特率不匹配 | 统一设为 115200 |
5.5 我从这些坑里总结出的几条习惯
调试 ESP32-CAM 的过程,其实也是培养嵌入式调试习惯的过程。我现在拿到一块新板子,会按固定套路走一遍:先看引脚丝印,再量通断,然后最小系统上电,最后才连外设。不要一上来就各种飞线,出了问题根本不知道从哪里查。
另一个习惯是每次只改动一个变量。比如先不连摄像头,只跑一个板载 LED 闪烁程序,确认板子和下载器没问题;然后再加摄像头示例,就能把“硬件问题”和“代码问题”分开。很多人一上来就抱怨板子坏了,结果最后发现是 IO0 跳线接法不对。
最后再分享一个我自己的习惯:每次烧录完,我会先看一眼串口日志的前 20 行,确认芯片启动信息里 PSRAM 有没有正确显示。启动日志里出现PSRAM: Found就说明内存配置正常,如果显示PSRAM: Not found,那摄像头大概率跑不起来。这个细节比任何调试器都直观,也帮我快速定位过好几次问题。