c++ windows 蓝牙库_蓝牙翻页笔(PPT 控制器) | ESP32学习之旅-Arduino版
本系列歷史文章目錄:
- ESP32概述與Arduino軟件準(zhǔn)備
- 新冠肺炎疫情數(shù)據(jù)實(shí)時(shí)顯示器
- B 粉計(jì)數(shù)器
本期給大家?guī)淼陌咐?#xff1a;藍(lán)牙翻頁筆。
先來看一下演示視頻吧:
藍(lán)牙翻頁筆 | PPT播放控制器 | 藍(lán)牙鍵盤 | 用 Arduino 玩轉(zhuǎn)掌控板 ESP32 / ESP8266 | 圖形化編程 | 鐵熊出品_嗶哩嗶哩 (゜-゜)つロ 干杯~-bilibili?www.bilibili.com前言
關(guān)于翻頁筆,其實(shí)我在之前就已經(jīng)給大家分享過用好搭徽章板和 micro:bit 來實(shí)現(xiàn)翻頁筆的案例,大家可以跳轉(zhuǎn)下面的連接去查看:
萌寵體感翻頁筆DIY教程
這次要設(shè)計(jì)的翻頁筆,功能與之前做的類似,不同點(diǎn)在于:
- 主控板采用了ESP32掌控板,而且只要一塊板子就夠了,不需要兩塊板子配合;
- 程序采用了 Arduino 代碼方式,當(dāng)然在文末我也會(huì)提供圖形化代碼供參考;
- 連接方式變成了 BLE 無線藍(lán)牙,可以兼容 Mac、WIndows、iOS、Android 等。
下面開始進(jìn)入正題。
ESP32 藍(lán)牙鍵盤庫
編寫藍(lán)牙翻頁筆程序之前,我們先來了解一下 ESP32-BLE-Keyboard 這個(gè) Arduino 庫。我們編寫翻頁筆程序主要是借助這個(gè)庫來完成。這個(gè)庫的功能,主要是將 ESP32 模擬成藍(lán)牙鍵盤,然后向電腦發(fā)送按鍵命令,比如說我們翻頁筆中會(huì)用到的:F5 按鍵(控制 PPT 開始播放)、ESC 按鍵(控制 PPT 退出播放)、還有上、下翻頁按鍵 Pg Up 和 Pg Down(或者箭頭 ← 和 →)。
使用這個(gè)庫之前,首先我們要將這個(gè)庫導(dǎo)入 Arduino 軟件中,具體導(dǎo)入方法,這里不展開了,網(wǎng)上隨便搜一下就有。
我們打開這個(gè)庫的頭文件 BleKeyboard.h,可以對(duì)這個(gè)庫有一個(gè)大概的了解。這個(gè)庫里面主要有以下幾個(gè)功能模塊:
BleKeyboard 對(duì)象
BleKeyboard 用來聲明藍(lán)牙鍵盤對(duì)象,用在程序開頭,用來初始化設(shè)定藍(lán)牙鍵盤的名稱 deviceName 、鍵盤生產(chǎn)廠商 deviceManufacturer、鍵盤電量 batteryLevel。當(dāng)然你也可以不用設(shè)置,這個(gè)時(shí)候,程序就會(huì)用默認(rèn)值來對(duì)鍵盤進(jìn)行設(shè)置。
BleKeyboard(std::string deviceName = "ESP32 BLE Keyboard", std::string deviceManufacturer = "Espressif", uint8_t batteryLevel = 100);begin() 和 end() 函數(shù)
這兩個(gè)函數(shù)的定義如下:
void begin(void); void end(void);主要是用來啟動(dòng)與結(jié)束鍵盤的。
press() 函數(shù)
在頭文件定義中,press() 函數(shù)有兩個(gè):
size_t press(uint8_t k); size_t press(const MediaKeyReport k);這兩個(gè) press() 函數(shù),可以用來控制按下鍵盤上的所有按鍵,比如 0-9,A-Z,以及一些特殊的功能鍵等。
注意,這邊我寫的是按下鍵盤上的按鍵,表示并沒有松開,這樣的好處是,可以控制鍵盤發(fā)送一些組合鍵。區(qū)別在于前一個(gè)是用來控制普通按鍵的,后一個(gè)是用來控制媒體鍵(MediaKey)的。什么是媒體鍵呢?比如說控制音樂播放的上一首、下一首、暫停、控制音量的加減等,這些都是媒體鍵。
實(shí)際上我們?cè)谑褂脮r(shí)不用去區(qū)分,程序會(huì)根據(jù)我們輸入的按鍵,自動(dòng)去調(diào)用相應(yīng)的函數(shù)。
比如我們要按下鍵盤上的 A 鍵,只要調(diào)用 press(‘a(chǎn)’) 就可以了;如果我們要按下鍵盤上的 Ctrl 按鍵,只要調(diào)用 press(KEY_LEFT_CTRL) 就可以了。普通按鍵,類似 A-Z 或者 0-9,我們只要正常輸入就可以了,但是 Ctrl 這類特殊按鍵在程序中的對(duì)應(yīng)名稱是什么呢?在這個(gè)庫的頭文件 BleKeyboard.h中都有定義,讀者可以自行去查看,這里由于篇幅原因不再贅述。
release() 函數(shù)
release() 正好與 press() 函數(shù)相反,是用來控制松開鍵盤上的按鍵的,在定義中也有兩個(gè):
size_t release(uint8_t k); size_t release(const MediaKeyReport k);這兩個(gè)函數(shù)的區(qū)別不再贅述,press() 函數(shù)和 release() 一般組合起來使用,可以用在需用使用組合鍵的場(chǎng)合,比如需要使用 Ctrl + C 按鍵時(shí),可以先按下兩個(gè)按鍵,再松開這兩個(gè)按鍵。
releaseAll() 函數(shù)
從名字就可以看出,是 release() 函數(shù)的加強(qiáng)版,可以一次性松開所有按鍵。比如我們同時(shí)按下 Ctrl + Alt + Delete 按鍵,可以通過 releaseAll() 函數(shù),一次性松開 3 個(gè)按鍵。
write() 函數(shù)
write() 函數(shù)可以簡(jiǎn)單理解為 press() 函數(shù)和 release() 函數(shù)的相加,也就是先按下按鍵,再松開按鍵,這個(gè)過程自動(dòng)完成,適合用在發(fā)送單獨(dú)按鍵的場(chǎng)合。
size_t write(uint8_t c); size_t write(const MediaKeyReport c); size_t write(const uint8_t *buffer, size_t size);isConnected() 函數(shù)
這個(gè)函數(shù)用來判斷 ESP32 模擬的藍(lán)牙鍵盤,是否與電腦已經(jīng)配對(duì)連接。
print() 函數(shù)
除了以上這些函數(shù)之外,還有一個(gè) print() 函數(shù),這個(gè)函數(shù)是繼承自 Arduino 自帶的庫 Print 類的。
這個(gè)函數(shù)有什么用呢?試想一下,如果我們要一次性發(fā)送好幾個(gè)按鍵,比如電腦上輸入“Hello World!”這句話的時(shí)候,難道要調(diào)用好幾次 write() 函數(shù)來把這句話發(fā)送完成么?其實(shí)不是的,只要通過 print("Hello World!") 這一句話就夠了。
OK,有了這些講解,模擬鍵盤控制電腦就很簡(jiǎn)單了,我們來看一下藍(lán)牙翻頁筆的程序怎么寫吧。
翻頁筆程序
完整程序
這里先把完整程序放上來:
引入頭文件
我們現(xiàn)在程序開頭引入了幾個(gè)頭文件,控制 OLED 顯示屏的 U8g2lib 和 Wire 庫,模擬鍵盤的 BleKeyboard 庫:
#include <U8g2lib.h> #include <Wire.h> #include <BleKeyboard.h>然后定義了一個(gè)鍵盤對(duì)象 bleKeyboard。這里設(shè)置鍵盤的名稱為 mPython,鍵盤廠商為 Espressif,鍵盤電量為 95%。實(shí)際上這些設(shè)置都是隨意的,主要是鍵盤名稱,只要方便記憶就好了。
BleKeyboard bleKeyboard("mPython", "Espressif", 95);接著定義了一個(gè) OLED 屏對(duì)象 u8g2,OLED 屏幕的功能主要是提示我們控制 PPT 時(shí)按了哪個(gè)按鍵。這里需要根據(jù)你使用的 OLED 屏幕類型和連接方式來定義,先不展開講,后面有時(shí)間再專門講一講屏幕顯示的問題。掌控版自帶的 OLED 屏是通過 I2C 連接,只要通過下面的語句定義即可。
U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, U8X8_PIN_NONE);setup() 初始化
然后在 setup() 初始化中,初始化串口 Serial 方便后面可以打印調(diào)試信息;初始化 OLED 屏并進(jìn)行相應(yīng)的設(shè)置;初始化藍(lán)牙鍵盤。
void setup() {Serial.begin(115200);// OLED 初始化u8g2.begin();u8g2.enableUTF8Print();u8g2.setFont(u8g2_font_wqy16_t_gb2312b); // 設(shè)置字體:宋體16號(hào)字u8g2.setFontPosTop(); // 設(shè)置字體的定位點(diǎn)為左上角u8g2.clearDisplay();// 藍(lán)牙鍵盤初始化Serial.println("Starting BLE Keyboard!");bleKeyboard.begin(); }loop() 主程序
在 loop() 循環(huán)中,通過 bleKeyboard.isConnected() 來判斷我們的鍵盤有沒有與電腦連接上了,如果沒有連接,寫在這里面的程序是不會(huì)執(zhí)行的,只有在電腦上我們與這個(gè)藍(lán)牙鍵盤配對(duì)連接之后,里面的程序才會(huì)執(zhí)行。
void loop() {if (bleKeyboard.isConnected()) {// codes here ...} }下面的程序,用來讀取掌控版上的按鍵 A 和 B,以及觸摸按鍵 P、Y、T、H、O、N 的值,通過讀取他們的值,去判斷按鍵有沒有被按下觸發(fā)。
// 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 是數(shù)字信號(hào),而且默認(rèn)情況下高電平信號(hào),按下按鍵,通過 digitalRead() 函數(shù)會(huì)讀取到低電平。所以前面加了個(gè)非(!),方便后面判斷。
掌控板或 ESP32 自帶了幾個(gè)觸摸按鍵,所以系統(tǒng)也自帶了檢測(cè)觸摸按鍵的函數(shù) touchRead() ,觸摸按鍵讀取的值是一個(gè)模擬量。
至于這幾個(gè)按鍵的引腳編號(hào)為什么是這些呢?也就是 digitalRead() 和 touchRead() 函數(shù)里面的數(shù)字,為什么是這些呢?我們來看一下掌控板的引腳定義圖。
先來看一下上圖中的“引腳定義正面”這張圖,我們看到觸摸引腳 P 對(duì)飲的編號(hào)是 P23。再來看一下芯片引腳定義,P23 對(duì)應(yīng)的芯片引腳是 IO27。在 Arduino 程序中,我們實(shí)際上編寫的是芯片引腳,所以讀取觸摸引腳 P 的值時(shí),我們?cè)?touchRead() 函數(shù)中的數(shù)字是 27。其他幾個(gè)觸摸引腳對(duì)應(yīng)的芯片引腳 IO 口,讀者可以自己對(duì)應(yīng)查一下。
讀者也可以查詢掌控板的官方文檔,獲取掌控板引腳定義: https://mpython.readthedocs.io/zh/master/board/hardware.html如果使用的是其他 ESP32 開發(fā)板的話,也可以查詢相應(yīng)的官方產(chǎn)品資料,獲取對(duì)應(yīng)的引腳編號(hào)。
然后通過判斷按鍵 A 和 B 的值,控制 PPT 開始播放與結(jié)束播放。控制 PPT 播放,我們只要按 F5 鍵即可以,所以調(diào)用的程序是 bleKeyboard.write(KEY_F5);結(jié)束 PPT 播放,只要按 ESC 鍵即可以,所以調(diào)用的程序是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("結(jié)束播放");bleKeyboard.write(KEY_ESC);delay(500); }里面的 display() 函數(shù)后面再講,是用來控制掌控板的 OLED 顯示屏上顯示相應(yīng)的提示語的,比如“開始播放”、“結(jié)束播放”等。
同樣道理,我們可以通過檢測(cè)觸摸按鍵 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); }至此,主程序也講解完成了,邏輯是不是很簡(jiǎn)單,只要通過判斷掌控板上哪個(gè)按鍵被按下了,模擬鍵盤觸發(fā)相應(yīng)的按鍵行為就好了。
display() 函數(shù)
在程序中,我們還定義了另外一個(gè)函數(shù) display(String tipsOnScreen),它的功能是根據(jù)掌控板上的按鍵,用來控制 OLED 顯示相應(yīng)的內(nèi)容的,直接看代碼就行。
void display(String tipsOnScreen) {u8g2.firstPage();do{u8g2.clearDisplay();u8g2.setCursor(32, 24);u8g2.print(tipsOnScreen);} while (u8g2.nextPage()); }至此,程序講解完成,上傳到掌控板即可。
連接藍(lán)牙
上面我們通過編寫程序已經(jīng)將掌控板模擬成了藍(lán)牙鍵盤,接下來只要與電腦進(jìn)行配對(duì),就可以愉快的使用啦。
這里我以 Windows 10 系統(tǒng)為例,其他系統(tǒng)類似。首先打開電腦的設(shè)置,找到添加藍(lán)牙設(shè)備頁面,點(diǎn)擊最上面的“+”號(hào),準(zhǔn)備添加藍(lán)牙設(shè)備。
選擇“藍(lán)牙”,開始搜尋電腦附近的藍(lán)牙設(shè)備。
這個(gè)時(shí)候就會(huì)出現(xiàn)一個(gè)名稱為“mPython”的藍(lán)牙設(shè)備,“mPython”是我們?cè)诔绦蛑薪o掌控板起的名字,這個(gè)邊上有一個(gè)鍵盤的圖標(biāo),說明掌控板已經(jīng)被電腦識(shí)別為藍(lán)牙鍵盤了,選擇它與電腦進(jìn)行配對(duì)連接即可。
連接成功后,我們就可以在藍(lán)牙設(shè)置頁面看到剛剛添加的藍(lán)牙鍵盤“mPython”了,再看一看它的電量,95%,跟程序里設(shè)置的一模一樣!
這個(gè)時(shí)候,你就可以在電腦中打開一個(gè) PPT,試試看你的翻頁筆好不好使了~
彩蛋
看到這里的朋友,為了感謝你,所以特意留了一個(gè)彩蛋。
相信好多朋友看到代碼就頭大,所以我給大家做了一個(gè)藍(lán)牙鍵盤的圖形庫,大家只要打開 Mind+ 軟件 v1.6.2 及以上的版本,在用戶庫中加入我的藍(lán)牙鍵盤庫,就可以開始藍(lán)牙鍵盤編程之旅啦。
藍(lán)牙鍵盤庫直達(dá)網(wǎng)址:https://gitee.com/ironpanda/ext-BLEKeyboard
這上面有這個(gè)藍(lán)牙鍵盤庫的使用教程和簡(jiǎn)單案例。
將上述網(wǎng)址添加到 Mind+ 軟件用戶庫中,如下圖所示:
導(dǎo)入完成后,就可以在“用戶庫”分類中看到藍(lán)牙鍵盤庫相應(yīng)的編程模塊了。
本文對(duì)應(yīng)的藍(lán)牙鍵盤 Mind+ 圖形程序如下:
是不是很簡(jiǎn)單?你會(huì)了么?
代碼下載
關(guān)注本賬號(hào),獲取代碼下載地址。
總結(jié)
以上是生活随笔為你收集整理的c++ windows 蓝牙库_蓝牙翻页笔(PPT 控制器) | ESP32学习之旅-Arduino版的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql 备份 windows_win
- 下一篇: 字符串转16进制_16、atoi-整数字