本来记录了一篇 esp32-c3 如何安装micropython的文章,结果写这一篇的时候选择了编辑而不是新建,等点击保存的时候才想起来-_-!!有缘再续吧,记录一下模拟蓝牙鼠标的过程,在两台红米手机上测试通过:
- 红米turbo4
- 红米note9 4g
获取 MicroPythonBLEHID 库
访问 https://github.com/heerkog/MicroPythonBLEHID下载 ZIP 包并解压
使用 ampy 上传
ampy 这是最常见的技术工具,由 Adafruit 公司开发。它是一个命令行工具,专门用来通过串口与MicroPython或CircuitPython开发板(如ESP32、Raspberry Pi Pico等)进行交互。
# 安装 ampy
pip install adafruit-ampy
# 上传核心库
ampy --port /dev/ttyUSB0 put hid_services.py
# 上传示例代码
ampy --port /dev/ttyUSB0 put examples/simple/mouse_example.py main.py测试程序
# main.py - 适用于 ESP32-C3 SuperMini 的修正版蓝牙鼠标
from hid_services import Mouse
import bluetooth
import time
import struct
# --- 1. 创建鼠标对象 ---
mouse = Mouse("ESP32-C3 Mouse") # 这里的名字可以随意改,连接时看到的就是它
mouse.start()
# 等一下,让库内部的服务初始化完成
time.sleep(1)
# --- 2. 获取底层的 BLE 对象并手动启动广播 ---
ble = bluetooth.BLE()
# 构建广播数据包 (Advertising Data)
# 这部分数据告诉周围的设备,我们是一个鼠标。
# 020106 : 标志位,表示这是一台可被发现的 BLE 设备
# 0B09 : 后面跟着一个长度为 11 字节的设备名
# 然后跟上你的设备名 "ESP32-C3 Mouse"
device_name = "ESP32-C3 Mouse"
name_bytes = device_name.encode()
adv_data = bytearray([0x02, 0x01, 0x06]) # Flags
adv_data.append(len(name_bytes) + 1) # 设备名长度+1
adv_data.append(0x09) # 设备名类型
adv_data.extend(name_bytes) # 设备名字节
# 强制启动广播,持续广播 (间隔 100 毫秒)
ble.gap_advertise(100, adv_data=adv_data)
print("=== 蓝牙鼠标已启动 ===")
print("请在你的电脑/手机蓝牙设置中搜索并连接:", device_name)
print("等待连接...\n")
# --- 3. 主循环:等待连接并发送数据 ---
last_connected = False
while True:
# 检查鼠标对象是否已连接
if mouse.is_connected():
if not last_connected:
print("\n>>> 设备已连接!开始移动鼠标... <<<\n")
last_connected = True
# 发送鼠标移动数据: (X偏移, Y偏移, 按键状态)
# 注意:这里是相对移动,-127到127之间的值
# 向右移动 10 个单位
mouse.set_axes(10, 0)
mouse.notify_hid_report()
time.sleep(0.5)
# 向下移动 10 个单位
mouse.set_axes(0, 10)
mouse.notify_hid_report()
time.sleep(0.5)
# 向左移动 10 个单位
mouse.set_axes(-10, 0)
mouse.notify_hid_report()
time.sleep(0.5)
# 向上移动 10 个单位
mouse.set_axes(0, -10)
mouse.notify_hid_report()
time.sleep(0.5)
else:
if last_connected:
print(">>> 设备已断开,正在等待重新连接... <<<")
last_connected = False
# 如果未连接,每2秒打印一次状态,避免你干等
print("未连接,等待中...")
time.sleep(2)体验
同有线连接相比,同样的程序参数跑在蓝牙上,相对坐标的定位准确率感觉低了不少,联想到使用有线手柄与蓝牙手柄时微秒的操作手感差异。个人结论是稳定性不如有线连接,但免插拔的优势以及可持续性(手机的口空出来可以连接充电器)还是挺吸引人的。

