ESP32-S3 控制 按键

ESP32-S3 按键控制实验

一、实验简介

按键是嵌入式开发中最常用的输入设备之一,通过它我们可以实现用户与系统的交互。

本实验将使用 ESP32-S3 连接 4 个独立按键,控制一个 LED 灯的亮灭。无论按下哪个按键,LED 都会切换当前状态(亮 ↔ 灭)。

二、硬件准备

  • ESP32-S3 开发板 × 1
  • 独立按键模块 × 1(4 个按键:K1、K2、K3、K4)
  • LED 模块(带限流电阻) × 1
  • 杜邦线若干
  • USB 数据线 × 1

三、接线说明

1. 按键模块接线(ESP32-S3 → 按键模块)

按键引脚 ESP32-S3 引脚
K1 GPIO1
K2 GPIO38
K3 GPIO39
K4 GPIO40
GND GND

2. LED 模块接线(ESP32-S3 → LED 模块)

LED 引脚 ESP32-S3 引脚
D1 GPIO3
GND GND

接线示意:

按键模块:K1-K4 → GPIO1, GPIO38, GPIO39, GPIO40
LED 模块:D1 → GPIO3

四、程序代码

// 定义按键控制管脚
#define key1_pin  1 
#define key2_pin  38
#define key3_pin  39
#define key4_pin  40

// 定义LED控制管脚
#define led1_pin  3

// 类型重定义
typedef unsigned char u8;

// 全局变量
u8 g_key = 0;
u8 g_led1_sta = 0;

// 宏定义按键键值
#define KEY1_PRESS  1
#define KEY2_PRESS  2
#define KEY3_PRESS  3
#define KEY4_PRESS  4
#define KEY_UNPRESS 0 

// 按键扫描函数
u8 key_scan(u8 mode) {
  static u8 key = 1;
  if (mode) key = 1; // 连续扫描模式

  if (key == 1 && 
      (digitalRead(key1_pin) == 0 || digitalRead(key2_pin) == 0 || 
       digitalRead(key3_pin) == 0 || digitalRead(key4_pin) == 0)) {
    delay(10); // 消抖
    key = 0;
    if (digitalRead(key1_pin) == 0) return KEY1_PRESS;
    else if (digitalRead(key2_pin) == 0) return KEY2_PRESS;
    else if (digitalRead(key3_pin) == 0) return KEY3_PRESS;
    else if (digitalRead(key4_pin) == 0) return KEY4_PRESS;
  }
  else if (digitalRead(key1_pin) == 1 && digitalRead(key2_pin) == 1 &&
           digitalRead(key3_pin) == 1 && digitalRead(key4_pin) == 1) {
    key = 1; // 无按键按下,恢复检测状态
  }
  return KEY_UNPRESS;   
}

void setup() {
  // 设置按键引脚为输入上拉模式
  pinMode(key1_pin, INPUT_PULLUP);
  pinMode(key2_pin, INPUT_PULLUP);
  pinMode(key3_pin, INPUT_PULLUP);
  pinMode(key4_pin, INPUT_PULLUP);

  // 设置LED引脚为输出模式
  pinMode(led1_pin, OUTPUT);
  digitalWrite(led1_pin, 0); // 初始关闭LED
}

void loop() {
  g_key = key_scan(0); // 检测按键
  if (g_key == KEY1_PRESS || g_key == KEY2_PRESS ||
      g_key == KEY3_PRESS || g_key == KEY4_PRESS) {
    g_led1_sta = !g_led1_sta; // 翻转LED状态
  }
  digitalWrite(led1_pin, g_led1_sta);
}

五、代码解析

  1. 按键输入模式
    使用 INPUT_PULLUP 内部上拉模式,按键未按下时电平为高(1),按下后电平为低(0)。

  2. 按键扫描函数 key_scan()

    • 检测 4 个按键是否有被按下。
    • 加入 10ms 消抖 处理,避免由于机械抖动导致的误触发。
    • 返回按下的按键编号(K1-K4)。
  3. 主循环 loop()

    • 读取按键状态,如果任意按键被按下,则翻转 g_led1_sta(LED 状态)。
    • digitalWrite() 输出当前状态控制 LED 亮灭。

六、实验现象

将程序下载到 ESP32-S3 后:

  • 按下 K1、K2、K3 或 K4 中的任意一个,LED 会切换亮灭状态。
  • 多次按键可以反复切换 LED 状态。

七、注意事项

  • 按键为机械结构,会产生抖动,所以需要 软件消抖
  • 使用 INPUT_PULLUP 可以减少外部电阻元件,接线更简单。
  • GPIO1 在部分 ESP32-S3 板上可能涉及下载串口功能,调试时注意避免冲突。

八、总结

本实验演示了如何使用 ESP32-S3 读取多路独立按键并控制 LED,实现了基本的 输入→处理→输出 的控制流程。

这是所有复杂交互的基础,后续可以扩展为按键控制蜂鸣器、继电器、OLED 菜单等功能。

posted @ 2025-08-16 09:11  jeikerxiao  阅读(187)  评论(0)    收藏  举报