当前位置: 首页 > article >正文

别再死磕USB HID了!用ESP32的Arduino框架手把手教你实现蓝牙鼠标键盘(附完整代码)

ESP32蓝牙HID实战零基础打造自定义键盘鼠标手里那块吃灰的ESP32开发板终于能派上用场了上周我用它做了个无线演示控制器在会议室里走着就能翻PPT同事们都问是怎么实现的。其实秘诀就在于ESP32的蓝牙HID功能——不需要任何USB线缆也不用理解复杂的HID协议栈用Arduino框架几个现成的库就能搞定。1. 开发环境准备1.1 硬件选择建议ESP32系列开发板中这些型号特别适合HID项目型号蓝牙版本内置Flash推荐场景ESP32-WROOM4.24MB基础键盘鼠标ESP32-S2不支持4MB仅USB HIDESP32-C35.04MB低功耗HID设备我用的是一块淘来的ESP32-WROOM-32D价格不到30元。别被开发板上那些密密麻麻的引脚吓到我们实际只需要用到USB接口供电和烧录Boot按钮下载模式切换EN按钮复位1.2 软件环境配置首先确保Arduino IDE已安装ESP32支持包。如果还没安装在首选项的附加开发板管理器网址中添加https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json然后安装这两个关键库#include BleCompositeHID.h #include BleMouse.h #include BleKeyboard.h库安装完成后在开发板管理器中选择ESP32 Dev Module。有个小技巧把编译优化等级调到Faster可以显著减少编译时间。2. 蓝牙鼠标快速实现2.1 基础鼠标功能让我们从最简单的鼠标移动开始。新建一个Arduino项目输入以下代码BleMouse mouse(ESP32-Mouse, MakerSpace, 100); void setup() { Serial.begin(115200); mouse.begin(); } void loop() { if(mouse.isConnected()) { mouse.move(10, 0); // 向右移动10像素 delay(500); mouse.click(MOUSE_LEFT); // 左键单击 delay(500); } }上传代码后在电脑蓝牙设置里会发现名为ESP32-Mouse的设备。连接成功后你会看到光标每秒钟向右移动一次并自动点击。2.2 高级鼠标控制实际项目中我们可能需要更精细的控制。比如做一个演示翻页器#define BUTTON_PIN 0 // 使用GPIO0作为按钮 BleMouse mouse; void setup() { pinMode(BUTTON_PIN, INPUT_PULLUP); mouse.begin(); } void loop() { static bool lastState HIGH; bool currentState digitalRead(BUTTON_PIN); if(currentState LOW lastState HIGH) { mouse.move(0, 0, 1); // 滚轮向下滚动 } lastState currentState; delay(50); }这个代码实现了使用开发板上的Boot按钮(GPIO0)控制按下时触发滚轮滚动内置防抖处理常见问题排查如果设备不可见检查蓝牙是否启用连接不稳定时尝试降低BLE广播间隔按键无响应时检查GPIO模式设置3. 蓝牙键盘实战3.1 基础键盘功能键盘的实现同样简单。以下代码实现了一个发送组合键的宏键盘BleKeyboard keyboard(ESP32-Keyboard, MakerSpace, 100); void setup() { keyboard.begin(); } void loop() { if(keyboard.isConnected()) { keyboard.press(KEY_LEFT_CTRL); keyboard.press(s); delay(100); keyboard.releaseAll(); delay(5000); } }这段代码每5秒发送一次CtrlS保存组合键。实际测试时建议先打开记事本观察效果。3.2 多媒体键盘扩展ESP32还能模拟多媒体键盘。比如做个音乐控制器#include BleKeyboard.h BleKeyboard keyboard; void setup() { keyboard.begin(); } void sendMediaKey(uint8_t key) { keyboard.write(key); delay(200); } void loop() { if(keyboard.isConnected()) { sendMediaKey(KEY_MEDIA_PLAY_PAUSE); delay(3000); sendMediaKey(KEY_MEDIA_VOLUME_UP); delay(1000); } }支持的多媒体键包括KEY_MEDIA_PLAY_PAUSEKEY_MEDIA_VOLUME_UP/DOWNKEY_MEDIA_MUTEKEY_MEDIA_NEXT_TRACKKEY_MEDIA_PREVIOUS_TRACK4. 复合设备与高级应用4.1 键盘鼠标二合一真正的生产力工具应该同时具备键盘和鼠标功能。使用BleCompositeHID库可以轻松实现#include BleCompositeHID.h BleCompositeHID compositeHID(ESP32-Combo); BleKeyboard keyboard; BleMouse mouse; void setup() { keyboard.setBatteryLevel(80); mouse.setBatteryLevel(80); compositeHID.addHID(keyboard); compositeHID.addHID(mouse); compositeHID.begin(); } void loop() { if(compositeHID.isConnected()) { mouse.move(random(-5,5), random(-5,5)); delay(100); if(millis() % 5000 0) { keyboard.print(Hello from ESP32!\n); } } }这个例子展示了同时模拟键盘和鼠标设置虚拟电量显示随机移动鼠标光标定时发送字符串4.2 游戏控制器实现通过修改HID描述符ESP32还能变身游戏手柄。需要先定义特殊的报告映射static const uint8_t gamepadReportMap[] { 0x05, 0x01, 0x09, 0x05, 0xA1, 0x01, 0x15, 0x00, 0x25, 0x01, 0x35, 0x00, 0x45, 0x01, 0x75, 0x01, // 省略具体描述符... }; BleGamepad gamepad(ESP32-Gamepad); void setup() { gamepad.setReportMap(gamepadReportMap, sizeof(gamepadReportMap)); gamepad.begin(); } void loop() { if(gamepad.isConnected()) { gamepad.setAxes(127, 0, 0, 0, 0, 0, 0, 0); delay(100); } }完整实现需要约50字节的报告描述符可以在GitHub上找到现成的模板。实际测试时这个方案在Android和Windows上都能被识别为标准的游戏控制器。5. 功耗优化与稳定性5.1 低功耗配置默认设置下ESP32蓝牙功耗约20mA通过以下调整可降至5mA以下#include BLEDevice.h void setup() { BLEDevice::setPower(ESP_PWR_LVL_N12); // 最低功率 bleKeyboard.begin(); esp_ble_conn_update_params_t params; params.latency 6; // 增加连接间隔 esp_ble_gap_update_conn_params(params); }关键优化点设置发射功率为-12dBm增加连接间隔到100ms禁用不必要的蓝牙服务5.2 连接稳定性技巧在办公室这种无线环境复杂的地方这些设置能显著改善连接质量void improveConnection() { esp_wifi_set_ps(WIFI_PS_NONE); // 禁用Wi-Fi省电 esp_ble_tx_power_set(ESP_BLE_PWR_TYPE_DEFAULT, ESP_PWR_LVL_P9); esp_ble_gap_set_prefer_conn_params(6, 12, 0, 400); }实测发现将发射功率提升到9dBm后连接距离从5米延长到了15米。不过要注意这会增加功耗建议根据实际需求调整。

