简介
在上个帖子中https://forum.eepw.com.cn/thread/389300/1/#1我们使用ESP32-C3 Xiao 开发板搭建了一个Web服务。本章节将带着大家快速的使用ESP-IDF来实现一个蓝牙键盘。很多朋友可能会选择使用Arduino来实现,但是我昨天看了一圈并没有找到好的库。 和Demo,在网上找的代码不是这个库不兼容就是那个变量报错。 因此我就想为什么不用乐鑫家的ESP-IDF来快速搭建这个蓝牙键盘呢?于是经过我的一番操作便完成了这个蓝牙键盘。 用户可以自定义按键通过HID协议和蓝牙把数据发送到电脑或者收集等。
成品如下
上述的图片中已经集成了两个按键,分别接到了GPIO2 和 GPIO4上。需要注意的一点是这里不能使用DX或者AX来定义这个pin,因为IDF里已经定义好了是GPIO的PIN, 当然如果你愿意你可以自己自己定义一个宏来实现相同的操作。
上述两个按键分别用来实现键盘的上箭头和下箭头等操作。
实现步骤
1- 新建项目
首先需要保证VScode安装好了esp-idf环境,如果没有安装好环境的话,可以在插件商店里自行搜索安装。
在上述界面中找到高级,然后选择新建项目向导。输入项目的名称和选择连接到电脑的串口, 以及对应的芯片。由于这块板子使用的是ESP32-C3 主控,所以选择ESP32-C3- build-in USB-JTAG
之后选择从模板新建project
左上角修改为ESP-IDF,选中BLE-hid-device-demo
点击新建并且打开新的窗口
2- 工程配置
修改左下角的芯片为esp32-c3
之后我们便可以编译这个项目,并且把这个项目烧录到开发板里看一下默认的现象。
点击这个扳手进行编译。 当编译完成后可以点击旁边的小闪电图标进行烧录。当出现下图的时候即为编译成功。
之后我们进行烧录,选择UART的方式。
烧录成功。
此时我们电脑打开蓝牙,搜索蓝牙设备。
我们可以找到这个HID设备,点击配对。
此时我们可以发现,默认的代码行为是调整音量的大小。接下来我们来看下程序的行为。
通过上面的代码可以证明程序的行为正确。
3- 程序修改
那么我们可以创建一个自己的Task来实现这个键盘,帮我我们控制键盘的某个行为。
void keyboard_task(void *pvParameters) { while (1) { if (sec_conn) { ESP_LOGI(HID_DEMO_TAG, "Send key board"); if (debounce_button(GPIO_NUM_2)) { uint8_t key_vaule = {HID_KEY_UP_ARROW}; esp_hidd_send_keyboard_value(hid_conn_id, 0, &key_vaule, 1); uint8_t key_vaule2 = {HID_KEY_RESERVED}; esp_hidd_send_keyboard_value(hid_conn_id, 0, &key_vaule2, 1); } if (debounce_button(GPIO_NUM_4)) { uint8_t key_vaule = {HID_KEY_DOWN_ARROW}; esp_hidd_send_keyboard_value(hid_conn_id, 0, &key_vaule, 1); uint8_t key_vaule2 = {HID_KEY_RESERVED}; esp_hidd_send_keyboard_value(hid_conn_id, 0, &key_vaule2, 1); } } vTaskDelay(50 / portTICK_PERIOD_MS); } }
当然也不要忘了在创建这个task之前来初始化你的IO
我们来读取这两个PIN的状态来判断哪一个按键被按下了从而发送不同的数据。
需要注意的是,键盘的某个字母的发送实际上包含两个事件,一为键盘按下,另一个则为键盘松开。 所以在上述的代码中还有下面这两句用于发送松开的。
uint8_t key_vaule2 = {HID_KEY_RESERVED}; esp_hidd_send_keyboard_value(hid_conn_id, 0, &key_vaule2, 1);
之后我们将程序烧录到开发板同时连接到电脑进行测试。
此时我们便可以使用ESP32C3来发送键盘的上下所有来控制电脑了。
在上图的hid_dev.h中还定义了很多的键盘按键,大家可以根据自己的需要来进行自定义。
可以坐的离电脑远远的愉快的刷抖音了。
附件
附上工程,供大家学习研究。