巧用 esp32 - ble - gamepad:打造 12 键蓝牙手柄,短按开机长按关机,附代码及注意事项
以下是使用`esp32-ble-gamepad`库编写一个12键蓝牙手柄的代码示例,该手柄支持短按`start`开机,长按`start`键5秒关机: ```cpp #include <BleGamepad.h> // 定义按键引脚 const int startButtonPin = 2; // 假设start按键连接到GPIO 2 const int buttonPins[12] = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13}; // 12个按键引脚 // 定义BleGamepad对象 BleGamepad bleGamepad; // 记录start按键按下的时间 unsigned long startPressTime = 0; // 记录手柄是否已开机 bool isPoweredOn = false; void setup() { // 初始化串口通信 Serial.begin(115200); // 设置按键引脚为输入模式 for (int i = 0; i < 12; i++) { pinMode(buttonPins[i], INPUT_PULLUP); } // 初始化蓝牙手柄 bleGamepad.begin(); } void loop() { // 读取start按键状态 bool startButtonState = digitalRead(startButtonPin); if (!startButtonState) { // start按键被按下 if (startPressTime == 0) { // 记录按下时间 startPressTime = millis(); } // 检查是否长按5秒 if (millis() - startPressTime >= 5000 && isPoweredOn) { // 关机 bleGamepad.end(); isPoweredOn = false; startPressTime = 0; Serial.println("Power off"); } } else { // start按键被释放 if (startPressTime != 0) { if (millis() - startPressTime < 5000) { // 短按 if (!isPoweredOn) { // 开机 bleGamepad.begin(); isPoweredOn = true; Serial.println("Power on"); } } startPressTime = 0; } } if (isPoweredOn) { // 读取其他12个按键状态并发送到蓝牙手柄 for (int i = 0; i < 12; i++) { bool buttonState = digitalRead(buttonPins[i]); if (!buttonState) { bleGamepad.press(i + 1); // 按键编号从1开始 } else { bleGamepad.release(i + 1); } } } } ``` 代码说明 1. 引脚定义:定义了`start`按键的引脚和其他12个按键的引脚。 2. 初始化:在`setup`函数中,初始化串口通信、按键引脚和蓝牙手柄。 3. 按键检测:在`loop`函数中,检测`start`按键的按下和释放状态。如果短按`start`按键且手柄未开机,则开机;如果长按`start`按键5秒且手柄已开机,则关机。 4. 按键状态发送:如果手柄已开机,读取其他12个按键的状态并发送到蓝牙手柄。 需要小心的地方 我在以往的开发过程中,碰到过以下几点需要格外小心处理的地方: 1. 按键消抖:实际应用中,按键可能会出现抖动现象,导致误触发。可以添加按键消抖逻辑,例如使用延时或硬件消抖电路。 2. 蓝牙连接稳定性:蓝牙连接可能会受到干扰或距离限制,导致连接不稳定。可以在代码中添加重连逻辑,确保蓝牙连接的稳定性。 3. 电源管理:长时间使用蓝牙手柄可能会消耗大量电量。可以考虑添加电源管理功能,例如在手柄闲置一段时间后自动关机。 ######[AI写代码神器 | 921点数解答 | 2025-08-06 13:07:38]
- C++ 代码:矩阵转置与 100 米短跑比赛成绩排名实现(字节豆包 | 334点数解答 | 2024-11-16 21:16:59)354
- ESP-IDF实现ESP32蓝牙手柄:含十字键、多按键及睡眠功能完整工程(GPT | 5792点数解答 | 2024-11-26 13:35:09)143
- ESP32标准蓝牙手柄开发:含按键、指示灯及睡眠功能完整工程方案(GPT | 2834点数解答 | 2024-11-26 13:37:12)374
- ESP32 12键蓝牙手柄代码:长按 START 键 5 秒开关机及开发注意事项(DeepSeek | 638点数解答 | 2025-08-06 12:56:53)111
- 巧用 esp32 - ble - gamepad:打造 12 键蓝牙手柄,短按开机长按关机,附代码及注意事项(字节豆包 | 921点数解答 | 2025-08-06 13:07:38)162
- ESP32-ble-gamepad实现12键蓝牙手柄:短按开机、长按5秒深度休眠及开发注意事项(字节豆包 | 1019点数解答 | 2025-08-06 13:09:37)99
- C++ 实现:统计 1 到 n 所有整数中数字 1 的出现个数(字节豆包 | 118点数解答 | 2026-01-14 22:06:25)50
- C++ 实现统计 1 到 n 中数字 1 个数:开发中需小心的三处陷阱 (字节豆包 | 413点数解答 | 2026-01-26 17:56:10)42
- C++ 计算 1 到 n 中数字 1 的出现次数的实现与解析(字节豆包 | 849点数解答 | 2026-04-11 20:24:18)16
- Java:设计圆类与圆柱体类并计算属性及体积表面积(字节豆包 | 470点数解答 | 2024-10-20 10:03:11)191
- Java 实现矩形与长方体类,精准计算底面积与体积(字节豆包 | 319点数解答 | 2024-10-20 10:25:46)298
- Java 实现矩形与长方体类,轻松计算底面积和体积(字节豆包 | 308点数解答 | 2024-10-20 10:34:27)280