相关文章:

别再死磕USB HID了!用ESP32的Arduino框架手把手教你实现蓝牙鼠标键盘(附完整代码)

ESP32蓝牙HID实战:零基础打造自定义键盘鼠标 手里那块吃灰的ESP32开发板终于能派上用场了!上周我用它做了个无线演示控制器,在会议室里走着就能翻PPT,同事们都问是怎么实现的。其实秘诀就在于ESP32的蓝牙HID功能——不需要任何USB…...

深度解析网络设备权限管理工具:中兴光猫工厂模式与Telnet服务完整指南

深度解析网络设备权限管理工具:中兴光猫工厂模式与Telnet服务完整指南 【免费下载链接】zteOnu A tool that can open ZTE onu device factory mode 项目地址: https://gitcode.com/gh_mirrors/zt/zteOnu 在当今网络设备管理领域,获取设备完整控制…...

告别SVN恐惧症:美术策划也能轻松上手的Unity PlasticSCM极简入门(附团队项目拉取实战)

告别SVN恐惧症:美术策划也能轻松上手的Unity PlasticSCM极简入门(附团队项目拉取实战) 在游戏开发团队中,版本控制系统是协作的基石,但传统工具如SVN往往让非技术成员望而生畏。当美术资源频繁更新、策划案不断迭代时&…...

C++ vector容器总结

vector基本概念功能:vector数据结构和数组非常相似,也称为单端数组vector与普通数组区别:不同之处在于数组是静态空间,而vector可以动态扩展动态扩展:并不是在原空间之后续接新空间,而是找更大的内存空间&a…...

交流电机驱动器的三种控制模式:前沿切相、后沿切相与同步模式详解

1. 项目概述:一个能玩出花的交流电机驱动器在汽车改装、工业控制或者一些创客项目里,驱动一个交流电机听起来简单,但想让它听话地变速、正反转,甚至实现软启动和精确同步,往往就得搬出笨重又昂贵的工业变频器。今天分享…...

phpMyAdmin CVE-2018-12613:从文件读取到RCE的伪协议利用链

1. 这个漏洞不是“能读文件”那么简单,而是后台权限的彻底失守phpMyAdmin 4.8.1里那个CVE-2018-12613,很多人扫到就报个“存在文件包含”,顺手贴个?targetphp://filter/convert.base64-encode/resource/etc/passwd截图完事。我去年在给一家教…...

<背包问题>

背包问题是一类组合优化问题,其基本形式是给定一组物品,每个物品都有一个重量和一个价值,以及一个有限的背包容量,目标是在不超过背包容量的前提下,选择物品使得背包中的物品价值最大化。动态规划是解决背包问题的常用…...

基于雷达与光敏传感器的低功耗智能窗防设备设计与实现

1. 项目概述:一个基于雷达与光敏的智能窗防设备几年前,我因为一次短暂的出差,家里空置了几天,回来后就一直琢磨着怎么给家里的窗户加点“动静”。市面上的智能安防摄像头固然好,但要么需要复杂的布线,要么云…...

武汉国电华美16875kVA串联谐振试验装置,这手活儿细

在超高压变电站和长距离电缆的现场,交流耐压试验是检验设备绝缘的“最后一关”。这位老师傅经手过不少大工程,他说,面对GIS、大型变压器这些“大块头”电容性试品,能不能顺利“过关”,往往就看串联谐振装置顶不顶得住。…...

武汉国电华美串联谐振试验装置,现场用着心里有底

在高压试验现场干了这么多年,这位老师傅常说,一台好的串联谐振装置,就是试验人员的胆。面对GIS、大型变压器、超高压电缆这些大电容试品,没有趁手的谐振设备,交流耐压试验根本没法干。16875kVA/225kV这个规格&#xff…...

OmenSuperHub:释放惠普游戏本性能的纯净开源控制中心

OmenSuperHub:释放惠普游戏本性能的纯净开源控制中心 【免费下载链接】OmenSuperHub Control Omen laptop performance, fan speeds, and keyboard lighting, and unlock power limits. 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuperHub 还在为官方…...

收藏干货|2026 版企业 AI 落地实操指南,程序员小白入门避坑必备

如今人工智能早已脱离概念炒作阶段,全面扎根企业实际业务场景,成为技术从业者与企业管理者无法回避的发展课题。各行各业都加速布局AI赛道,行业心态也从初期观望试探,彻底转变为实打实的落地攻坚。 不少企业高层主动牵头统筹AI规划…...

浏览器指纹识别机制深度剖析与反识别技术实现

一、浏览器指纹技术基础认知1.1 浏览器指纹的核心定义在数字化时代,每一台接入互联网的设备都会留下独特的数字标识,浏览器指纹便是其中最关键的识别凭证之一。浏览器指纹是网站通过 JavaScript 脚本、HTTP 请求头、硬件接口调用等多种技术手段&#xff…...

Gazebo Sim多旋翼控制:四轴飞行器动力学建模与PID调参

Gazebo Sim多旋翼控制:四轴飞行器动力学建模与PID调参 【免费下载链接】gz-sim Open source robotics simulator. The latest version of Gazebo. 项目地址: https://gitcode.com/gh_mirrors/gz/gz-sim Gazebo Sim是一款功能强大的开源机器人模拟器&#xff…...

sngan_projection论文解读:ICLR2018两大GAN技术的完美结合

sngan_projection论文解读:ICLR2018两大GAN技术的完美结合 【免费下载链接】sngan_projection GANs with spectral normalization and projection discriminator 项目地址: https://gitcode.com/gh_mirrors/sn/sngan_projection sngan_projection是一个实现了…...

如何快速上手DeepPurpose?5分钟完成你的第一个药物-靶点相互作用预测模型

如何快速上手DeepPurpose?5分钟完成你的第一个药物-靶点相互作用预测模型 【免费下载链接】DeepPurpose A Deep Learning Toolkit for DTI, Drug Property, PPI, DDI, Protein Function Prediction (Bioinformatics) 项目地址: https://gitcode.com/gh_mirrors/de…...

终极Node.js Mock工具:Mockery入门到精通实战教程

终极Node.js Mock工具:Mockery入门到精通实战教程 【免费下载链接】mockery Simplifying the use of mocks with Node.js 项目地址: https://gitcode.com/gh_mirrors/mock/mockery Mockery是Node.js生态中简化Mock使用的终极工具,它为开发者提供了…...

Hindsight API参考:REST接口完整文档

Hindsight API参考:REST接口完整文档 【免费下载链接】hindsight Hindsight: Agent Memory That Learns 项目地址: https://gitcode.com/GitHub_Trending/hindsight2/hindsight Hindsight是一个强大的Agent Memory系统,提供了全面的REST API接口&…...

