藍牙翻頁筆(PPT 控制器)| 用Arduino玩轉ESP32與掌控板

衆所周知,掌控板在創客教育中用的非常廣泛,它是一塊基於 ESP32 的學習開發板。大家對掌控板編程,用的比較多的都是圖形化編程的方式,比如 mPython、Mind+ 等。但是,既然掌控板是基於 ESP32 芯片的,所以我們也可以用 Arduino 軟件對其編程。所以,有時間的話,我準備給大家分享一系列用 Arduino 代碼對掌控板(ESP32)編程的教程:用Arduino玩轉ESP32與掌控板系列

本系列歷史文章目錄:

在前面幾期中,有讀者反饋,因爲網絡原因,在 Arduino 軟件中配置 ESP32 和 ESP8266 開發環境,經常會失敗。所以這次我給大家帶來了已經配置好開發環境的 Arduino 綠色版軟件,解壓即用,可直達文末獲取下載地址。

本期給大家帶來的案例是:藍牙翻頁筆

封面

先來看一下演示視頻吧:

https://www.bilibili.com/video/av90824717/

前言

關於翻頁筆,其實我在之前就已經給大家分享過用好搭徽章板和 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,有了這些講解,模擬鍵盤控制電腦就很簡單了,我們來看一下藍牙翻頁筆的程序怎麼寫吧。

翻頁筆程序

完整程序

這裏先把完整程序放上來:

code

引入頭文件

我們現在程序開頭引入了幾個頭文件,控制 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() 函數裏面的數字,爲什麼是這些呢?我們來看一下掌控板的引腳定義圖。

掌控板引腳定義

先來看一下上圖中的“引腳定義正面”這張圖,我們看到觸摸引腳 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 系統爲例,其他系統類似。首先打開電腦的設置,找到添加藍牙設備頁面,點擊最上面的“+”號,準備添加藍牙設備。

打開藍牙設置

選擇“藍牙”,開始搜尋電腦附近的藍牙設備。
在這裏插入圖片描述

這個時候就會出現一個名稱爲“mPython”的藍牙設備,“mPython”是我們在程序中給掌控板起的名字,這個邊上有一個鍵盤的圖標,說明掌控板已經被電腦識別爲藍牙鍵盤了,選擇它與電腦進行配對連接即可。

選擇藍牙設備

連接成功後,我們就可以在藍牙設置頁面看到剛剛添加的藍牙鍵盤“mPython”了,再看一看它的電量,95%,跟程序裏設置的一模一樣!

在這裏插入圖片描述
這個時候,你就可以在電腦中打開一個 PPT,試試看你的翻頁筆好不好使了~

彩蛋

看到這裏的朋友,爲了感謝你,所以特意留了一個彩蛋。

相信好多朋友看到代碼就頭大,所以我給大家做了一個藍牙鍵盤的圖形庫,大家只要打開 Mind+ 軟件 v1.6.2 及以上的版本,在用戶庫中加入我的藍牙鍵盤庫,就可以開始藍牙鍵盤編程之旅啦。

藍牙鍵盤庫直達網址:https://gitee.com/ironpanda/ext-BLEKeyboard

這上面有這個藍牙鍵盤庫的使用教程和簡單案例。

將上述網址添加到 Mind+ 軟件用戶庫中,如下圖所示:

導入藍牙鍵盤庫

導入完成後,就可以在“用戶庫”分類中看到藍牙鍵盤庫相應的編程模塊了。

藍牙鍵盤庫

本文對應的藍牙鍵盤 Mind+ 圖形程序如下:

藍牙翻頁筆Mind程序

是不是很簡單?你會了麼?學會了的話,就點個“在看”吧~

代碼下載

歡迎關注公衆號:鐵熊玩創客,不定期更新創客製作、技術教程、創客教育等相關內容。

  • 回覆“藍牙翻頁筆”獲取完整代碼,包含 Arduino C 語言代碼和 Mind+ 圖形代碼;
  • 回覆“Arduino”獲取綠色版 Arduino 軟件下載地址,已爲您配置好掌控板 ESP32 和 ESP8266 開發環境
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章