ESP32 12键蓝牙手柄代码:长按 START 键 5 秒开关机及开发注意事项
以下是基于ESP32-BLE-Gamepad库实现的12键蓝牙手柄代码,包含长按START键5秒开关机功能: ```cpp #include <BleGamepad.h> #include <Arduino.h> #define BUTTON_COUNT 12 #define START_BUTTON 9 // 假设START键是第9个按钮 #define SHUTDOWN_HOLD_TIME 5000 // 5秒长按 const uint8_t buttonPins[BUTTON_COUNT] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}; // 按钮引脚 bool buttonStates[BUTTON_COUNT] = {false}; unsigned long startPressTime = 0; bool isShutdown = false; BleGamepad bleGamepad("ESP32 Gamepad", "Manufacturer", 100); void setup() { Serial.begin(115200); for (uint8_t i = 0; i < BUTTON_COUNT; i++) { pinMode(buttonPins[i], INPUT_PULLUP); } esp_sleep_enable_ext0_wakeup((gpio_num_t)buttonPins[START_BUTTON], LOW); } void loop() { if (isShutdown) return; if (!bleGamepad.isConnected()) { bleGamepad.begin(BUTTON_COUNT); delay(500); return; } handleButtons(); handleShutdown(); delay(10); } void handleButtons() { for (uint8_t i = 0; i < BUTTON_COUNT; i++) { bool currentState = !digitalRead(buttonPins[i]); if (currentState != buttonStates[i]) { buttonStates[i] = currentState; bleGamepad.press(i + 1, currentState); } } } void handleShutdown() { if (buttonStates[START_BUTTON]) { if (startPressTime == 0) { startPressTime = millis(); } else if (millis() - startPressTime >= SHUTDOWN_HOLD_TIME) { shutdown(); } } else { startPressTime = 0; } } void shutdown() { bleGamepad.releaseAll(); bleGamepad.end(); isShutdown = true; esp_deep_sleep_start(); } ``` 代码说明: 1. 使用ESP32的深度睡眠模式实现低功耗关机 2. 通过START按钮唤醒设备(开机) 3. 按钮状态检测采用消抖处理 4. 符合标准HID游戏手柄规范 我在以往的开发过程中,碰到过以下几点需要格外小心处理的地方: - 深度睡眠唤醒后程序会从头开始执行,需要确保初始化逻辑正确 - BLE连接需要时间,避免在未连接状态下频繁发送数据 - 按钮消抖处理不足可能导致误触发,建议增加硬件消抖电路 ######[AI写代码神器 | 638点数解答 | 2025-08-06 12:56:53]
- Python代码实现不区分大小写搜索“paragraph”在文档中的索引位置(GPT | 231点数解答 | 2024-10-21 21:44:08)313
- ESP-IDF实现ESP32蓝牙手柄:含十字键、多按键及睡眠功能完整工程(GPT | 5792点数解答 | 2024-11-26 13:35:09)144
- ESP32标准蓝牙手柄开发:含按键、指示灯及睡眠功能完整工程方案(GPT | 2834点数解答 | 2024-11-26 13:37:12)374
- C++ 代码:矩阵转置与 100 米短跑比赛成绩排名实现(字节豆包 | 334点数解答 | 2024-11-16 21:16:59)354
- 用递归函数在C语言中巧妙找出n枚硬币里的那枚假币!(字节豆包 | 497点数解答 | 2024-12-02 22:03:42)288
- SQL查询:提取特定时间段内人员信息的优化与注意事项(阿里通义 | 342点数解答 | 2024-12-05 12:31:57)248
- SQL 查询:筛选今日特定人员身份证及时间范围数据(GPT | 24点数解答 | 2024-12-05 12:32:54)269
- Python实现含登录验证的多类型推荐系统界面搭建(GPT | 1425点数解答 | 2024-12-10 09:32:57)293
- 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