CUDA并行计算与FSR框架优化实践

1. CUDA并行计算与FSR框架概述在GPU加速计算领域,CUDA(Compute Unified Device Architecture)作为NVIDIA推出的并行计算平台和编程模型,已经成为高性能计算的事实标准。其核心设计理念是将计算任务分解为网格(Grid&…...

Claude SWOT分析(内部风控文档流出版):3类高危使用场景+2个监管红线预警

更多请点击: https://intelliparadigm.com 第一章:Claude SWOT分析(内部风控文档流出版):3类高危使用场景2个监管红线预警 高危使用场景识别 在企业级AI应用中,Claude模型若未经严格风控适配,…...

如何快速掌握Avidemux:新手完整入门指南与5个核心技巧

如何快速掌握Avidemux:新手完整入门指南与5个核心技巧 【免费下载链接】avidemux2 Avidemux2, simple video editor 项目地址: https://gitcode.com/gh_mirrors/avi/avidemux2 Avidemux是一款功能强大且完全开源的专业视频编辑工具,专为快速剪辑、…...

WTF Auto Layout? 实战:10个常见约束冲突案例解析与解决方案

WTF Auto Layout? 实战:10个常见约束冲突案例解析与解决方案 【免费下载链接】wtfautolayout The source code for Why The Failure, Auto Layout? 项目地址: https://gitcode.com/gh_mirrors/wt/wtfautolayout 在iOS开发中,Auto Layout是构建灵…...

Atomic Layout核心概念解析:Composition组件如何实现布局与间距分离的终极指南

Atomic Layout核心概念解析:Composition组件如何实现布局与间距分离的终极指南 【免费下载链接】atomic-layout Build declarative, responsive layouts in React using CSS Grid. 项目地址: https://gitcode.com/gh_mirrors/at/atomic-layout Atomic Layout…...

基于USB ACA模式实现安卓手机边玩边充的游戏手柄设计

1. 项目缘起:当手机性能过剩,却败给了触摸屏几年前,我清理手机游戏时,发现一个挺无奈的现象:性能足以媲美掌机的智能手机里,只剩下一些慢节奏的平台解谜或者数独。那些曾经让我在掌机上废寝忘食的赛车、动作…...

3分钟解锁网易云音乐NCM文件:ncmdumpGUI小白也能懂的完整教程

3分钟解锁网易云音乐NCM文件:ncmdumpGUI小白也能懂的完整教程 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换,Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 你是否曾经下载了网易云音乐的歌曲&a…...

Qri高级功能:如何使用JSON Schema验证和描述数据集结构

Qri高级功能:如何使用JSON Schema验证和描述数据集结构 【免费下载链接】qri youre invited to a data party! 项目地址: https://gitcode.com/gh_mirrors/qr/qri Qri是一个强大的开源数据协作工具,它提供了丰富的功能来帮助用户管理、共享和验证…...

Raspberry Pi Debug Probe:RP2040嵌入式开发的调试利器与实战指南

1. 项目概述:为什么你需要一个Raspberry Pi Debug Probe?如果你玩过树莓派Pico或者任何基于RP2040芯片的开发板,肯定遇到过这样的场景:写好的代码,点一下“上传”,然后……就没有然后了。板子上的LED没按你…...

基于Netburner NANO54415构建工业级嵌入式Web服务器:从硬件选型到广域监控实战

1. 项目概述:一个为广域与本地监控而生的嵌入式Web服务器如果你正在寻找一个能部署在野外、工厂角落或者任何需要远程数据采集与控制场景下的嵌入式Web服务器方案,并且对市面上那些要么性能孱弱、要么开发门槛极高的开发板感到厌倦,那么这个基…...

Jupyter Notebook里跑argparse脚本总报错?一个空列表参数搞定ipykernel_launcher.py error

Jupyter Notebook中argparse报错的终极解决方案:空列表参数实战解析在数据科学和机器学习的工作流中,Jupyter Notebook因其交互式特性成为众多研究者的首选工具。然而,当我们尝试在Notebook中运行那些原本为命令行设计的Python脚本时&#xf…...

开源ELM327 OBD-II适配器:从硬件设计到多协议固件实现全解析

1. 项目概述:开源ELM327 OBD适配器如果你对汽车诊断、数据监控或者嵌入式开发感兴趣,那么自己动手做一个OBD-II适配器绝对是个能让你学到很多东西的硬核项目。今天要聊的,就是一个完全开源的、基于NXP LPC1517微控制器的ELM327兼容OBD适配器。…...