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);
}
五、代码解析
-
按键输入模式
使用INPUT_PULLUP内部上拉模式,按键未按下时电平为高(1),按下后电平为低(0)。 -
按键扫描函数
key_scan()- 检测 4 个按键是否有被按下。
- 加入 10ms 消抖 处理,避免由于机械抖动导致的误触发。
- 返回按下的按键编号(K1-K4)。
-
主循环
loop()- 读取按键状态,如果任意按键被按下,则翻转
g_led1_sta(LED 状态)。 - 用
digitalWrite()输出当前状态控制 LED 亮灭。
- 读取按键状态,如果任意按键被按下,则翻转
六、实验现象
将程序下载到 ESP32-S3 后:
- 按下 K1、K2、K3 或 K4 中的任意一个,LED 会切换亮灭状态。
- 多次按键可以反复切换 LED 状态。
七、注意事项
- 按键为机械结构,会产生抖动,所以需要 软件消抖。
- 使用
INPUT_PULLUP可以减少外部电阻元件,接线更简单。 - GPIO1 在部分 ESP32-S3 板上可能涉及下载串口功能,调试时注意避免冲突。
八、总结
本实验演示了如何使用 ESP32-S3 读取多路独立按键并控制 LED,实现了基本的 输入→处理→输出 的控制流程。
这是所有复杂交互的基础,后续可以扩展为按键控制蜂鸣器、继电器、OLED 菜单等功能。

浙公网安备 33010602011771号