本章我们将学习如是使用SparkFun Pro nRF52840 Mini 来快速构建一个HID设备蓝牙键盘。
在开始之前,说一句题外话。 不得不说这个nRF52840 的Arduino库实在是太好用了, 如果自己DIY的话,非常推荐购买这个芯片的单片机来DIY具有蓝牙功能的作品。
在上章节我们已经详细的介绍了如何使用SparkFun Pro nRF52840 Mini实现蓝牙数据的发送,那么本节我们看下如何基于上节的代码实现蓝牙键盘的功能
正文
本章提供的代码是一个演示使用nRF52840模块的HID键盘应用程序的示例。HID键盘在各种电子设备中广泛使用,从计算机到智能手机,为用户提供无缝的输入体验。
功能:
- 蓝牙连接: 代码建立了BLE连接,使Bluefruit52模块能够与其他蓝牙设备进行无线通信。
- HID键盘仿真: 通过HID功能,模块可以仿真标准键盘,从而向连接的设备发送按键信息。
- LED控制: 代码包括根据连接设备发送的命令来控制LED的功能,展示了双向通信的可能性。
实现:
-
设置:
- 代码初始化Bluefruit模块,并设置必要的BLE服务,包括设备信息服务(DIS)和HID。
- 它配置广告数据包以宣布HID键盘服务,并开始广告以进行设备发现。
- 连接间隔和功率设置经过优化,以实现性能和兼容性。
-
主循环:
- 循环检查来自串行监视器的键盘输入。当输入字符时,它将使用HID功能将其作为按键发送。
- 代码处理按键按下和释放,确保键盘行为正常。
-
回调:
接下来我将介绍如何实现上述涉及的功能
设置:
我们可以保留上节的大部分功能函数,仅仅需要在初始化蓝牙连接之后,初始化HID设备
上图为对比HID的初始化和没有HID的初始化。左侧为带HID设备的初始化,右侧为仅仅只有蓝牙功能的初始化。而实现这么多功能只需要引入bluefruit.h 库, bluefruit.h 内封装了我们所需的所有功能
主循环:
在程序的主循环中,程序会一直从串口检测是否有数据输入,如果有数据输入的话,则把数据的输入作为键盘的输入。并且发送的远程的蓝牙设备同时改变按键的按下状态,使其在下一次循环的时候释放这个按键并且等待下一次按下。
void loop()
{
// Only send KeyRelease if previously pressed to avoid sending
// multiple keyRelease reports (that consume memory and bandwidth)
if ( hasKeyPressed )
{
hasKeyPressed = false;
blehid.keyRelease();
// Delay a bit after a report
delay(5);
}
if (Serial.available())
{
char ch = (char) Serial.read();
// echo
Serial.write(ch);
blehid.keyPress(ch);
hasKeyPressed = true;
// Delay a bit after a report
delay(5);
}
}
回调
setKeyboardLedCallback function主要是用于蓝牙的状态显示,当蓝牙未连接的时候,LED会一直处于闪烁状态。当蓝牙连接成功之后LED将停止闪烁。
void set_keyboard_led(uint16_t conn_handle, uint8_t led_bitmap)
{
(void) conn_handle;
// light up Red Led if any bits is set
if ( led_bitmap )
{
ledOn( LED_RED );
}
else
{
ledOff( LED_RED );
}
}
接下来我们将程序烧录到开发板中,并且使用手机连接上这个蓝牙设备。 使用串口助手向开发板发送消息的同时观察手机上的响应
6月19日
源码文件: