ESP32零基础教学第二章: 2.2 GPIO操作

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秒
}

函数说明:

  1. pinMode(pin, mode)

    • 作用:配置指定GPIO引脚的工作模式。
    • 参数
      • pin:GPIO引脚编号(如2)。
      • mode:引脚模式,可以是INPUT(输入模式)或OUTPUT(输出模式)。
    • 示例pinMode(LED_PIN, OUTPUT); 将GPIO2配置为输出模式。
  2. digitalWrite(pin, value)

    • 作用:设置指定GPIO引脚的电平状态。
    • 参数
      • pin:GPIO引脚编号。
      • value:电平状态,可以是HIGH(高电平)或LOW(低电平)。
    • 示例digitalWrite(LED_PIN, HIGH); 将GPIO2设置为高电平。
  3. 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
  }
}

函数说明:

  1. 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毫秒
}

函数说明:

  1. Serial.begin(baudrate)

    • 作用:初始化串口通信。
    • 参数
      • baudrate:波特率,常用值为9600、115200等。
    • 示例Serial.begin(115200); 初始化串口通信,波特率为115200。
  2. analogRead(pin)

    • 作用:读取指定ADC引脚的模拟值。
    • 参数
      • pin:ADC引脚编号(如34)。
    • 返回值:0到4095之间的整数(12位ADC)。
    • 示例analogRead(ADC_PIN) 读取GPIO34的ADC值。
  3. 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毫秒
  }
}

函数说明:

  1. 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() {
  // 主循环无需操作
}

函数说明:

  1. IRAM_ATTR

    • 作用:将函数放置在IRAM(指令RAM)中,确保中断函数能够快速执行。
    • 示例void IRAM_ATTR buttonISR() 将中断函数buttonISR放置在IRAM中。
  2. attachInterrupt(pin, ISR, mode)

    • 作用:为指定GPIO引脚配置中断。
    • 参数
      • pin:中断引脚编号,使用digitalPinToInterrupt(pin)获取。
      • ISR:中断服务函数,当中断触发时调用。
      • mode:中断触发模式,可以是RISING(上升沿)、FALLING(下降沿)或CHANGE(状态变化)。
    • 示例attachInterrupt(digitalPinToInterrupt(BUTTON_PIN), buttonISR, FALLING); 配置GPIO4在下降沿触发中断。
  3. digitalPinToInterrupt(pin)

    • 作用:将GPIO引脚编号转换为中断编号。
    • 参数
      • pin:GPIO引脚编号。
    • 返回值:中断编号。
    • 示例digitalPinToInterrupt(BUTTON_PIN) 获取GPIO4的中断编号。

效果:
每次按下按键时,LED的状态会切换。


总结

本文详细介绍了ESP32的GPIO操作,包括数字输入输出、模拟输入输出以及外部中断的使用。通过实际代码和硬件连接示例,读者可以快速掌握ESP32的基本功能。希望本文对你有所帮助!如果有任何问题,欢迎在评论区留言。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龙大大L

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值