用esp32-ble-gamepad写一个12键蓝牙手柄。长按start键5秒可以关机,长按start也可以开机。


以下是基于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连接需要时间,避免在未连接状态下频繁发送数据 - 按钮消抖处理不足可能导致误触发,建议增加硬件消抖电路 [2025-08-06 12:56:53 | AI写代码神器 | 638点数解答]
- def find_indices(text, query): # 将文本转换为小写,以实现不区分大小写的搜索 text_lower = text.lower() query_lower = query.lower() start = 0 # 初始化一个列表来存储查询内容的索引 indices = [] # 使用find方法来查找查询内容的索引 while true: start = text_lower.find(query_lower, start) if start == -1: break # 将索引添加到列表中,并更新搜索的起始位置 indices.append(start) start += 1 # 移动到找到的词的下一个字符,以避免重复计数 return indices # 文档内容 document = """ it is(231点数解答 | 2024-10-21 21:44:08)223
- 用ide 写一个 esp32 标准的蓝牙手柄。(十字方向键), a b x y l1 r1 select start,有连接状态指示灯,未连接时每秒闪一下,连接时不亮。长按start键可以关机,并关闭广播进入睡眠状态。睡眠状态下也可以长按start键退出睡眠,写出完整的工程(5792点数解答 | 2024-11-26 13:35:09)109
- 用ide 写一个 esp32 标准的蓝牙手柄。(十字方向键), a b x y l1 r1 select start,有连接状态指示灯,未连接时每秒闪一下,连接时不亮。长按start键可以关机,并关闭广播进入睡眠状态。睡眠状态下也可以长按start键退出睡眠,并写出完整的工程(2834点数解答 | 2024-11-26 13:37:12)273
- 一个 5×6 的迷宫样例如下: 要求给出从起点(1,1)到终点(3,4)的路径。 为了处理方便,保证最外圈全都为障碍物。 扩展到一般情况,一个 m×n 的迷宫,要求输出从起点(1,1)到终点(m-2,n-2)的路径。 测试实例保证路径是唯一的。 该题要求自行设计一个栈来做。如果设计的是顺序栈,则保证栈的大小不超过 200 个元素。 输入 第一行为两个整数 m 和 n,表示 m×n 的迷宫。 接下来有 m 行,每行有 n 个数(n 个数之间用空格间隔,值 = 0 表示可以通行,值 = 1 表示为障碍物) 输出 输出从起点到终点的路径,每个坐标占一行,坐标间的行号和列号用一个空格间隔。具体格式可参考样例。c++ 源代码(732点数解答 | 2024-11-03 02:34:53)348
- c语言现在有n枚硬币,其中有一枚是假的,假的硬币比真币轻,但也只轻一点点,而**和真币的外观是一模一样的,从外观上无法辨别硬币的真假,请写程序找出**。 程序的要求: 必须使用递归调用函数实现 递归函数原型必须为:int findfakecoin(int *p, int low, int high) 程序中必须包含函数:int getsum(int *p, int start, int end) main函数已经写好,请编写程序剩余部分的代码并提交。 main函数如下: int main() { int coins[n]; int m; int index; int getsum(int *p, int start, int end); int findfakecoin(int *p, int low, int high); scanf("%d", &m); for (int i = 0; i < m; ++i(497点数解答 | 2024-12-02 22:03:42)205
- select distinct t.id_card,t.`start`,t.`end` from ((select distinct(person_name), id_card , date_format( curdate(), "%y-%m-%d 00:00:00" ) start , date_format( curdate(), "%y-%m-%d 23:59:59" ) end, '1' ordertype, '-1' pass from t_contractor_people where person_name in ( select distinct ( b.executor ) from t_task_work_order a left join t_task_work_person b on a.sheet_id = b.hot_work_id where a.valid = '1' and a.work_start_time > date_format( curdate(), "%y-%m-%d 00:00:00(342点数解答 | 2024-12-05 12:31:57)156
- select distinct t.id_card,t.`start`,t.`end` from ((select distinct(person_name), id_card , date_format( curdate(), "%y-%m-%d 00:00:00" ) start , date_format( curdate(), "%y-%m-%d 23:59:59" ) end, '1' ordertype, '-1' pass from t_contractor_people where person_name in ( select distinct ( b.executor ) from t_task_work_order a left join t_task_work_person b on a.sheet_id = b.hot_work_id where a.valid = '1' and a.work_start_time > date_format( curdate(), "%y-%m-%d 00:00:00(24点数解答 | 2024-12-05 12:32:54)183
- python,帮我写几个界面,首先是登录界面,login.html登录界面(背景图为"d:\project\pythonproject1\tuijian\static\start.jpg")输入正确的账号密码才能跳转界面,同时可以选择想进入的推荐系统(choose_recommendation.html界面的背景来源为"d:\project\pythonproject1\tuijian\static\start.jpg"):有两个小图标,一个是"d:\project\pythonproject1\tuijian\static\book.webp"图书推荐,另外一个是"d:\project\pythonproject1\tuijian\static\moive.webp"电影推荐,点击图书推荐图标,跳转index1.html,点击电影图标进入index.html界面。index.html对应的数据集是"d:\project\pythonproject1\tuijian\data\ratings.csv",而index1.html是"d:\project\pythonproject1\tu(1425点数解答 | 2024-12-10 09:32:57)201
- 用esp32-ble-gamepad写一个12键蓝牙手柄。长按start键5秒可以关机,长按start也可以开机。(638点数解答 | 2025-08-06 12:56:53)67
- 用esp32-ble-gamepad编写一个12键蓝牙手柄,首先短按start开机,并且长按start键5秒可以关机(921点数解答 | 2025-08-06 13:07:38)76
- 用esp32-ble-gamepad编写一个12键蓝牙手柄,首先短按start开机,并且长按start键5秒可以关机深度休眠(1019点数解答 | 2025-08-06 13:09:37)48
- fn decode(encrypt_data: &str) { // 截取前32个字节作为key let key = hex::decode("fc27253dcc7b6d4f42f69f151d6c8c574745194b0e7609bec3fa42c644da1caf").unwrap(); // 转换key let key = key::<aes256gcm>::from_slice(&key); let encrypt_data = hex::decode(encrypt_data).unwrap(); // iv 0-12 let iv = &encrypt_data[0..12]; // 转换为 nonce let iv = nonce::from_slice(&iv); // tag 12 - 28 // let tag = &encrypt_data[12..28]; // 转换为tag // let tag = nonce::from_s(379点数解答 | 2024-07-07 01:05:44)221