3、LED闪烁实验:GPIO输出模式配置、digitalWrite函数、delay延时控制、搭建LED电路
好,咱们今天来点实际的。前面聊了那么多GPIO的理论,现在终于可以让LED眨眼睛了。
这个实验,说白了就是嵌入式世界的"Hello World"。你别看它简单,里面藏着的门道可不少。我当年带新人时,发现很多人连LED都不亮,问题就出在最基础的配置上。
3.1 搭建LED电路——别让灯珠烧了
先动手,再动脑。咱们把电路搭起来。
你需要准备的材料:
- ESP32开发板 × 1
- 5mm LED(颜色随意,我习惯用红色,看得清楚)
- 220Ω 电阻(别用太小的,100Ω以下风险大)
- 面包板 + 杜邦线若干
接线方式很简单:
- LED长脚(阳极) → 接GPIO引脚(比如GPIO2)
- LED短脚(阴极) → 接电阻一端
- 电阻另一端 → 接GND
为什么电阻要放在阴极侧?其实放阳极也行,但放在阴极侧有个好处:当GPIO输出低电平时,整个回路被切断,电阻上不会有压降,更安全。这是我个人的习惯。
| 元件 | 连接点 | 说明 |
|---|---|---|
| LED 阳极 | GPIO2 | 长脚,接信号 |
| LED 阴极 | 电阻 | 短脚,限流 |
| 电阻另一端 | GND | 回路闭合 |
3.2 GPIO输出模式配置——告诉芯片你要干嘛
电路搭好了,接下来是代码。ESP32的GPIO默认是输入模式,你要输出信号,得先告诉它:嘿,这个脚我要往外推电平。
在Arduino框架下,用 pinMode() 函数搞定:
pinMode(LED_BUILTIN, OUTPUT); // 把GPIO2设为输出模式
这里 LED_BUILTIN 是ESP32开发板上的一个内置定义,通常对应GPIO2。你也可以直接写数字:pinMode(2, OUTPUT)。
为什么一定要配置模式?
你想想看,GPIO内部有个多路开关,不配置的话,它可能连着输入缓冲器,也可能连着上拉电阻,甚至可能是高阻态。你直接写电平,信号根本出不去。我曾经在项目里遇到过,一个IO口怎么都拉不高,查了半天发现是忘了配模式——嗯,这种低级错误,犯过一次就记住了。
3.3 digitalWrite函数——让电平听话
配置好模式,就可以用 digitalWrite() 来控制电平了:
digitalWrite(LED_BUILTIN, HIGH); // 输出高电平,LED亮
digitalWrite(LED_BUILTIN, LOW); // 输出低电平,LED灭
这两个状态,说白了就是给GPIO内部的P-MOS和N-MOS发指令。HIGH让P-MOS导通,引脚被拉到3.3V;LOW让N-MOS导通,引脚被拉到GND。
有个细节要注意:digitalWrite() 的第二个参数,除了 HIGH/LOW,也可以传 1/0。但我建议你养成用宏定义的习惯,代码可读性会好很多。
3.4 delay延时控制——让时间慢下来
LED亮灭切换太快,肉眼跟不上。这时候就需要 delay() 函数来"踩刹车"。
delay(1000); // 暂停1000毫秒,也就是1秒
delay() 的原理很简单:让CPU在这里空转,啥也不干,直到时间到。单位是毫秒,所以 delay(500) 就是半秒。
但我要提醒你:delay() 会阻塞整个程序。在延时期间,ESP32无法响应任何其他事件——按键、传感器、WiFi连接,统统停摆。所以,实际项目中我很少用 delay(),更多是用定时器或者 millis() 来做非阻塞延时。不过,咱们现在刚入门,先用 delay() 把逻辑跑通,后面再优化。
3.5 完整代码——让LED眨起来
把上面几块拼起来,就是一个完整的LED闪烁程序:
void setup() {
pinMode(LED_BUILTIN, OUTPUT); // 配置GPIO2为输出
}
void loop() {
digitalWrite(LED_BUILTIN, HIGH); // 点亮LED
delay(1000); // 保持1秒
digitalWrite(LED_BUILTIN, LOW); // 熄灭LED
delay(1000); // 保持1秒
}
上传到ESP32,你应该能看到LED以1秒为周期闪烁。如果不亮,先检查电路:电阻有没有接?LED正负极有没有反?GPIO引脚对不对?
- LED完全不亮 → 检查接线、电阻值、GPIO编号
- LED一直亮不灭 → 检查代码中是否有LOW输出,或者GPIO被复用
- 闪烁频率不对 → 检查delay参数,单位是毫秒
3.6 知识结构图——理清脉络
下面这张图,把整个实验的逻辑串了一遍。你可以对照着看,每一步都对应着硬件或代码的哪个环节。
3.7 避坑指南——我踩过的雷
最后,分享几个我实际踩过的坑,你遇到了可以少走弯路:
- GPIO编号别搞混:ESP32的GPIO编号不是连续的,有些引脚内部有特殊功能(比如ADC、触摸)。我建议你固定用GPIO2、GPIO4、GPIO5这些安全引脚做实验。
- 上电瞬间LED闪一下:这是正常现象。ESP32启动时,GPIO默认是输入高阻态,内部上拉电阻会让引脚短暂浮空。如果你介意,可以在初始化时先拉低再配模式。
- 电阻值别省:有人觉得LED电流小,直接短接。结果就是——LED烧了,或者GPIO口内部保护二极管击穿。220Ω到1kΩ之间都行,别低于100Ω。
好了,LED闪烁实验就到这里。你动手试试,让那个小灯眨起来。代码不长,但每一步都有它的道理。后面我们会在这个基础上,玩出更多花样。