c++ windows 蓝牙库_蓝牙翻页笔(PPT 控制器) | ESP32学习之旅-Arduino版

dcf84cd60e7d274b6965ceb9782438f0.png

6ac2781c388906f790e8c99e41830c99.png

本系列历史文章目录:

  • ESP32概述与Arduino软件准备
  • 新冠肺炎疫情数据实时显示器
  • B 粉计数器

本期给大家带来的案例是:蓝牙翻页笔

98e3e056e7ea72e5d4b082d4ed9ad710.png

先来看一下演示视频吧:

蓝牙翻页笔 | PPT播放控制器 | 蓝牙键盘 | 用 Arduino 玩转掌控板 ESP32 / ESP8266 | 图形化编程 | 铁熊出品_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili​www.bilibili.com
fdda2bb91957614ea9b894b799df6c87.png

前言

关于翻页笔,其实我在之前就已经给大家分享过用好搭徽章板和 micro:bit 来实现翻页笔的案例,大家可以跳转下面的连接去查看:

萌宠体感翻页笔DIY教程

这次要设计的翻页笔,功能与之前做的类似,不同点在于:

  • 主控板采用了ESP32掌控板,而且只要一块板子就够了,不需要两块板子配合;
  • 程序采用了 Arduino 代码方式,当然在文末我也会提供图形化代码供参考;
  • 连接方式变成了 BLE 无线蓝牙,可以兼容 Mac、WIndows、iOS、Android 等。

下面开始进入正题。

ESP32 蓝牙键盘库

编写蓝牙翻页笔程序之前,我们先来了解一下 ESP32-BLE-Keyboard 这个 Arduino 库。我们编写翻页笔程序主要是借助这个库来完成。这个库的功能,主要是将 ESP32 模拟成蓝牙键盘,然后向电脑发送按键命令,比如说我们翻页笔中会用到的:F5 按键(控制 PPT 开始播放)、ESC 按键(控制 PPT 退出播放)、还有上、下翻页按键 Pg Up 和 Pg Down(或者箭头 ← 和 →)。

使用这个库之前,首先我们要将这个库导入 Arduino 软件中,具体导入方法,这里不展开了,网上随便搜一下就有。

我们打开这个库的头文件 BleKeyboard.h,可以对这个库有一个大概的了解。这个库里面主要有以下几个功能模块:

BleKeyboard 对象

BleKeyboard 用来声明蓝牙键盘对象,用在程序开头,用来初始化设定蓝牙键盘的名称 deviceName 、键盘生产厂商 deviceManufacturer、键盘电量 batteryLevel。当然你也可以不用设置,这个时候,程序就会用默认值来对键盘进行设置。

BleKeyboard(std::string deviceName = "ESP32 BLE Keyboard", std::string deviceManufacturer = "Espressif", uint8_t batteryLevel = 100);

begin() 和 end() 函数

这两个函数的定义如下:

void begin(void);
void end(void);

主要是用来启动与结束键盘的。

press() 函数

在头文件定义中,press() 函数有两个:

size_t press(uint8_t k);
size_t press(const MediaKeyReport k);

这两个 press() 函数,可以用来控制按下键盘上的所有按键,比如 0-9,A-Z,以及一些特殊的功能键等。

注意,这边我写的是按下键盘上的按键,表示并没有松开,这样的好处是,可以控制键盘发送一些组合键。

区别在于前一个是用来控制普通按键的,后一个是用来控制媒体键(MediaKey)的。什么是媒体键呢?比如说控制音乐播放的上一首、下一首、暂停、控制音量的加减等,这些都是媒体键。

实际上我们在使用时不用去区分,程序会根据我们输入的按键,自动去调用相应的函数。

