2. GPIO基础与LED控制:数字输出、GPIO模式设置、点亮第一个LED灯
好,咱们正式开始动手了。上一章我们把ESP32的开发环境搭好,也跑通了第一个Hello World程序。但说真的,光看串口打印没什么意思,做嵌入式开发嘛,总得让硬件有点反应。这一章我们就来点亮第一个LED灯——这几乎是每个嵌入式工程师的“入门仪式”。
别看只是点个灯,这里面涉及的知识点其实挺扎实的:GPIO是什么、怎么配置、数字输出怎么用、电流和电阻怎么匹配。把这些搞明白,后面控制继电器、驱动蜂鸣器、甚至I2C通信,都是同样的思路。
2.1 什么是GPIO?
GPIO,全称General-Purpose Input/Output,通用输入输出口。说白了,就是芯片上那些可以编程控制的引脚。你可以把它设成输出模式,往外送高电平或低电平;也可以设成输入模式,读取外部信号是0还是1。
ESP32有34个GPIO引脚,但不是所有引脚都能随便用。有些引脚内部接了其他外设,比如ADC、DAC、触摸传感器,用的时候得注意别冲突。我刚开始做项目时,就踩过这个坑——选了个被占用的引脚,查了半天才发现。
| GPIO特性 | 说明 |
|---|---|
| 工作电压 | 3.3V,不能直接接5V |
| 输出电流 | 每个引脚最大40mA,建议控制在20mA以内 |
| 内部上拉/下拉 | 可配置,省去外部电阻 |
| 复用功能 | 部分引脚同时是ADC、DAC、触摸、PWM等 |
2.2 数字输出:让引脚听话
数字输出,就是让引脚输出高电平(3.3V)或低电平(0V)。在Arduino框架下,用digitalWrite()函数就能搞定。但在这之前,得先告诉芯片这个引脚要干什么——也就是设置GPIO模式。
我个人习惯,在setup()函数里先把所有用到的引脚初始化好。这样代码结构清晰,也方便后期维护。
void setup() {
pinMode(2, OUTPUT); // 设置GPIO2为输出模式
}
void loop() {
digitalWrite(2, HIGH); // 输出高电平,LED亮
delay(1000); // 延时1秒
digitalWrite(2, LOW); // 输出低电平,LED灭
delay(1000); // 延时1秒
}
这段代码,就是让GPIO2上的LED以1秒为周期闪烁。你可能会问:为什么是GPIO2?因为大多数ESP32开发板上,GPIO2都连接了一个板载LED,方便测试。
2.3 GPIO模式设置:不只是输入输出
ESP32的GPIO模式,比你想的要丰富。除了基本的OUTPUT和INPUT,还有INPUT_PULLUP、INPUT_PULLDOWN、OUTPUT_OPEN_DRAIN等。这些模式在特定场景下非常有用。
| 模式 | 用途 | 典型场景 |
|---|---|---|
| OUTPUT | 推挽输出,可输出高/低电平 | 控制LED、继电器 |
| INPUT | 高阻输入,读取外部电平 | 读取按键、传感器信号 |
| INPUT_PULLUP | 输入并启用内部上拉电阻 | 按键检测,省去外部上拉 |
| INPUT_PULLDOWN | 输入并启用内部下拉电阻 | 防止引脚悬空 |
| OUTPUT_OPEN_DRAIN | 开漏输出,需要外部上拉 | I2C总线、多设备共享线 |
INPUT_PULLUP模式。这样按键按下时读到低电平,松开时读到高电平。省一个外部电阻,电路也简洁。我曾经在一个项目里忘了设内部上拉,结果按键一直误触发,排查了半天才发现是引脚悬空导致的。
2.4 点亮第一个LED:硬件连接
好,理论说完了,咱们来动手。点亮一个LED,需要的硬件很简单:
- ESP32开发板一块
- LED灯一个(颜色随意,我习惯用红色,看得清楚)
- 220Ω电阻一个(限流用,别省)
- 杜邦线两根
- 面包板一块(可选,但推荐)
连接方式:
- LED长脚(阳极)接GPIO2
- LED短脚(阴极)串联220Ω电阻
- 电阻另一端接GND
你想想看,如果不加电阻,LED相当于直接短路到地。3.3V电压全加在LED上,电流会很大,LED很快就烧了。220Ω电阻能把电流限制在15mA左右,对LED和ESP32都安全。
2.5 完整代码与运行效果
把下面代码烧录到ESP32,你就能看到LED以1秒为周期闪烁。这是你亲手控制的第一个硬件,值得庆祝一下。
#define LED_PIN 2 // 用宏定义引脚号,方便修改
void setup() {
pinMode(LED_PIN, OUTPUT);
Serial.begin(115200);
Serial.println("LED控制程序启动");
}
void loop() {
digitalWrite(LED_PIN, HIGH);
Serial.println("LED 亮");
delay(1000);
digitalWrite(LED_PIN, LOW);
Serial.println("LED 灭");
delay(1000);
}
烧录成功后,打开串口监视器,你会看到“LED 亮”和“LED 灭”交替打印。同时,板载LED(或你外接的LED)会同步闪烁。如果LED不亮,别急,先检查接线和引脚号。
2.6 常见问题与避坑指南
我在带新人时,发现点灯这个看似简单的操作,其实有不少坑。下面列几个最常见的:
- LED不亮:先检查引脚号对不对。ESP32开发板型号不同,板载LED的引脚可能不一样。比如有些板子用GPIO2,有些用GPIO16。
- LED极暗:电阻太大了。换成100Ω或220Ω试试。如果用的是1kΩ以上电阻,LED基本看不到光。
- LED烧了:没加限流电阻,或者电阻太小。赶紧断电,换LED和合适的电阻。
- 程序烧录后没反应:检查开发板选择、端口号、波特率。有时候是串口被占用,拔掉重插就好。
2.7 本章知识体系
下面这张图,帮你梳理本章的核心知识点。从GPIO概念到模式设置,再到硬件连接和代码实现,一条线串起来。
嗯,这一章的内容就到这儿。点灯看似简单,但它是你与硬件对话的第一步。后面我们会在这个基础上,逐步加入传感器、Wi-Fi、云平台,最终搭建一个完整的智能家居系统。每一步都离不开GPIO的控制,所以这一章的基础一定要打牢。