ESP32 GPIO操作详解:从点亮LED到外部中断
ESP32是一款功能强大的微控制器,广泛应用于物联网、智能家居和嵌入式系统中。其GPIO(General Purpose Input/Output)引脚可以配置为输入或输出模式,支持数字和模拟信号的处理。本文将详细介绍ESP32的GPIO操作,包括数字输入输出、模拟输入输出以及外部中断的使用,并配有相关图片帮助理解。
2.2.1 GPIO简介
GPIO是通用输入输出引脚,可以配置为输入或输出模式。在ESP32中,GPIO引脚可以用于控制LED、读取按键状态、采集模拟信号等。
GPIO模式
- 输入模式:用于读取外部信号,如按键状态。
- 输出模式:用于控制外部设备,如点亮LED。
ESP32的GPIO引脚还支持内部上拉或下拉电阻,可以在配置时启用。
2.2.2 数字输入输出
2.2.2.1 点亮LED
硬件连接:
- 将LED的正极(长脚)连接到ESP32的GPIO引脚(如GPIO2)。
- 将LED的负极(短脚)通过一个220Ω电阻连接到GND。
代码实现:
#define LED_PIN 2 // 定义LED连接的GPIO引脚为GPIO2
void setup() {
pinMode(LED_PIN, OUTPUT); // 配置GPIO2为输出模式
}
void loop() {
digitalWrite(LED_PIN, HIGH); // 将GPIO2设置为高电平,点亮LED
delay(1000); // 延时1秒
digitalWrite(LED_PIN, LOW); // 将GPIO2设置为低电平,熄灭LED
delay(1000); // 延时1秒
}
函数说明:
-
pinMode(pin, mode)
- 作用:配置指定GPIO引脚的工作模式。
- 参数:
pin
:GPIO引脚编号(如2
)。mode
:引脚模式,可以是INPUT
(输入模式)或OUTPUT
(输出模式)。
- 示例:
pinMode(LED_PIN, OUTPUT);
将GPIO2配置为输出模式。
-
digitalWrite(pin, value)
- 作用:设置指定GPIO引脚的电平状态。
- 参数:
pin
:GPIO引脚编号。value
:电平状态,可以是HIGH
(高电平)或LOW
(低电平)。
- 示例:
digitalWrite(LED_PIN, HIGH);
将GPIO2设置为高电平。
-
delay(ms)
- 作用:延时指定毫秒数。
- 参数:
ms
:延时的毫秒数。
- 示例:
delay(1000);
延时1秒。
效果:
LED会每隔1秒闪烁一次。
2.2.2.2 按键控制LED
硬件连接:
- 将按键的一端连接到ESP32的GPIO引脚(如GPIO4)。
- 将按键的另一端连接到GND。
- 在GPIO4和VCC之间连接一个10kΩ上拉电阻。
代码实现:
#define BUTTON_PIN 4 // 定义按键连接的GPIO引脚为GPIO4
#define LED_PIN 2 // 定义LED连接的GPIO引脚为GPIO2
void setup() {
pinMode(BUTTON_PIN, INPUT); // 配置GPIO4为输入模式
pinMode(LED_PIN, OUTPUT); // 配置GPIO2为输出模式
}
void loop() {
if (digitalRead(BUTTON_PIN) == LOW) { // 检测按键是否按下
digitalWrite(LED_PIN, HIGH); // 点亮LED
} else {
digitalWrite(LED_PIN, LOW); // 熄灭LED
}
}
函数说明:
digitalRead(pin)
- 作用:读取指定GPIO引脚的电平状态。
- 参数:
pin
:GPIO引脚编号。
- 返回值:
HIGH
(高电平)或LOW
(低电平)。 - 示例:
digitalRead(BUTTON_PIN)
读取GPIO4的电平状态。
效果:
按下按键时,LED点亮;松开按键时,LED熄灭。
2.2.3 模拟输入输出
2.2.3.1 ADC(模拟输入)
ESP32内置12位ADC(模数转换器),可以将模拟信号转换为数字值。
硬件连接:
- 将电位器的中间引脚连接到ESP32的ADC引脚(如GPIO34)。
- 将电位器的另外两个引脚分别连接到VCC和GND。
代码实现:
#define ADC_PIN 34 // 定义电位器连接的ADC引脚为GPIO34
void setup() {
Serial.begin(115200); // 初始化串口通信,波特率为115200
}
void loop() {
int adcValue = analogRead(ADC_PIN); // 读取GPIO34的ADC值
Serial.println(adcValue); // 将ADC值打印到串口监视器
delay(500); // 延时500毫秒
}
函数说明:
-
Serial.begin(baudrate)
- 作用:初始化串口通信。
- 参数:
baudrate
:波特率,常用值为9600、115200等。
- 示例:
Serial.begin(115200);
初始化串口通信,波特率为115200。
-
analogRead(pin)
- 作用:读取指定ADC引脚的模拟值。
- 参数:
pin
:ADC引脚编号(如34
)。
- 返回值:0到4095之间的整数(12位ADC)。
- 示例:
analogRead(ADC_PIN)
读取GPIO34的ADC值。
-
Serial.println(value)
- 作用:将数据打印到串口监视器,并换行。
- 参数:
value
:要打印的数据,可以是整数、字符串等。
- 示例:
Serial.println(adcValue);
打印ADC值并换行。
效果:
旋转电位器时,串口监视器会显示变化的ADC值。
2.2.3.2 DAC(模拟输出)
ESP32内置8位DAC(数模转换器),可以将数字值转换为模拟信号。
硬件连接:
- 将LED的正极连接到ESP32的DAC引脚(如GPIO25)。
- 将LED的负极通过一个220Ω电阻连接到GND。
代码实现:
#define DAC_PIN 25 // 定义LED连接的DAC引脚为GPIO25
void setup() {
// 无需配置,DAC引脚默认启用
}
void loop() {
for (int i = 0; i < 255; i++) {
dacWrite(DAC_PIN, i); // 输出模拟信号,值从0到255
delay(10); // 延时10毫秒
}
}
函数说明:
dacWrite(pin, value)
- 作用:输出模拟信号到指定DAC引脚。
- 参数:
pin
:DAC引脚编号(如25
)。value
:输出值,范围为0到255(8位DAC)。
- 示例:
dacWrite(DAC_PIN, i);
输出模拟信号到GPIO25。
效果:
LED的亮度会逐渐变化。
2.2.4 外部中断
ESP32支持外部中断,可以在引脚状态变化时触发中断函数。
2.2.4.1 按键触发中断
硬件连接:
- 将按键的一端连接到ESP32的GPIO引脚(如GPIO4)。
- 将按键的另一端连接到GND。
- 在GPIO4和VCC之间连接一个10kΩ上拉电阻。
代码实现:
#define BUTTON_PIN 4 // 定义按键连接的GPIO引脚为GPIO4
#define LED_PIN 2 // 定义LED连接的GPIO引脚为GPIO2
void IRAM_ATTR buttonISR() {
digitalWrite(LED_PIN, !digitalRead(LED_PIN)); // 切换LED状态
}
void setup() {
pinMode(BUTTON_PIN, INPUT); // 配置GPIO4为输入模式
pinMode(LED_PIN, OUTPUT); // 配置GPIO2为输出模式
attachInterrupt(digitalPinToInterrupt(BUTTON_PIN), buttonISR, FALLING); // 配置下降沿触发中断
}
void loop() {
// 主循环无需操作
}
函数说明:
-
IRAM_ATTR
- 作用:将函数放置在IRAM(指令RAM)中,确保中断函数能够快速执行。
- 示例:
void IRAM_ATTR buttonISR()
将中断函数buttonISR
放置在IRAM中。
-
attachInterrupt(pin, ISR, mode)
- 作用:为指定GPIO引脚配置中断。
- 参数:
pin
:中断引脚编号,使用digitalPinToInterrupt(pin)
获取。ISR
:中断服务函数,当中断触发时调用。mode
:中断触发模式,可以是RISING
(上升沿)、FALLING
(下降沿)或CHANGE
(状态变化)。
- 示例:
attachInterrupt(digitalPinToInterrupt(BUTTON_PIN), buttonISR, FALLING);
配置GPIO4在下降沿触发中断。
-
digitalPinToInterrupt(pin)
- 作用:将GPIO引脚编号转换为中断编号。
- 参数:
pin
:GPIO引脚编号。
- 返回值:中断编号。
- 示例:
digitalPinToInterrupt(BUTTON_PIN)
获取GPIO4的中断编号。
效果:
每次按下按键时,LED的状态会切换。
总结
本文详细介绍了ESP32的GPIO操作,包括数字输入输出、模拟输入输出以及外部中断的使用。通过实际代码和硬件连接示例,读者可以快速掌握ESP32的基本功能。希望本文对你有所帮助!如果有任何问题,欢迎在评论区留言。