比如我们要按下键盘上的 A 键,只要调用 press(‘a’) 就可以了;如果我们要按下键盘上的 Ctrl 按键,只要调用 press(KEY_LEFT_CTRL) 就可以了。普通按键,类似 A-Z 或者 0-9,我们只要正常输入就可以了,但是 Ctrl 这类特殊按键在程序中的对应名称是什么呢?在这个库的头文件 BleKeyboard.h中都有定义,读者可以自行去查看,这里由于篇幅原因不再赘述。

release() 函数

release() 正好与 press() 函数相反,是用来控制松开键盘上的按键的,在定义中也有两个:

size_t release(uint8_t k);
size_t release(const MediaKeyReport k);

这两个函数的区别不再赘述,press() 函数和 release() 一般组合起来使用,可以用在需用使用组合键的场合,比如需要使用 Ctrl + C 按键时,可以先按下两个按键,再松开这两个按键。

releaseAll() 函数

从名字就可以看出,是 release() 函数的加强版,可以一次性松开所有按键。比如我们同时按下 Ctrl + Alt + Delete 按键,可以通过 releaseAll() 函数,一次性松开 3 个按键。

write() 函数

write() 函数可以简单理解为 press() 函数和 release() 函数的相加,也就是先按下按键,再松开按键,这个过程自动完成,适合用在发送单独按键的场合。

size_t write(uint8_t c);
size_t write(const MediaKeyReport c);
size_t write(const uint8_t *buffer, size_t size);

isConnected() 函数

这个函数用来判断 ESP32 模拟的蓝牙键盘,是否与电脑已经配对连接。

print() 函数

除了以上这些函数之外,还有一个 print() 函数,这个函数是继承自 Arduino 自带的库 Print 类的。

这个函数有什么用呢?试想一下,如果我们要一次性发送好几个按键,比如电脑上输入“Hello World!”这句话的时候,难道要调用好几次 write() 函数来把这句话发送完成么?其实不是的,只要通过 print("Hello World!") 这一句话就够了。

OK,有了这些讲解,模拟键盘控制电脑就很简单了,我们来看一下蓝牙翻页笔的程序怎么写吧。

翻页笔程序

完整程序

这里先把完整程序放上来:

19bad4cf7eabb89650fbe96c19fd4b74.png

引入头文件

我们现在程序开头引入了几个头文件,控制 OLED 显示屏的 U8g2lib 和 Wire 库,模拟键盘的 BleKeyboard 库:

#include <U8g2lib.h>
#include <Wire.h>
#include <BleKeyboard.h>

然后定义了一个键盘对象 bleKeyboard。这里设置键盘的名称为 mPython,键盘厂商为 Espressif,键盘电量为 95%。实际上这些设置都是随意的,主要是键盘名称,只要方便记忆就好了。

BleKeyboard bleKeyboard("mPython", "Espressif", 95);

接着定义了一个 OLED 屏对象 u8g2,OLED 屏幕的功能主要是提示我们控制 PPT 时按了哪个按键。这里需要根据你使用的 OLED 屏幕类型和连接方式来定义,先不展开讲,后面有时间再专门讲一讲屏幕显示的问题。掌控版自带的 OLED 屏是通过 I2C 连接,只要通过下面的语句定义即可。

U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, U8X8_PIN_NONE);

setup() 初始化

然后在 setup() 初始化中,初始化串口 Serial 方便后面可以打印调试信息;初始化 OLED 屏并进行相应的设置;初始化蓝牙键盘。

void setup() {Serial.begin(115200);// OLED 初始化u8g2.begin();u8g2.enableUTF8Print();u8g2.setFont(u8g2_font_wqy16_t_gb2312b);  // 设置字体:宋体16号字u8g2.setFontPosTop();  // 设置字体的定位点为左上角u8g2.clearDisplay();// 蓝牙键盘初始化Serial.println("Starting BLE Keyboard!");bleKeyboard.begin();
}

loop() 主程序

在 loop() 循环中,通过 bleKeyboard.isConnected() 来判断我们的键盘有没有与电脑连接上了,如果没有连接,写在这里面的程序是不会执行的,只有在电脑上我们与这个蓝牙键盘配对连接之后,里面的程序才会执行。

