
给ESP32写固件,最烦的一步往往不是代码本身,而是代码里那两行写死的WiFi账号密码。固件烧进去了,换个环境、换个路由器,就得重新改代码、重新编译、重新烧录——对要装进小车、机器人、传感器盒子里的设备来说,这个流程每挪一个地方就要重来一次。这一篇把"配网"这件事一次讲透:用WiFiManager这套方案,让ESP32自己开一个热点,手机连上去在网页里选WiFi输密码,之后它就一直记得。两条实现路线,Arduino和MicroPython各一条,都基于真实可查的开源代码。
原理:配网到底发生了什么
WiFiManager的核心思路不复杂,整个流程可以拆成四步。设备第一次上电时还没有任何已保存的凭据,它会启动成AP模式,也就是自己当热点;你用手机或电脑连上这个热点,浏览器访问192.168.4.1,会看到它提供的配置页面,页面里会列出周围扫到的所有WiFi;选中自己的网络、输入密码提交后,凭据被存进flash,设备重启并切到Station模式去连你选的那个网络。连上了,流程结束;连不上或者下次上电又失败,它就再次变回热点等你重新配置。

这个流程图是WiFiManager库作者在GitHub仓库里给出的官方示意,把"已保存凭据直接连、失败就回落到AP配网"这两条分支画得很清楚。理解这张图,后面两条技术路线的代码就都只是对它的翻译。
Arduino路线:tzapu的WiFiManager库
Arduino IDE里做配网,事实标准就是tzapu的WiFiManager库,在库管理器搜WiFiManager装作者的版本即可,也可以去GitHub仓库(github.com/tzapu/WiFiManager)下ZIP离线装。仓库examples目录里的Basic示例最能说明问题,代码一共二十几行:
#include "WiFiManager.h" // https://github.com/tzapu/WiFiManager
void setup() {
// WiFi.mode(WIFI_STA); // explicitly set mode, esp defaults to STA+AP
// it is a good practice to make sure your code sets wifi mode how you want it.
// put your setup code here, to run once:
Serial.begin(115200);
//WiFiManager, Local intialization. Once its business is done, there is no need to keep it around
WiFiManager wm;
// reset settings - wipe stored credentials for testing
// these are stored by the esp library
// wm.resetSettings();
// Automatically connect using saved credentials,
// if connection fails, it starts an access point with the specified name ( "AutoConnectAP"),
// if empty will auto generate SSID, if password is blank it will be anonymous AP (wm.autoConnect())
// then goes into a blocking loop awaiting configuration and will return success result
bool res;
// res = wm.autoConnect(); // auto generated AP name from chipid
// res = wm.autoConnect("AutoConnectAP"); // anonymous ap
res = wm.autoConnect("AutoConnectAP","password"); // password protected ap
if(!res) {
Serial.println("Failed to connect");
// ESP.restart();
}
else {
//if you get here you have connected to the WiFi
Serial.println("connected...yeey :)");
}
}
void loop() {
// put your main code here, to run repeatedly:
}
真正的配网逻辑浓缩在一句res = wm.autoConnect("AutoConnectAP","password")里:两个参数分别是ESP32自己开出的热点的名字和密码,不传的话库名字会按芯片ID自动生成、热点不设密码。返回值是布尔量,true代表已经连上你配置的网络,false代表失败。注意一个细节:如果启动了配置门户,autoConnect是阻塞的,程序会停在这一行等你在网页里完成配置,做小车或机器人的话要意识到这段时间主循环不会跑。
调试的时候有个特别有用的方法:wm.resetSettings(),把已保存的凭据清掉,方便反复测试配网流程。示例里它以注释形式留着,需要时取消注释烧一次就行。
MicroPython路线:wifimgr模块
如果板子刷的是MicroPython固件,社区常用的是tayfunulu写的wifimgr库。它不是标准库,要先把wifimgr.py这一个文件传到板子的文件系统里——用Thonny或uPyCraft都行,保存时文件名必须是wifimgr.py,之后主脚本里一行import就能用:

import wifimgr
在主程序开头调用它的get_connection,整个"有凭据就连、没凭据就开热点等配置"的判断都替你做好了:
wlan = wifimgr.get_connection()
if wlan is None:
print("Could not initialize the network connection.")
while True:
pass # you shall not pass :D
返回的wlan就是一个正常的network.WLAN(STA_IF)实例,后面该干什么干什么。这个库有个MicroPython特有的坑:ESP32先当AP、之后切Station的过程中,可能留下一个没关干净的socket,第二次跑代码就会报OSError甚至崩溃。Random Nerd Tutorials那篇教程给的处理办法是建socket时包一层try/except,出错就直接重启板子,让第二次运行拿到干净状态:
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind(('', 80))
s.listen(5)
except OSError as e:
machine.reset()
另外这个库占内存不少,往板上保存脚本时偶尔会撞MemoryError,重启一次再存就正常——教程作者自己也确认了这个现象,属于已知问题,不是你烧坏了什么。
配网现场:手机上四步走完
两条路线烧好之后,现场操作完全一样。以MicroPython为例,主脚本上传后按一下板上RST(EN)键,Shell里会看到ESP32已经开成热点的提示:

打开手机WiFi设置,列表里会出现名为WifiManager的热点(这是MicroPython库默认的AP名,Arduino路线则是你在autoConnect里填的名字),密码tayfunulu——这个默认密码在库代码开头就能改。连上热点后浏览器打开192.168.4.1,配置页面会扫出周围的WiFi并按信号强度排好,选中自己的网络、填密码、提交:

几秒钟后页面给出成功提示,凭据已写入,ESP32切回Station模式。回到你的路由器侧确认,Shell里会打出分配到的IP:

以后每次上电,设备都会自动去连这个记住的网络,不再需要任何人工干预。Arduino路线多了个好处:那个192.168.4.1的门户页面还带Info(看设备信息)、Update(OTA更新)几个入口,板子放在外壳里也能刷固件。
几个容易栽的坑
第一,阻塞问题。autoConnect在等配置时是死等的,量产设备务必用setConfigPortalTimeout设定门户超时,超时后走你自己的降级逻辑,别让小车停在配网页面上不动。第二,密码安全。示例代码里"password"只是测试值,真实设备热点要么换强密码要么不设密码配合短超时,机器人带到外地演示时尤其注意。第三,验证凭据是否还在最简单的办法就是resetSettings后重走一遍流程,测完记得再注释回去。第四,MicroPython路线的socket残留崩溃,上面那段try/except重置就是针对性解法,别去别处找偏方。
把配网做成设备的标准能力,是ESP32项目从"演示品"走向"能拿出门的设备"的分水岭。Arduino和MicroPython两条路线的库都经过社区多年打磨,挑顺手的用就行——真要说区别,Arduino路线功能更全(OTA、自定义参数页都有现成的),MicroPython路线胜在调试迭代快。下一篇打算把自定义参数页讲一下:配网时顺手把机器人的名字、服务器地址一起配了。











这个确实刚需,我第一块ESP32就是写死了家里路由器密码,拿去学校演示当场社死,回来连夜把autoConnect加上才缓过来。文里那句“阻塞的autoConnect”一定要划重点,我第一次用的时候小车就停在配网页面不动,查了半天才知道主循环根本没跑。
resetSettings()这个方法太好用了,调试配网流程全靠它
MicroPython那个socket残留的坑我踩过,报错信息一堆还以为是固件版本问题,原来是AP切Station留下的socket没关。机器重启大法虽然糙但真有效。
问一下Arduino路线那个门户页面自带OTA更新,刷固件不用拆壳?那对装了外壳的机器人太友好了