ESP8266-01S 是一块很小的 WiFi 模块,却经常让新手卡在第一步:想用 Arduino IDE 给它编译烧录程序,结果打开 IDE 才发现里面根本没有 ESP8266 这个开发板选项。你写好了代码,找不到板卡;接上了 USB 转串口,找不到 COM 口;哪怕好不容易选好了开发板,上传时也可能一直卡在连接等待。这不是模块坏了,多半是软件环境、驱动和启动模式没有准备好。
这篇教程就围绕 ESP8266-01S 在 Arduino IDE 下的编译烧录环境搭建展开,从 Arduino IDE 安装、开发板支持包添加、串口驱动、板卡参数选择,到最小样例烧录和常见报错排查,完整走一遍。适合第一次接触 ESP-01S、手头只有模块和 USB 转串口、想先把环境跑通再去做物联网小项目的读者。先把这一步走稳,后面连 WiFi、MQTT 上云、远程控制才有基础。
1. 先认清 ESP-01S 的硬件角色:它不能直接插 USB 烧录
很多新手默认模块和开发板一样,插上 USB 线就能烧录。ESP-01S 不是这样。它是一块“模块”,不是“开发板”,没有板载 USB 转串口,没有稳压芯片,也没有自动下载电路。你要做的是先从硬件上把烧录环境补齐,否则后面所有软件设置都是白搭。
1.1 模块和开发板差在哪里
常见的 NodeMCU、D1 Mini 这类开发板,把 USB 接口、电源管理、串口芯片、按键、LED 都集成到一起了。插上 USB 线,电脑能识别,Arduino IDE 直接选对端口就能烧录,因为板子上已经做好了自动复位和下载控制。
ESP-01S 只有 8 个引脚,核心器件就是 ESP8266 芯片、Flash 存储、一个板载蓝色 LED、天线和少量电阻电容。它没有 USB 口,所以你想烧录,必须自己提供:
- 3.3V 电源
- USB 转 TTL 串口模块
- 让模块进入“烧录模式”的引脚控制
这也是为什么很多人第一次用 ESP-01S 时,明明代码没问题,却始终连接不上。问题不是代码,是模块压根没有进入接收固件的状态。
1.2 准备一份最基础的硬件清单
在开始装软件之前,先把手上的硬件理清楚。按推荐程度排序:
- ESP-01S 模块一块,最好带排针,焊接版调试起来不方便。
- USB 转串口模块,芯片常见的是 CH340、CP2102、FT232。CH340 最常见也最便宜,CP2102 稳定性通常更好。买的时候注意最好有 3.3V 输出引脚,并且有跳线能切到 3.3V。
- 杜邦线,母对母为主,用来连接串口模块和 ESP-01S。
- 面包板不是必须,但调试时很实用。模块引脚间距小,直接在桌面上接线容易松动。
- 独立 3.3V 电源或带 3.3V 输出的模块,用来给 ESP-01S 供电。USB 转串口板上的 3.3V 输出也能用,但有些电流不大,后面会遇到供电不足的问题。
如果你不想自己慢慢接 GPIO0、复位这些信号线,可以考虑买一个 ESP-01S 专用下载底座。这种底座类似一个转接板,把模块插上去,USB 转串口模块连到底座的 TX、RX、3.3V、GND 上就行,有的底座还带 DTR/RTS 自动复位,能直接控制 GPIO0,烧录体验会好很多。
1.3 关于 3.3V 和 5V:ESP8266 的 GPIO 不会输出 5V
搜索记录里会看到“ESP8266 怎么输出 5V”这类问题,这里先说明白。
ESP8266 是 3.3V 逻辑器件,VCC 要接 3.3V,不能直接接 5V。它的 GPIO 输出高电平是 3.3V 左右,不是 5V。如果你想让 ESP-01S 去控制一个 5V 继电器或者 5V 逻辑的外设,不能直接把 GPIO 接到对方模块上,一般要用三极管、MOS 管、光耦或者电平转换电路。
反过来也一样,如果某个传感器输出 5V 信号,要接 ESP8266 的 GPIO,也需要做电平转换,不能硬接。这类问题不是软件能解决的,属于硬件设计边界,先有这个概念,后面烧录和接外设时会少踩很多坑。
2. 安装 Arduino IDE:下载、首选项、添加 ESP8266 支持包
硬件搞清楚了,接下来装软件。ESP-01S 的编译烧录主要流程是:用 Arduino IDE 写代码,通过 ESP8266 开发板支持包编译成固件,再通过串口烧录到模块里。所以 Arduino IDE 只是壳,真正干活的是后面的 ESP8266 支持包。
2.1 IDE 安装时不要踩的几个小坑
去 Arduino 官网下载安装包,新手不要用来路不明的“一键整合包”,也不建议一上来就装 Beta 测试版。稳定版就行,2.x 或 1.8.x 都可以。如果你以后要装很多扩展库,2.x 的界面现代一些;如果电脑配置一般,1.8.x 更轻量。
安装时注意几点:
- 安装路径不要带中文,以后会少很多莫名其妙的路径报错。
- 安装过程中杀毒软件如果有提示,先确认来源是官网再放行。
- 打开后如果界面是英文,可以在 File -> Preferences 里把语言调成中文或其他你熟悉的语言,但菜单关键词要能对应上。
安装完成后,先打开一次 Arduino IDE。第一次启动会花一点点时间,因为要初始化本机配置目录。这个目录后面会存开发板支持包和库文件,所以要保证用户目录有写入权限。
2.2 在开发板管理器里添加 ESP8266 索引
Arduino IDE 新安装时,自带的开发板列表里没有 ESP8266。你需要手动添加一个“开发板管理器网址”,让 IDE 知道去哪里拉取 ESP8266 支持包。
打开 Arduino IDE 后:
- 点击菜单 File -> Preferences,如果已经是中文界面,就是 文件 -> 首选项。
- 找到 Additional boards manager URLs,中文界面叫“附加开发板管理器网址”。
- 填入下面的地址:
http://arduino.esp8266.com/stable/package_esp8266com_index.json然后点击确认,再打开 Tools -> Board -> Boards Manager,中文界面是 工具 -> 开发板 -> 开发板管理器。
在搜索框里输入 esp8266,应该会出现 esp8266 by ESP8266 Community。点击 Install,等待安装完成。
这一步是整个环境搭建的核心。ESP8266 支持包不装,后面你在开发板列表里永远找不到 Generic ESP8266 Module,也编译不了任何 ESP8266 代码。支持包体积不小,安装过程会下载工具链、编译器、烧录工具等,可能需要几分钟,耐心等待,不要中途关 IDE 或断电。
2.3 常见 Linux 和国产系统下的安装方式
Windows 用得最多,macOS 也类似。如果用的是银河麒麟这类国产 Linux 系统,安装思路和 Ubuntu/Debian 系比较接近。
可以到 Arduino 官网下载 Linux 版本压缩包,解压后进入目录运行 install.sh,或者直接双击可执行文件启动。串口设备如果没权限,当前用户一般需要加入 dialout 组:
sudo usermod -a -G dialout $USER改完用户组后要重新登录,串口才会生效。
不过第一次学 ESP-01S,我更建议先用 Windows 跑通整套流程。Windows 下驱动、端口、开发板管理相对直观,等熟悉一遍后,再换到 Linux 上折腾驱动和权限会轻松很多。如果在国产系统上同时处理驱动、支持包安装、编译权限,问题叠加在一起,很容易分不清是哪个环节出错。
3. 把 USB 转串口驱动装好,确认 COM 口
支持包装好后,下一个卡点通常是串口。因为你用 Arduino IDE 烧录时,要通过 USB 转串口模块和电脑通信。如果电脑识别不到这个模块,IDE 的端口列表里就是空的。
3.1 先判断你手里是哪颗转串口芯片
市面上的 USB 转串口模块常见这几类:
| 芯片型号 | 常见特征 | 驱动情况 |
|---|---|---|
| CH340 | 价格便宜,最常见 | Windows 一般手动装,部分系统自动识别 |
| CP2102 | Silicon Labs 芯片,稳定性不错 | 需要装官方驱动 |
| FT232 | 老牌芯片,兼容性好 | 驱动成熟,价格稍贵 |
判断方法很简单:看板子上的主控芯片丝印。如果丝印被贴纸挡住,可以接上电脑后打开设备管理器,看它提示什么。
如果是 CH340,Windows 10/11 有时候能自动识别,有时候需要手动装驱动。CP2102 则基本要装 Silicon Labs 的 CP210x 驱动。驱动的来源优先选芯片厂商官网或可信的开发板商家提供的版本,不要从陌生网站下载“万能驱动”。
装完驱动后,重新插拔一次 USB 线。模块板载的 LED 如果通电会亮,说明供电正常。注意,有些 USB 转串口板上有 3.3V/5V 跳线,使用 ESP-01S 时一定要确认输出是 3.3V。插到 5V 档位,ESPT-01S 大概率会烧。
3.2 Windows 下确认端口和驱动状态
接好 USB 转串口模块后,在 Windows 上按 Win + X,选择设备管理器,展开“端口(COM 和 LPT)”,正常情况下会看到一个 COM 口,例如 COM3、COM5、COM7。
如果看到的设备带黄色感叹号,说明驱动有问题,右键选择更新驱动,然后手动选择驱动目录,或重新安装对应芯片驱动。如果设备管理器里完全没有任何新设备,先换一根 USB 数据线,很多线只支持充电,不支持数据通信。再看一下插的是不是电脑直连的 USB 口,机箱前面板或 USB Hub 有时候供电不稳定,也会导致识别异常。
记下这个 COM 口编号,后面 Arduino IDE 里要选。
3.3 串口权限和端口冲突
Windows 下,同一个 COM 口不能同时被两个程序占用。烧录时先关掉串口监视器、串口调试助手等工具,否则会提示端口被占用或连接失败。
Linux 下比较常见的是设备节点存在但没有权限,比如 /dev/ttyUSB0 存在,Arduino IDE 里也能看到,但一上传就返回权限错误。解决办法就是前面说的加入 dialout 组,然后重新登录。更保险的做法是临时用 chmod 命令给设备节点加读写权限,但那只对当前启动的会话有效,重启后大概率要重新设置。
4. 第一次编译烧录:接线、选板、点灯
软件环境准备到这里,先不要急着写复杂功能。第一次烧录的目标只有一个:让 ESP-01S 的板载 LED 亮起来。这个目标足够短,能最快验证你的接线、驱动、开发板参数、烧录模式是不是都正确。
4.1 最小烧录接线图
把 USB 转串口模块和 ESP-01S 按下面对应关系接线:
| USB 转串口模块 | ESP-01S |
|---|---|
| 3.3V | VCC |
| GND | GND |
| TX | RX(GPIO3) |
| RX | TX(GPIO1) |
| 3.3V(或单独电源) | CH_PD / EN |
| GND | GPIO0 |
注意 TX 和 RX 要交叉。串口模块的 TX 接 ESP-01S 的 RX,串口模块的 RX 接 ESP-01S 的 TX。很多新手把 TX 接 TX、RX 接 RX,烧录当然失败。
CH_PD 也叫 EN,是芯片使能脚,必须接高电平,通常接 3.3V。GPIO0 在烧录时必须接 GND,让模块进入 UART 下载模式。烧录完成后,要把 GPIO0 从 GND 断开,再手动复位模块,程序才会正常启动运行。
如果用的是带 DTR/RTS 控制的专用 ESP-01S 下载底座,GPIO0 和 RST 通常会被自动控制,烧录体验和普通开发板差不多,这里主要说不带自动下载的接线方式,因为这种方式最容易理解模块原理。
注意:GPIO0 在烧录时接地,不是运行程序时接地。烧录完不复位、不把 GPIO0 拉高,模块只会停在下载状态,不会跑你的代码。
4.2 在 Arduino IDE 里选对开发板和参数
打开 Arduino IDE,先把开发板选成 Generic ESP8266 Module,路径一般是:
Tools -> Board -> ESP8266 Boards -> Generic ESP8266 Module
中文界面就是 工具 -> 开发板 -> ESP8266 开发板 -> Generic ESP8266 Module。
然后修改几个关键参数:
| 参数 | 推荐值 | 说明 |
|---|---|---|
| Flash Size | 1M (512K SPIFFS) | ESP-01S 常见 1MB Flash |
| Flash Mode | QIO,失败再改 DIO | 和 Flash 颗粒有关 |
| Upload Speed | 115200,失败再降 57600 或 9600 | 降低速度能提高稳定性 |
| Port | 选你设备管理器里看到的 COM 口 | 不选端口无法上传 |
CPU Frequency 先保持默认,不需要为了点灯去调整。
Flash Size 为什么不能随手设置?因为 ESP8266 会根据 Flash 大小把一部分空间划分给程序,另一部分给 SPIFFS 文件系统。如果你选的 Flash 大小比模块实际容量大,烧录时可能检测失败;选太小,虽然能烧,但以后写复杂项目时空间不够。可以先选 1M,遇到编译提示空间不足,再根据模块上的 Flash 型号来调整。
4.3 写一个最简单的点灯程序
ESP-01S 板载的 LED 通常接在 GPIO1,也就是 TX 引脚上,而且低电平点亮。不同批次模块可能略有差异,有的模块丝印会标 GPIO1 或 GPIO2。先用 GPIO1 试:
#define LED_PIN 1 void setup() { pinMode(LED_PIN, OUTPUT); } void loop() { digitalWrite(LED_PIN, LOW); delay(500); digitalWrite(LED_PIN, HIGH); delay(500); }如果烧录后 LED 没有闪烁,再改成 GPIO2 试试,也可以直接观察模块上的丝印说明。这个程序不涉及串口打印,所以先把 TX 引脚当普通 IO 用问题不大,但你要知道 GPIO1 本身也是串口 TX,之后如果用 Serial 打印,可能会和这个 LED 引脚功能冲突。
4.4 怎么判断烧录成功
点击 Upload 按钮后,Arduino IDE 底部状态栏会出现编译信息,然后开始上传。正常过程大致是:
- 编译耗时十几秒到几十秒。
- 出现 Connecting........_____ 之类的提示。
- 日志中出现上传进度条或 esptool 输出。
- 最后出现 Hard resetting via RTS pin...。
看到 Hard resetting,基本说明烧录流程已经走完。这时把 GPIO0 和 GND 断开,按一下 RST 复位,板载 LED 应该开始以 0.5 秒间隔闪烁。
如果 LED 不闪,优先检查两件事:
- GPIO0 是不是还接着 GND。
- 程序里的引脚是不是和你的模块板载 LED 实际引脚一致。
5. 烧录失败的排查:从日志倒推问题,不要盲目改参数
第一次烧录很少一次成功。这里把最常见的失败现象和排查顺序整理出来。遇到问题先从日志看,再按硬件、参数、环境逐层定位,不要上来就乱改 Flash Size 或波特率。
5.1 最典型的连接失败日志
上传时最常看到的是这类提示:
warning: serial console is disabled A fatal error occurred: Failed to connect to ESP8266: Timed out waiting for packet header看到 Timed out waiting for packet header,说明 esptool 已经打开串口,但是始终收不到模块的正确响应。可能的原因有很多,不要只盯着“波特率不够低”这一项。
按出现概率排,通常是这几类:
| 故障方向 | 优先检查内容 | 常见原因 |
|---|---|---|
| 硬件接线 | TX/RX 是否交叉、GPIO0 是否接地、CH_PD 是否接 3.3V | 接线错误占大多数 |
| 供电 | 模块是否用 3.3V,电流是否足够 | 用 5V 或电流不够导致芯片不启动 |
| 驱动和端口 | 设备管理器是否识别 COM 口,端口是否被占用 | 驱动没装好或串口被其他程序占用 |
| 烧录时序 | 手动复位时 GPIO0 是否保持低电平 | 上电时序不对导致没进入下载模式 |
| 参数设置 | Flash Mode、Upload Speed | 部分模块对 QIO 或高波特率不兼容 |
5.2 按这个顺序排查硬件和接线
如果一直连接不上,我一般会按下面顺序做,而不是先改参数:
- 断开模块所有连线,重新按最小接线接一遍,重点确认 TX/RX 交叉。
- 用万用表确认 VCC 和 CH_PD 都是 3.3V,GND 和串口模块是同一个地。
- 把 GPIO0 明确接到 GND,然后再给串口模块通电,或者给模块 RST 引脚碰一下 GND 手动复位。
- 检查设备管理器里 COM 口还在不在,端口有没有被串口监视器占用。
- 如果还是失败,再考虑把上传波特率降到 57600 或 9600,Flash Mode 从 QIO 改成 DIO。
不要一上来就疯狂点 Upload,失败一次就重新插拔一次 USB,这样很难定位问题。建议每次改一个变量,改完再试,别同时改接线、改参数、换电脑,否则你根本不知道是哪一步生效的。
5.3 参数层面常改的只有这几项
如果你已经确认硬件接线没问题,上报错依然存在,再动这些参数:
- Flash Mode:QIO 改 DIO。有些 ESP-01S 的 Flash 颗粒对 QIO 模式支持不完整,DIO 更保险。
- Upload Speed:115200 改 57600,再不行改 9600。速度越低对线路质量要求越低,如果杜邦线太长,高速率很容易失败。
- Flash Size:确认模块实际 Flash 容量。ESP-01S 常见 1MB,但返修板、二手板、不同批次可能不一样。如果烧录时提示 Flash 型号或容量不匹配,需要根据颗粒型号调整。
这几项都试过还是失败,先把串口转接板单独用一根线短接它的 TX 和 RX,用串口调试助手发数据看看能不能收到回显。如果连回显都没有,说明串口模块本身就有问题,别让 ESP-01S 背锅。
5.4 烧录成功但程序没跑怎么办
“烧录成功”和“程序正确运行”是两回事。如果日志显示烧录完成,但模块没有任何反应,排查顺序是:
- GPIO0 是否已经恢复为高电平,也就是断开与 GND 的连接。
- RST 引脚是否正常。ESP-01S 的 RST 应该接上拉到 3.3V,不能悬空。
- CH_PD/EN 是否稳定为 3.3V,如果这个脚被拉低,芯片不会工作。
- 供电电流是否够。ESP8266 在射频启动瞬间电流会明显升高,如果只用 USB 转串口板上很弱的 3.3V 输出,程序可能跑到一半就复位。
- 程序里的引脚是否和板载 LED 一致。
排查时可以接一个 USB 转串口到串口监视器,烧录时如果想看打印输出,串口波特率要和你代码里 Serial.begin 的值一致,否则看到的全是乱码。如果代码里没有用 Serial,那就先不要接串口监视器,把注意力放在硬件基础状态上。
6. 下一步想清楚:从点灯到 WiFi 联网、MQTT 上云
环境搭好、点灯跑通以后,你的 ESP-01S 已经具备继续学习的基础能力。这时候不要急着写复杂的智能家居项目,先把 ESP8266 的 WiFi 功能验证一下,再逐步加协议和云端。
6.1 先用 WiFi 扫描验证模块射频
写一个最简单的 WiFi 扫描程序,确认射频部分正常:
#include <ESP8266WiFi.h> void setup() { Serial.begin(115200); WiFi.mode(WIFI_STA); WiFi.disconnect(); delay(100); } void loop() { int n = WiFi.scanNetworks(); Serial.println("scan done"); for (int i = 0; i < n; i++) { Serial.print(i + 1); Serial.print(": "); Serial.println(WiFi.SSID(i)); } delay(3000); }烧录完成后打开串口监视器,波特率选 115200,如果能看到附近 WiFi 列表,说明模块的射频和天线都没问题。接下来可以试连接路由器、做 HTTP 请求、用 MQTT 协议连接阿里云或其他平台。
这条路慢慢走,一步一步来。每加一个功能,都新建一个测试工程,不要在一个例程里塞上十个库,否则出了问题很难定位。
6.2 环境搭好后的几个好习惯
工具链一旦稳定,最好固定下来,不要频繁换 IDE 版本或支持包版本。每次升级开发板支持包,都可能导致原有工程的 Flash 参数或编译结果发生变化。
项目保存目录不要用中文和空格,尤其是 Windows 下,Arduino IDE 对中文路径偶尔会出问题。每次拿到一块新模块,先记录它的 COM 口、Flash Size、Flash Mode,烧录顺利后就把这几个参数抄下来,下次遇到同型号模块直接照用。
还有个习惯建议:写完代码先点 Verify 编译一遍,确认没有编译错误,再接烧录。编译错误和烧录错误是两类问题,混在一起排查会让你很累。
6.3 固件烧录工具的另外选择
如果你只是想给 ESP-01S 刷现成固件,比如 AT 固件、MicroPython 固件,不一定要用完整的 Arduino IDE。这时用 esptool 命令行或图形化的 flasher 工具更直接。esptool 本来也是 Arduino IDE 支持包底层使用的烧录工具,它能完成擦除 Flash、烧写指定地址固件等操作。
| 场景 | 推荐方式 | 说明 |
|---|---|---|
| 自己写代码编译 | Arduino IDE + ESP8266 支持包 | 上手快,适合学习 |
| 刷现成固件 | esptool / 图形化 flasher | 无需编译,直接写二进制 |
| 大型工程开发 | PlatformIO + VS Code | 工程管理更强,适合多文件项目 |
但不管用哪种方式,GPIO0 接地进入下载模式、3.3V 供电、TX/RX 交叉接这几个核心概念是一样的。基础环境搭好后,换工具只是换个使用习惯的问题。
把这一套流程走通,ESP-01S 就不再是你看不懂的黑盒子。之后再做远程开关、传感器上报、小屏显示、MQTT 上云这些项目,你会发现自己最大的阻力不是某个具体功能,而是最初这套编译烧录环境有没有被彻底梳理清楚。先跑稳最小样例,后面写再大工程都踏实。