void loop() {if (bleKeyboard.isConnected()) {// codes here ...}
}

下面的程序,用来读取掌控版上的按键 A 和 B,以及触摸按键 P、Y、T、H、O、N 的值,通过读取他们的值,去判断按键有没有被按下触发。

// button A and B
int buttonA = !digitalRead(0);
int buttonB = !digitalRead(2);// touchpad P Y T H O N
int touchpadP = touchRead(27);
int touchpadY = touchRead(14);
int touchpadT = touchRead(12);
int touchpadH = touchRead(13);
int touchpadO = touchRead(15);
int touchpadN = touchRead(4);

掌控板上的按键 A 和 B 是数字信号,而且默认情况下高电平信号,按下按键,通过 digitalRead() 函数会读取到低电平。所以前面加了个非(!),方便后面判断。

掌控板或 ESP32 自带了几个触摸按键,所以系统也自带了检测触摸按键的函数 touchRead() ,触摸按键读取的值是一个模拟量。

至于这几个按键的引脚编号为什么是这些呢?也就是 digitalRead() 和 touchRead() 函数里面的数字,为什么是这些呢?我们来看一下掌控板的引脚定义图。

51689f0e8ae7bc33d4d6821fe5ab3071.png

先来看一下上图中的“引脚定义正面”这张图,我们看到触摸引脚 P 对饮的编号是 P23。再来看一下芯片引脚定义,P23 对应的芯片引脚是 IO27。在 Arduino 程序中,我们实际上编写的是芯片引脚,所以读取触摸引脚 P 的值时,我们在 touchRead() 函数中的数字是 27。其他几个触摸引脚对应的芯片引脚 IO 口,读者可以自己对应查一下。

读者也可以查询掌控板的官方文档,获取掌控板引脚定义: https://mpython.readthedocs.io/zh/master/board/hardware.html
如果使用的是其他 ESP32 开发板的话,也可以查询相应的官方产品资料,获取对应的引脚编号。

然后通过判断按键 A 和 B 的值,控制 PPT 开始播放与结束播放。控制 PPT 播放,我们只要按 F5 键即可以,所以调用的程序是 bleKeyboard.write(KEY_F5);结束 PPT 播放,只要按 ESC 键即可以,所以调用的程序是bleKeyboard.write(KEY_ESC)。注意,由于是程序控制键盘,所以加了 delay(500) 程序,以防止按键按得太快。

// Start PPT
if (buttonA) {Serial.println("Button A pressed!");Serial.println("Sending key: F5 (start PPT");display("开始播放");bleKeyboard.write(KEY_F5);delay(500);
}// Quit PPT
if (buttonB) {Serial.println("Button B pressed!");Serial.println("Sending key: ESC (quit PPT)");display("结束播放");bleKeyboard.write(KEY_ESC);delay(500);
}

里面的 display() 函数后面再讲,是用来控制掌控板的 OLED 显示屏上显示相应的提示语的,比如“开始播放”、“结束播放”等。

同样道理,我们可以通过检测触摸按键 P 和 N 的值,来控制 PPT 播放上一页和下一页,这里分别用 bleKeyboard.write(KEY_LEFT_ARROW)bleKeyboard.write(KEY_RIGHT_ARROW) 来控制。

// Previous page
if (touchpadP < 20 && touchpadP > 0) {Serial.println("Touchpad P touched!");Serial.println("Sending key: <-- (previous page)");display("上一页");bleKeyboard.write(KEY_LEFT_ARROW);delay(500);
}// Next page
if (touchpadN < 20 && touchpadN > 0) {Serial.println("Touchpad N touched!");Serial.println("Sending key: --> (next page)");display("下一页");bleKeyboard.write(KEY_RIGHT_ARROW);delay(500);
}

至此,主程序也讲解完成了,逻辑是不是很简单,只要通过判断掌控板上哪个按键被按下了,模拟键盘触发相应的按键行为就好了。

display() 函数

在程序中,我们还定义了另外一个函数 display(String tipsOnScreen),它的功能是根据掌控板上的按键,用来控制 OLED 显示相应的内容的,直接看代码就行。

void display(String tipsOnScreen)
{u8g2.firstPage();do{u8g2.clearDisplay();u8g2.setCursor(32, 24);u8g2.print(tipsOnScreen);} while (u8g2.nextPage());
}

至此,程序讲解完成,上传到掌控板即可。

连接蓝牙

上面我们通过编写程序已经将掌控板模拟成了蓝牙键盘,接下来只要与电脑进行配对,就可以愉快的使用啦。

这里我以 Windows 10 系统为例,其他系统类似。首先打开电脑的设置,找到添加蓝牙设备页面,点击最上面的“+”号,准备添加蓝牙设备。

695ab8edac2d8c93317e4401e8d39d11.png

选择“蓝牙”,开始搜寻电脑附近的蓝牙设备。

1fdf223e4f0c62ba0bdf79765394bba0.png

这个时候就会出现一个名称为“mPython”的蓝牙设备,“mPython”是我们在程序中给掌控板起的名字,这个边上有一个键盘的图标,说明掌控板已经被电脑识别为蓝牙键盘了,选择它与电脑进行配对连接即可。

d1af96f43012cb3090d93e4e030420a5.png

连接成功后,我们就可以在蓝牙设置页面看到刚刚添加的蓝牙键盘“mPython”了,再看一看它的电量,95%,跟程序里设置的一模一样!

1fcdd5e3463ec9eb19532293214d8e96.png

这个时候,你就可以在电脑中打开一个 PPT,试试看你的翻页笔好不好使了~

彩蛋

看到这里的朋友,为了感谢你,所以特意留了一个彩蛋。

相信好多朋友看到代码就头大,所以我给大家做了一个蓝牙键盘的图形库,大家只要打开 Mind+ 软件 v1.6.2 及以上的版本,在用户库中加入我的蓝牙键盘库,就可以开始蓝牙键盘编程之旅啦。

蓝牙键盘库直达网址:https://gitee.com/ironpanda/ext-BLEKeyboard

这上面有这个蓝牙键盘库的使用教程和简单案例。

将上述网址添加到 Mind+ 软件用户库中,如下图所示:

8ba70ecec6e398aa873f0990fb9baf01.png

导入完成后,就可以在“用户库”分类中看到蓝牙键盘库相应的编程模块了。

f6088b12848f5ce79680b2f10db43a2a.png

本文对应的蓝牙键盘 Mind+ 图形程序如下:

24f4051db929fa6ab32734417e348eee.png

是不是很简单?你会了么?

代码下载

关注本账号,获取代码下载地址。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/563419.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python 程序运行在阿里云主机_阿里云主机Access key利用工具

简介&#xff08;Gamma实验室核心成员&#xff1a;一灯老和尚所写&#xff09;在日常渗透过程中我们经常遇到信息泄露出ALIYUN_ACCESSKEYID与ALIYUN_ACCESSKEYSECRET&#xff08;阿里云API key&#xff09;&#xff0c;特别是laravel框架得debug信息。APP中也会泄露这些信息&am…

一张纸厚度是多少毫米_一张纸的威力有多大?纸折103次捅破宇宙,理论荒诞却无法反驳...

【图文摘自网络&#xff0c;如有侵权请联系删除】人类达到月球需要多久时间&#xff1f;地球和月亮的距离不是一成不变的&#xff0c;它有着近地点和远地点&#xff0c;地球里月球最远的距离在363300千米&#xff0c;最远为405500千米。而当年阿波罗号由火箭发射到登陆月球表面…

oracle 两表两列数据对比_Oracle、PostgreSQL与Mysql数据写入性能对比

最近因为工作需要&#xff0c;需要对Oracle和Mysql写入性能进行对比&#xff0c;以前都是听说Mysql性能比Oracle不是一个级别&#xff0c;现在亲测后&#xff0c;不比不知道&#xff0c;一比吓一跳。。。追加PostgreSql性能测试数据测试场景本地电脑(单机)&#xff0c;通过程序…

锐驰机器人的市场_【年终盘点】2020年,锐驰的王炸新品!

点击蓝字关注我哦辛苦付出、苦熬实干&#xff0c;换来了硕果累累、丰收成片。回首2020年&#xff0c;锐驰秉承着锐意进取、快速创新的理念&#xff0c;在自动化道路上不断探索&#xff0c;推出了多款智能自动化机器&#xff0c;现在着重介绍以下3款&#xff1a;异型插件机器人、…

学生管理系统c#语言代码,基于C#语言的学生管理系统的设计(ASP.NET2.0)

摘 要随着科学技术的不断提高,计算机科学日渐成熟,其强大的功能已为人们深刻认识,它已进入人类社会的各个领域并发挥着越来越重要的作用。学生管理系统是学校管理中不可少的一部分。而基于B/S架构的学生管理系统是方便学校管理&#xff0c;实行电子办公的必要组成部分&#xf…

异常信息_一个针对异常信息通知的springboot starter

前言作为后端开发者&#xff0c;项目上线之后难免会遇到各种问题&#xff0c;一个良好且及时的异常通知机制可以让我们在项目的维护上避免很多不必要的麻烦。本项目的开发愿景是为了给使用者在线上项目的问题排查方面能够带来帮助&#xff0c;简单配置&#xff0c;做到真正的开…

2使用教学_建水三中智能交互式液晶一体机设备投入使用

“张老师&#xff0c;一体机的使用会了吗&#xff1f;”“一体机在教学中好用吗&#xff1f;”“告别多年粉笔加黑板的教学方式&#xff0c;不用再吸入粉笔灰了。”2月25日清晨&#xff0c;建水三中的老师们议论纷纷&#xff0c;大家关注的是如何操作使用教室里安装的一体机。建…

数据结构折半查找算法C语言,数据结构C语言实现----折半查找

运行结果&#xff1a;代码如下&#xff1a;#include//数组初始化函数void Array_get(int array[],int max){printf("请输入一个数组&#xff0c;大小从低到高&#xff0c;各个数字间以空格隔开&#xff1a;");for (size_t i 0; i < max; i){scanf("%d"…

生活中的算法的实际举例_驾校学的技术,在实际生活中,你能运用自如吗?

学驾照的过程不用说&#xff0c;每一个经历过的人都有着刻骨铭心的记忆。很多人认为自己流了很多汗水&#xff0c;付出了很多精力在练车场上摸爬滚打&#xff0c;这下肯定把驾驶技术给夯实了&#xff0c;以后开车上路一点问题也没有。但是事情真的是这样吗&#xff0c;驾校学的…

470p 更换固态硬盘_联想G510换固态硬盘遇到的问题

唉&#xff01;更正一下吧&#xff01;电脑识别光驱位机械硬盘没有成功&#xff0c;出现了新问题&#xff0c;偶尔能识别出来&#xff0c;通常情况下不能识别出来&#xff0c;正在寻找解决办法中.........现在对于刚发表的这篇文章&#xff0c;有点惭愧&#xff01;二更&#x…

linux指针赋值原子,x86_64处理器的指针赋值是原子操作吗?

如题&#xff0c; x86_64处理器的指针赋值是原子操作吗&#xff1f;说实话我很讨厌参与讨论那些似乎不确定东西&#xff0c;倒不是说我对未知不敬畏&#xff0c;而是参与讨论的人大多数都是似懂非懂&#xff0c;对&#xff0c;我说的不确定性指的是参与讨论的人的认知的不确定&…

tecplot批量导出图片_批量导出Excel图片,用这招,半分钟干的活别人一整天完不成...

上个星期&#xff0c;我的一个同学向我求助。她是公司的HR&#xff0c;老板让她把员工信息表中的照片导出到文件夹中&#xff0c;然后打包发送给行政部的文员打印出来。她公司有5000多人&#xff0c;她复制粘贴了整整一个上午&#xff0c;才导出了200多张照片&#xff0c;而且还…

填充table_Excel Power Query | 向下填充的逆过程

上期内容给大家讲解了关于图表精品图表 | Excel绘制“带有阈值分割的条形图和棒棒图”的制作方法。本期给大家讲解一下关于Power Query的知识 。如下图&#xff0c;将下面的数据向下填充逆过程。即将左侧的数据转换至右侧的数据。如果是从右往左的话是直接向下填充即可&#xf…

# 解析bt文件_磁力链接和BT种子使用方法

目前用的最多的是磁力链接和BT种子&#xff0c;不过好多人并不太会使用&#xff0c;因此写个教程给大家说明一下。何为磁力链接&#xff1a;简单地说&#xff0c;磁力链接是一种特殊链接&#xff0c;但是它与传统基于文件的位置或名称的普通链接(如http://xxx)不一样&#xff0…

easyexcel设置下拉选项不能覆盖_Wi-Fi经常掉线 这个设置要修改

在使用Wi-Fi的时候最大的问题是什么&#xff1f;小伙伴们肯定说&#xff0c;当然是掉线啦。Wi-Fi设备过多、路由器设置等问题造成的掉线断网问题咱们之前都说过了。有些小伙伴又反映自己的电脑在使用无线网络时&#xff0c;一段时间不用就会掉线&#xff0c;手机却一直连接很好…

google开源android工具,谷歌最强Android UI工具包霸榜Github,这份上手指南了解一下...

2019年&#xff0c;谷歌在I/O大会上公开开源了一个非捆绑工具包——Jetpack Compose&#xff0c;这是一个用于构建原生Android UI的现代化工具包。仅通过少量代码就能完成布局&#xff0c;且能够直接使用Kotlin来进行编写。Jetpack Compose工具包是围绕着composable函数来构建的…

重叠面积_重叠面积——动点产生的重叠面积问题

本文开始介绍重叠面积问题。顾名思义&#xff0c;此类问题主要是求两个几何图形的重叠部分的面积。解题的关键为画出图形&#xff0c;然后再表示面积。文中的中考真题选自以下地区&#xff1a;2019•资阳、2019•鸡西、2019黄冈【题1】(2019•资阳)在矩形ABCD中&#xff0c;连结…

鸿蒙os硬件要求,华为公布鸿蒙OS 2.0硬件安装要求:只要128K内存就能跑

9月10日下午&#xff0c;华为在东莞松山湖举办了2020开发者大会&#xff0c;鸿蒙OS 2.0正式发布。会后&#xff0c;华为软件部总裁王成录博士、华为软件部副总裁杨海松等接受了专访。谈及鸿蒙OS 2.0的规划&#xff0c;杨海松表示&#xff0c;大家非常期待的手机的Beta版本会在今…

android rtsp 延时,ijkplayer 单视频流直播延迟问题解决过程

一开始我尝试是通过设置ijkplayer的参数去修改延迟&#xff0c;参数的修改能把ijkplayer的开播延迟拉到200ms左右&#xff0c;但是随着播放时间增加延迟也在增加&#xff0c;然后带着问题去网上寻找答案&#xff0c;找到暴走大牙和Gongjia两位大神的解决方案&#xff0c;但是这…

html5svg在线编辑器,SVG to Canvas在线转换工具

https://github.com/samsha/svg2canvascanvg.js是的确实有人在做这样的事&#xff0c;canvg.js 就是一个将SVG转换成Canvas的工具库&#xff0c;甚至有些SVG的动画效果也能得到实现&#xff0c;但是canvg.js存在很多问题&#xff1a;不可避免的SVG兼容问题SVG是一种很复杂的矢量…