ESP32 定时器:摆脱 delay 的非阻塞编程
本文由 AI 协助整理,代码和验证步骤适用于学习记录。不同开发板、外设型号与库版本可能导致细节差异,请以实际硬件现象为准。

本节目标
用 millis 管理周期任务,让 LED、按键和传感器逻辑不再互相阻塞。
为什么从这里开始
delay 在第一个实验里很友好,等第二个功能出现就开始像一位霸占话筒的同学:它讲话时别的事情都得等着。用 millis 做非阻塞定时并不复杂,难的是改变思路,从“等一会儿再做”转成“到时间了吗”。这种写法后面会自然过渡到状态机和任务调度,是值得早一点练熟的小习惯。
对我来说,学习嵌入式最怕的不是不会写代码,而是把一堆“应该可以”的假设叠在一起。于是这篇只设一个可观察的小目标:让一个输入、一段程序和一个输出之间的因果关系清楚可见。做到这里并不代表项目毕业,只代表下一步终于有了能站稳的地板。
我的实践计划
同时让 LED 每秒翻转、串口每两秒输出一次。
实际动手时,我会先断电检查接线,再上电观察启动日志,然后只修改一个变量做对照。这样做有点像给问题排队:一次同时改电源、引脚、库版本和代码,最后即使成功了,也不知道到底是谁立了功。这一阶段开始出现时间、并发和网络。程序能运行不等于行为可靠,最好为连接、重试和失败留出位置。
建议顺手在笔记本里记录三项内容:板子型号和供电方式、使用的库版本、出现现象时的完整日志。它们听上去像实验课的老生常谈,但当“昨天明明能跑”的程序今天突然沉默时,这三项通常比记忆可靠得多。
最小代码
unsigned long last=0;
void loop(){ if(millis()-last>=1000){ last=millis(); digitalWrite(2,!digitalRead(2)); } }
原理笔记
这段代码刻意写得小,不是因为真实项目只有这么一点复杂度,而是为了把变量数量压到最低。硬件连接决定电平、总线或供电条件,程序负责读取与状态转换,串口日志用于验证现象。先用最小示例确认每一层,再叠加网络、界面或持久化功能,排错成本会低很多。
读示例时我会问自己三个问题:这一行代码依赖什么前置条件?它失败时能看到什么现象?如果换成另一块 ESP32 开发板,哪些地方需要重新确认?这三个问题有点扫兴,但很能防止把示例当魔法咒语。尤其是引脚编号、外设能力和第三方库版本,往往比语法本身更容易让人绕圈。
我打算怎样判断成功
成功不只看“编译通过”。我会优先寻找可重复的证据:例如 LED 是否按预期节奏变化、串口是否输出稳定状态、浏览器或手机是否收到正确响应、传感器数值是否会随真实环境变化。若现象偶尔出现一次,我会先把它归为“值得继续观察”,而不是立刻写成结论。嵌入式设备很擅长在你最想截图时表现正常,过五分钟再给你一点新剧情。
如果结果不符合预期,排查顺序通常是:供电和共地、物理接线、板型与端口、最小代码、库版本、业务逻辑。这个顺序并不华丽,却能避免一上来就钻进复杂代码。每修正一个点都重新做一次最小验证,留下前后差异,后续写成文章时也能讲清楚“问题如何被缩小”,而不是只展示幸运的最终画面。
验证步骤与预期现象
- 先确认基础条件。 上电前检查供电电压、GND 是否共地、开发板型号和所选编译目标是否一致。首次烧录后打开 115200 波特率的串口监视器,确认没有持续重启或乱码;如果有,先回到线缆、端口和供电排查,不要急着修改业务代码。
- 只验证一个变量。 按照本节的连接方式运行最小代码,然后只改变一个可见条件,例如按下按键、旋转电位器、断开网络或刷新浏览器。预期现象应能与代码中的输入、状态转换和输出一一对应;能够解释“为什么变化”比只看到一次成功更重要。
- 重复三次观察稳定性。 重启开发板、重新烧录或断电再上电后重复操作。若每次都得到同类结果,说明基础流程基本可靠;若偶发失败,记录当时的串口信息、供电方式和外设状态,把它作为后续排错线索,而不是悄悄忽略。
- 记录本次结论。 本节完成后,建议在代码仓库或文章末尾补充自己的开发板型号、库版本和一张实际接线/串口截图。这样下次重做实验时,面对的是一份可复现的记录,而不是“我记得当时是能跑的”。
容易踩坑
用 unsigned long 计算时间差,避免 millis 溢出时的比较错误。
我还会提醒自己,网上的大量代码片段有明确的板型、库版本和时间背景。复制前先看它解决的是什么问题,再看它的前提是否和手头硬件一致。能运行的代码不一定是理解后的代码;把关键参数改一遍、解释一遍,才算真的把它从别人的电脑搬到了自己的项目里。
参考
- Espressif 官方文档
- 所有第三方库的 API 与引脚说明,以当前版本文档为准。
打赏
如果这篇学习记录对你有帮助,欢迎扫码支持后续整理。

打赏支持:王庆岩
下一篇接触 ESP32 的 FreeRTOS 任务。
浙公网安备 33010602011771号